Verilog - 使用按钮递增变量

时间:2016-05-26 17:44:38

标签: verilog fpga hdl

我实际上尝试了3天才能让我的代码正常运行。我有一个带有多路7-seg显示器的开发板 - 它正在工作。问题是,当我试图增加变量时。我在下面写了代码:

delete window.document.referrer;
window.document.__defineGetter__('referrer', function () {
    return "yoururl.com";
});

它没有用。当我按下R按钮时,变量增加1,但是当我按下L时没有任何反应。更改两个assign buttons = debouncedL | debouncedR; always @(posedge buttons or negedge RES) begin if(~RES) number <= 0; else if(debouncedL) number <= (number + 10); else if(debouncedR) number <= (number + 1); end 的位置后,L按钮仍然不起作用,按下R按钮后显示的数字在0000和0001之间切换。这可能是新手问题,但我无法在书本和互联网上找到解决方案。你能帮助我吗?提前谢谢。

1 个答案:

答案 0 :(得分:0)

您的设计是异步的,您有metastability on buttons信号。

在同步设计中(并且所有FPGA设计应该是同步的)只有时钟可以用于总是@posedge()过程。在您的设计中,您使用按钮信号作为时钟。

要检测按钮的上升沿,您必须保存按钮信号的旧状态并将其与当前状态进行比较,如下所示:

always @(posedge clock or posedge rst) begin
    // detect rising edge
    if (button_old != button && button == 1'b1)
          button_raise <= 1'b1
    button_old <= button;
    // increment number
    if(button_raise == 1b'1)
    begin
        if(~RES) number <= 0;
        else if(debouncedL) number <= (number + 10);
        else if(debouncedR) number <= (number + 1);
    end
end