Led demo下面共有两个工程,
LED_cnt是led直接输出计数器,LED_sleep是呼吸灯。
LED_cnt计数灯说明
`timescale 1 ps / 1 ps
module design_top_wrapper(
input clk_ref,
output led_r,
output led_g,
output led_b
);
reg [32:0]cnt; //计数器寄存器
always @(posedge clk_ref) begin
cnt <= cnt + 1'b1; //计数器寄存器累加
end
//将计数器寄存器结果输出到RGB LED上
assign led_r = cnt[15];
assign led_g = cnt[23];
assign led_b = cnt[31];
endmodule
代码比较简单,注释也清楚,开发板的LED的红绿蓝分别代表了计数器的cnt[15], cnt[23], cnt[31]。
其实这个工程就是入门教程(6)中的工程。
管脚约束情况如下图,这几个脚是复用脚需要修改工程配置,详情请参见PotatoPie V4.0 入门教程(6)—— TD工具入门:工程创建,管脚约束,HDL编译,bit流下载
LED_slepp呼吸灯说明
呼吸灯的原理实质上就是用PWM波驱动LED,并更改PWM的占空比,让LED的亮度像人体的呼吸一样强弱交替,需要注意周期不能太快,需要加延时以适应人眼。
呼吸灯的设计较为简单, 我们使用系统时钟作为高频信号做分频处理, 调整占空比实现
PWM, 通过 LED 灯 LD 指示输出状态 。
实现原理如上图所示, 脉冲信号的周期为 T, 高电平脉冲宽度为 t, 占空比为 t/T。 为了实现 PWM
脉宽调制, 我们需要保持周期 T 不变, 调整高电平脉宽 t 的时间, 从而改变占空比。
当 t = 0 时, 占空比为 0%, 因为我们的 LED 硬件为低电平点亮, 所以为最亮的状态。
当 t = T 时, 占空比为 100%, LED 灯为最暗(熄灭) 的状态。
结合呼吸灯的原理, 整个呼吸的周期为最亮→最暗→最亮的时间, 即 t 的值的变化: 0→T→0 逐
渐变化。
如果呼吸灯设计要求呼吸的周期为 2s, 也就是说 LED 灯从最亮的状态开始, 第一秒时间内逐渐变暗,
第二秒的时间内再逐渐变亮, 依次进行。
第一部分代码分别实现us、ms和s级计数器
reg [5:0] cnt_us ;
reg [9:0] cnt_ms ;
reg [9:0] cnt_s ;
reg cnt_1s_en ;
//cnt_us:1us计数器
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
cnt_us <= 6'b0;
else if(cnt_us == CNT_1US_MAX)
cnt_us <= 6'b0;
else
cnt_us <= cnt_us + 1'b1;
//cnt_ms:1ms计数器
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
cnt_ms <= 10'b0;
else if(cnt_ms == CNT_1MS_MAX && cnt_us == CNT_1US_MAX)
cnt_ms <= 10'b0;
else if(cnt_us == CNT_1US_MAX)
cnt_ms <= cnt_ms + 1'b1;
//cnt_s:1s计数器
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
cnt_s <= 10'b0;
else if(cnt_s == CNT_1S_MAX && cnt_ms == CNT_1MS_MAX
&& cnt_us == CNT_1US_MAX)
cnt_s <= 10'b0;
else if(cnt_ms == CNT_1MS_MAX && cnt_us == CNT_1US_MAX)
cnt_s <= cnt_s + 1'b1;
//cnt_1s_en:1s计数器标志信号
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
cnt_1s_en <= 1'b0;
else if(cnt_s == CNT_1S_MAX && cnt_ms == CNT_1MS_MAX
&& cnt_us == CNT_1US_MAX)
cnt_1s_en <= ~cnt_1s_en;
第三部分是所谓的核心代码,从代码可以看出led_out信号在cnt_1s_en脉冲标志信号为低时高电平时序的时间是渐渐增加的(因为ms计数越来越大,cnt_1ms > cnt_1s条件成立的时间越来越久),对应的led 灯会渐渐变亮;而在cnt_1s_en脉冲标志信号为低时高电平时序的时间是渐渐减小的(因为ms计数越来越大,cnt_1ms < cnt_1s条件成立的时间越来越久),对应的led灯会渐渐变灭。
//led:输出信号连接到外部的led灯
always@(posedge clk or negedge rst_n)
if(rst_n == 1'b0)
led <= 1'b0;
else if((cnt_1s_en == 1'b1 && cnt_ms < cnt_s) ||
(cnt_1s_en == 1'b0 && cnt_ms > cnt_s))
led <= 1'b0;
else
led <= 1'b1;
这个实验的管脚约束同上面的led_cnt的工程是一样的。
没有回复内容