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
我实际上尝试了 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