Verilog总是阻止触发器行为异常

Verilog总是阻止触发器行为异常,verilog,Verilog,我有一个始终块,包括一个开关和一把钥匙。当我只有敏感度列表中的键时,它表现良好(只执行代码一次,然后退出块)。当我将开关添加到灵敏度列表时,它会变得疯狂,并且在我按下键时似乎会无限循环,即使我只在按下键的下边缘触发它 我试图实现一个计数器,每次按键只增加一次 以下是灵敏度列表中只有按键的工作代码(sw[1]用于指示是向上计数还是向下计数): 这是中断的代码(我使用sw[7]在计数器打开时重置计数器。此代码在按下键[2]时无限循环) 我认为当敏感度列表中的信号发生变化时,always块中的代码只执

我有一个始终块,包括一个开关和一把钥匙。当我只有敏感度列表中的键时,它表现良好(只执行代码一次,然后退出块)。当我将开关添加到灵敏度列表时,它会变得疯狂,并且在我按下键时似乎会无限循环,即使我只在按下键的下边缘触发它

我试图实现一个计数器,每次按键只增加一次

以下是灵敏度列表中只有按键的工作代码(sw[1]用于指示是向上计数还是向下计数):

这是中断的代码(我使用sw[7]在计数器打开时重置计数器。此代码在按下键[2]时无限循环)

我认为当敏感度列表中的信号发生变化时,always块中的代码只执行一次,但显然不是这样

你知道我如何让这个代码在每次按键时只执行一次,这样计数器就能正常工作吗


谢谢

我假设在FPGA上运行时可以看到问题;纯粹的模拟看起来不错。合成工具假设第一个
if
是异步逻辑,而
else
条件被视为同步逻辑,因为这是正确的编码样式。在提供的代码中,第一个条件是
if(~key[2])
,这意味着合成工具将
negedge key[2]
视为活动低异步逻辑。从重置条件
if(sw[7])
开始,您应该会得到所需的结果

always @ (negedge key[2] or posedge sw[7]) begin
  if (sw[7]) begin
    p3ctr <= 0;
  end
  else begin
    if (sw[1] == 0) begin
      if (p3ctr == 15) p3ctr <= 0;
      else p3ctr <= p3ctr + 1;
    end
    else if (sw[1] == 1) begin
      if (p3ctr == 0) p3ctr <= 15;
      else p3ctr <= p3ctr - 1;
    end
  end
end
始终@(negedge键[2]或posedge开关[7])开始
如果(sw[7])开始
你说的“发疯”到底是什么意思?模拟中也会发生这种情况吗?你在做模拟,是吗?
always @ (negedge key[2] or posedge sw[7]) begin
  if (~key[2]) 
      begin
        if (sw[1] == 0) begin
          if (p3ctr == 15) p3ctr = 0;
          else p3ctr = p3ctr + 1;
        end
        else if (sw[1] == 1) begin
          if (p3ctr == 0) p3ctr = 15;
          else p3ctr = p3ctr - 1;
        end
    end
  else begin
    p3ctr = 0;
  end
end
always @ (negedge key[2] or posedge sw[7]) begin
  if (sw[7]) begin
    p3ctr <= 0;
  end
  else begin
    if (sw[1] == 0) begin
      if (p3ctr == 15) p3ctr <= 0;
      else p3ctr <= p3ctr + 1;
    end
    else if (sw[1] == 1) begin
      if (p3ctr == 0) p3ctr <= 15;
      else p3ctr <= p3ctr - 1;
    end
  end
end