用输入按钮设计Verilog计数器

用输入按钮设计Verilog计数器,verilog,Verilog,我正在创建一些计数器,它对按钮输入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 res

我正在创建一些计数器,它对按钮输入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
模块二进制计数器(
输入时钟,
输入复位,
输入[2:0]推送,
输出[3:0]数据\u输出
);
reg[3:0]数据温度输出;
始终@(posedge clk或negedge resetn)开始
如果(~resetn)开始

数据温度输出,因为持续按下按钮1时,条件
push==3'b001
不断满足

相反,您可以通过比较当前的
push
与上一次的
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);

我真诚地感谢大家。但我不明白的是,如果我在我的设计源代码中添加代码,我认为会发生的是,因为您给出的代码在restn的每个正边缘或负边缘上出现,push_d等于push和compare push!=推。我的意思是,事件的顺序是按钮输入->按下按钮!=按d键,它总是给出0。但要正确操作,事件的顺序是push\u d push input->push!=推。二阶正确吗?如果是这样的话,我无法理解为什么会以这种方式运行您提供的序列
按钮输入->push\u d push!=push_d
,听起来像是一个顺序执行的程序。不,是并联工作的电路<代码>推送
始终滞后
推送
一个周期。通过比较,我们可以指示何时
push
更改。通过波形可能更容易获得更好的理解。
            if(push_chg & (push == 3'b001)) begin
                ...
            end