本帖最后由 不是张角 于 2025-3-6 11:44 编辑
#有奖活动# #申请原创# 该图是通过timegen3所画
module counter(
input clk,
input reset_n,
output reg out
);
always @(posedge clk or negedge reset_n)
if(!reset_n)
out <= 0;
else
out <= 1;
endmodule
这句的意思就是每当时钟上升或者复位就进入 看图可以知道在第二个始终上升沿reset_n上拉,但是此时他还是0,所以到下一个时钟上升沿out就会为1
module counter_tb;
reg clk;
reg reset_n;
wire out;
counter counter_tb0(
.clk(clk),
.reset_n(reset_n),
.out(out)
);
initial clk = 1;
always #10 clk = ~clk;
initial begin
reset_n = 0;
#201;
reset_n = 1;
#40000000;
$stop;
end
endmodule
下来就要考虑计数器的情况:
parameter MAX_COUNT_S = 'd49_999_999;//一秒
parameter MAX_COUNT_M = 'd59;//一分钟
reg [25:0]counter_delay_s;
reg [7:0]counter_delay_m;//分钟
//HS秒
always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
if(!reset_n)
counter_delay_s <= 'd0;
else if(counter_delay_s == MAX_COUNT_S)
counter_delay_s <= 0;
else
counter_delay_s <= counter_delay_s + 1'b1;
//HS分
always @(posedge clk or negedge reset_n) //表示只要是始终上升沿或复位下降沿都会运行
if(!reset_n)
counter_delay_m <= 'd0;
else if(counter_delay_s == MAX_COUNT_S && counter_delay_m == MAX_COUNT_M)//当一分钟时候
counter_delay_m <= 0;
else if(counter_delay_s == MAX_COUNT_S)
counter_delay_m <= counter_delay_m + 1'b1;
|