Verilog - 使用按钮递增变量

Verilog - incrementing variable using buttons

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

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

它不起作用。当我按下 R 按钮时,变量增加 1,但是当我按下 L 时什么也没有发生。改变两个 else if 的位置后,L 按钮仍然不起作用,按下 R 按钮后显示的数字在 0000 和 0001 之间切换。这可能是新手问题,但我无法在书中和互联网上找到解决方案。你能帮助我吗?提前谢谢你。

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

在同步设计中(并且所有 FPGA 设计都应该是同步的)只有时钟可以用于 always @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