(3)计数器&时序逻辑
设计思路:
设计代码:
RTL:
module led_flash( clk,rst_n,led ); input clk,rst_n; output reg led=0; parameter max=24999999; //(计数的最大值) reg [24:0] cnt=0; always@(posedge clk or negedge rst_n) if(!rst_n) cnt <= 0; else if (cnt == max) cnt <= 0; else cnt <= cnt+1; //灯的闪烁 always@(posedge clk or negedge rst_n) if(!rst_n) led <= 0; else if (cnt == max) led <= ~led; else led <= led; endmodule
tb:
`timescale 1ns / 1ps module led_flash_tb(); reg clk,rst_n; wire led; led_flash u_led_flash( .clk(clk), .rst_n(rst_n), .led(led) ); initial clk = 1; always #10 clk = ~clk; //每10ns翻转一次,因此clk周期为20ns initial begin rst_n = 0; #200; rst_n = 1; #3000000000; $stop; end endmodule
仿真波形:
在上面我设置的是3s结束,但是仿真时间太长了,也就没有继续,看到led翻转就暂停了。
在波形的边缘处右键,选择Mark,可以打一个标记,点一下标记底下就会出现刻度尺。
可以看到,led的半个周期为500ms,满足我们的设计要求。
电路结构图:
上班验证:
这里发现什么都看不到,点一下上面这个group按钮就好了
上板后发现led以1s频率闪烁,如果按住按钮0的话led将不闪烁(复位),本实验设计得到成功验证。