两个输入信号始终阻塞

时间:2013-10-16 23:35:17

标签: verilog

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

我尝试了以下操作,其中iKEY是按钮,位置是我要修​​改的数字:

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条件或更改逻辑功能,但我总是遇到一些问题。 我是硬件逻辑的新手,所以也许我用错误的方式思考它

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

3 个答案:

答案 0 :(得分:2)

聊天讨论摘要:

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

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

    • 将所有iKEY全部移动到一个始终阻止,并使用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_50时钟,则添加一个注册表以观察按钮释放,以确保每个按钮按下一个操作。例如:

      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
      

答案 1 :(得分:0)

您可能应该在按下按钮时寻找更改。下面的代码查找iKEY [3]输入的下降沿。否则,只要按下IKEY,该计数器就会变为NUTS并开始像疯了一样递增或递减。

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;

答案 2 :(得分:0)

首先,你有一个信号位置的组合循环。当enable = 1时,位置会改变,然后一次又一次地改变。模拟通常会陷入这种情况,就像现实世界一样,它取决于你的工具如何实现它;我猜他们中的大多数都会打破循环。查找日志中的任何错误或警告。 你希望position是一个翻牌,所以它不是一个循环,但每个时钟周期都会增加1:

always @(posedge clock or posedge reset)
if (reset)
   position <= 5'h0;
else
   position <= position + iKEY[3] - iKey[2];

现在你必须考虑按钮引入弹跳效果。查看here以获取更多信息。你可能想要实现数字交换机Debouncing。

正如拉塞尔写的那样,你可能会考虑仅在按钮的下降沿改变位置,否则计数器会像疯了一样上溢/下溢。