Verilog 同一位置的两个输入信号总是阻塞

Verilog 同一位置的两个输入信号总是阻塞,verilog,Verilog,我正在使用DE2-70板,我试图使用它的一些按钮作为输入。按钮在0处激活,我需要检查两个按钮是否分别按下,以增加/减少数字 我尝试执行以下操作,其中iKEY是按钮,position是我试图修改的数字: reg [4:0] position; position = 5'b0; output wire enable = !(iKEY[3] && iKEY[2]); always @(posedge enable) begin if(iKEY[3] == 0)

我正在使用DE2-70板,我试图使用它的一些按钮作为输入。按钮在0处激活,我需要检查两个按钮是否分别按下,以增加/减少数字

我尝试执行以下操作,其中iKEY是按钮,position是我试图修改的数字:

reg [4:0] position;
position = 5'b0;

output wire enable = !(iKEY[3] && iKEY[2]);
always @(posedge enable) begin  
    if(iKEY[3] == 0)
        position = position + 5'b00001;

    if(iKEY[2] == 0)
        position = position - 5'b00001;
end
我尝试了这种实现的几个不同之处,例如尝试更改ifs条件或在设置启用信号时更改逻辑函数,但我总是遇到一些问题。 我对硬件逻辑还不熟悉,所以可能我的思维方式不对

编辑:
如果同时按下两个按钮,我希望硬件既不增加也不减少数字

您可能应该在按下按钮时寻找变化。下面的代码查找iKEY[3]输入的下降沿。否则,只要按下IKEY,计数器就会发疯,开始疯狂地递增或递减

reg iKEY3_LAST;

output wire enable = !(iKEY[3] && iKEY[2]);
always @(posedge enable) begin  
  iKEY3_LAST = iKEY[3];
  if(iKEY[3] == 0 && iKEY3_LAST == 1)
    position = position + 5'b00001;

首先,在信号位置上有一个组合回路。当enable=1时,位置将改变,然后一次又一次地改变。在这种情况下,模拟通常会陷入困境,对于真实世界,这取决于您的工具如何实现它;我想他们中的大多数人都会打破这个循环。在日志中查找任何错误或警告。 您希望位置是一个触发器,所以它不是一个循环,而是每个时钟周期递增1:

always @(posedge clock or posedge reset)
if (reset)
   position <= 5'h0;
else
   position <= position + iKEY[3] - iKey[2];
始终@(posedge时钟或posedge重置)
如果(重置)
位置聊天讨论摘要:

  • 缺少关键背景信息信息:
    • iKEY
      为4位有源低电平输入。输入源来自物理按钮
    • 操作应在一冷(与一热相反)上进行
    • 有可用的时钟,例如50MHz
      iCLK\U 50


  • 意外执行操作的解决方案

    • 将所有
      iKEY
      移动到一个always块中,并使用case语句对操作进行解码。例:

      case(iKEY[3:0]) // one-cold, full-case
        4'b1110: /* operation 0 */
        4'b1101: /* operation 1 */
        4'b1011: /* operation 2 */
        4'b0111: /* operation 3 */
        default: /* default behavior */
      endcase
      
    • 如果使用
      iKEY
      作为时钟事件,则执行逐位NAND操作:

    • wire enable = ~&iKEY[3:0];
    • 如果使用
      iCLK\U 50
      时钟,则添加一个reg以监视按钮释放,以确保每次按下按钮都有一次操作。例:

      if (allow_op) begin // value from past clock event
        /* case statement defined above */
      end
      // value for next clock event
      allow_op = &iKEY[4:0]; // bit-wise AND
      

如果同时按下两个或多个按钮,您预计会发生什么?如果可能,我希望它什么也不做。我将编辑我的问题,然后在
position=5'b0之前添加一个缺少的
首字母
,我没有看到任何突出的工作。不清楚您遇到了什么问题。请分享一个链接到您的完整代码,并加入我的聊天,您可能需要去弹跳您的按钮以及。最好用状态机解决这个问题。