设计一个以1秒频率闪烁的LED灯(亮灭各500ms)
1、关于计算问题:
(1)若开发板基本时钟频率为50MHZ
T = (1/50)*10^(-6) = 20ns
500ms = 25000000×20ns
则计数器需要累加到25000000次,才为500ms。
(2)关于代码中为何是24999999而不是25000000,个人理解是因为从0开始累加,0-24999999为25000000次。
2、计数器原理图![在这里插入图片描述](https://i-blog.csdnimg.cn/blog_migrate/5f80355c26994a2ea61ffe6446c362f1.png)
3、代码实现
//设计一个以1秒频率闪烁的LED灯(亮灭各500ms)
module jishuqi(clk, rst, LED );
input clk ;
input rst;
output reg LED;
reg [24:0] count;
always@(posedge clk or negedge rst )
if(!rst) begin
count <= 0;
LED <=0;
end
else if(count == 24999999) begin
count <= 0;
LED <= ~LED;
end
else
count <= count + 1'b1;
endmodule
激励如下:
module jishuqi_tb();
reg clk_n;
reg rst_n;
wire LED;
jishuqi jishuqiDemo(
.clk(clk_n),
.rst(rst_n),
.LED(LED)
);
initial clk_n = 1;
always #10 clk_n = ~clk_n;
initial begin
rst_n = 0;
#201;
rst_n = 1;
#2000000000;//代码执行2s
$stop;
end
endmodule
仿真图像如下:
若按照25000000来写代码,仿真图像会多出20ns,其原因上面已经解释。
实操如下:
LED等灯以1s闪烁。