使用输入按钮在 Verilog 上设计计数器

Designing counter on Verilog with input button

我正在创建一些针对按钮输入 001、010、100 计算 +1、-1 和 +2 的计数器。

这是我的代码。

module binary_counter(
        input clk,
        input resetn,
        input [2:0] push, 
        output [3:0] data_out
    );
    
    reg [3:0] data_temp_out;

    always @(posedge clk or negedge resetn) begin   
        if(~resetn) begin
            data_temp_out <= 4'b0;       // all 0
        end
                    
        else if(resetn == 1) begin    // else
            if(push == 3'b001) begin    
                data_temp_out <= data_temp_out +1;    // count +1
            end
            
            else if(push == 3'b010) begin   // count-1
                data_temp_out <= data_temp_out -1;
            end
            
            else if(push == 3'b100) begin   // count+3
                data_temp_out <= data_temp_out +3;
            end
        end
    end
    
    assign data_out = data_temp_out;
    
endmodule

在给定一些topModule和时钟信号后,我在FPGA板上实现了这个计数器。 push[2:0] 连接到三个按钮。问题是,如果我一直按按钮,计数会一直上升。

我想要的是只在按钮输入改变时计数。我的意思是即使我保持按钮 1 (001) 和其他按钮输入相同,它也只计算 +1。

你能给我一个提示或解决方案吗?

因为当您持续按下按钮 1 时,条件 push == 3'b001 会不断满足。

相反,您可以创建一个 push-value-change 事件,即 single-cycle 脉冲,方法是将当前 push 与最后一个 push 进行比较。

reg [2:0] push_d;
wire push_chg;
always @(posedge clk or negedge resetn) begin
    if(~resetn) begin
        push_d <= 3'h0;
    end
    else begin
        push_d <= push;
    end
end
assign push_chg = (push != push_d);

然后计算上述事件发生时的push值。

            if(push_chg & (push == 3'b001)) begin
                ...
            end