本帖最后由 不是张角 于 2025-3-6 17:20 编辑
#有奖活动# #申请原创#@21小跑堂 该图是通过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;
|