为什么这段代码只能部分工作?

时间:2015-09-20 13:55:41

标签: verilog fpga intel-fpga quartus

当按下一个按钮时,该代码应该递增计数器(输出到LED),而当按下另一个按钮时递减计数器。它可以在递减时正常工作,但在递增时它会将LED更改为随机配置。

module LED_COUNTER( CLK_50M, LED, Positive, Negative );
input wire CLK_50M;
input wire Positive;
input wire Negative;
output reg[7:0] LED;

always@( posedge Positive or posedge Negative )
begin
    if(Positive == 1)
        LED <= LED + 1;
    else
        LED <= LED - 1; 
end

endmodule

我正在使用此主板:http://www.ebay.com/itm/111621868286。引脚分配是:

连接:

交换按钮的引脚分配后,行为保持不变。

1 个答案:

答案 0 :(得分:1)

你没有去抖电路或逻辑。机械开关会物理反弹很多,所以你的50MHz时钟会在输入信号上看到很多很多转换,导致不稳定的行为。

我忘了提到你甚至没有在同步设计中使用那个50MHz时钟。而是你异步地寻找过渡。

你需要一个低通滤波器。可以使用输入信号上的模拟组件实现,也可以作为硬件中的计数器实现。