使用输入按钮在 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
我正在创建一些针对按钮输入 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