Verilog:Always语句,3位变量在正边缘触发

Verilog:Always语句,3位变量在正边缘触发,verilog,Verilog,我的项目是使用一个CPDL,我正在用verilog编程来为无刷直流电动机换向。该过程的一部分是读入霍尔传感器A、B、C 我想计算A、B或C上正边的数量。我有一个3位变量[2:0]hallIn来存储这些输入。下面的代码在modelsim模拟中工作,但在实际芯片上不工作。怎么会?正确的方法是什么?我得到的错误消息是:73:12:73:55 |不能将posedge/negedge使用与普通信号引用混合使用 always @ (posedge hallIn[2] or hallIn[1] or hall

我的项目是使用一个CPDL,我正在用verilog编程来为无刷直流电动机换向。该过程的一部分是读入霍尔传感器A、B、C

我想计算A、B或C上正边的数量。我有一个3位变量[2:0]hallIn来存储这些输入。下面的代码在modelsim模拟中工作,但在实际芯片上不工作。怎么会?正确的方法是什么?我得到的错误消息是:73:12:73:55 |不能将posedge/negedge使用与普通信号引用混合使用

always @ (posedge hallIn[2] or hallIn[1] or hallIn[0])

合成代码是Verilog允许您执行的操作的子集。可合成代码需要一个可映射到逻辑单元的编码结构。不可合成的代码用于行为建模和测试台

触发器通常应由一个公共时钟源同步;不是数据。使用时钟,您可以通过将输入的当前值与之前的值进行比较来检测posedge数据

例如:

assign posedge_detected = |(hallIn & ~prev_hallIn);

always @(posedge clock) begin
  if (reset) begin
    prev_hallIn <= 3'b000;
    count <= 16'h0000;
  end
  else begin
    prev_hallIn <= hallIn;
    count <= count + posedge_detected;
    end
  end
end
assign posedge_detected=|(hallIn&~prev_hallIn);
始终@(posedge时钟)开始
如果(重置)开始

prev_hallIn这不是一个Verilog编程问题,而是如何进行硬件设计的问题。尝试询问。您的块仅由位[2]的正边触发,实际上由位[1]和[0]的两条边(更改)触发。我怀疑它在modelsim中是否正确工作。您可能没有做足够的测试。