程序简介:该模块实现点亮LED灯以0.5s的时间间隔进行点亮 熄灭的效果,也是同学们成为“点灯大师”的关键一步
/*
* LED闪烁模块
* 功能:通过计数器实现LED定时翻转,产生周期性闪烁效果
* 闪烁频率 = 系统时钟频率 / (2*(计数器最大值+1))
* 本例使用50MHz时钟时,LED每秒闪烁1次(周期1秒)
*/
module LED_flash(
input Clk, // 系统时钟输入(假设50MHz)
input Reset_n, // 异步复位信号,低电平有效
output reg Led // LED输出信号
);
// 25位宽计数器(最大计数值25,000,000对应50MHz时钟的0.5秒)
reg [24:0] counter; // 2^25 = 33,554,432 > 25,000,000
// 计数器控制逻辑
always@(posedge Clk or negedge Reset_n)
begin
if(!Reset_n) // 异步复位
counter <= 0; // 复位时计数器清零
else if(counter == 24999999)// 达到0.5秒计数值(50MHz时钟)
counter <= 0; // 计数器归零
else
counter <= counter + 1'd1; // 常规计数递增
end
// LED控制逻辑
always@(posedge Clk or negedge Reset_n)
begin
if(!Reset_n) // 异步复位
Led <= 0; // 复位时关闭LED
else if(counter == 24999999)// 每0.5秒触发一次
Led <= !Led; // 翻转LED状态(产生1Hz闪烁)
end
endmodule
咱们这里闪烁的周期是1s,那么就是说咱们需要在1s内完成LED闪烁和熄灭的效果,就设定LED闪烁和熄灭各自为0.5s,相当于0.5s变换一次状态。如果不按0.5s计算的话,这里还会涉及到一个分频器的知识,这个我后面还会再出一篇博客进行讲解。
此外,这里面涉及一个counter数值位宽的计算:
上面讲到,我们需要0.5s变换一次状态,1s完成一个周期
开发板的时钟为50MHz,当Clk=50MHz时,时钟周期=20ns
0.5s/20ns=25,000,000,也就是经过25,000,000次上升沿后,进行一次状态变换,那么我们就需要去用一个变量来计算上升沿的次数。25,000,000对应的二进制编码为25位 ,因此我们需要一个25位宽的变量,也就是 [24:0]counter
计数时是从0开始的,以4为例:0到1、1到2、2到3、3到0为四次计数,因此实际上的计数值应为计数次数-1
所以此处的计数值应为25,000000-1=24,999,999,即24,999,999对应0.5秒
(24,999,999+1)*20ns = 500,000,000ns ,1s=10^9ns



3926

被折叠的 条评论
为什么被折叠?



