前面测试了流水灯,这一篇继续进行呼吸灯测试。
参考https://bbs.eeworld.com.cn/thread-1234259-1-1.html
新建工程breath
创建源文件breath.v添加到工程
输入如下内容
module breath_led(
input sys_clk ,
input sys_rst_n ,
output[2:0] led
);
//reg define
reg [15:0] period_cnt ;
reg [15:0] duty_cycle ;
reg inc_dec_flag ;
//*****************************************************
//** main code
//*****************************************************
assign led[0] = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
assign led[1] = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
assign led[2] = (period_cnt >= duty_cycle) ? 1'b1 : 1'b0;
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n)
period_cnt <= 16'd0;
else if(period_cnt == 16'd50000)
period_cnt <= 16'd0;
else
period_cnt <= period_cnt + 1'b1;
end
always @(posedge sys_clk or negedge sys_rst_n) begin
if(!sys_rst_n) begin
duty_cycle <= 16'd0;
inc_dec_flag <= 1'b0;
end
else begin
if(period_cnt == 16'd50000) begin
if(inc_dec_flag == 1'b0) begin
if(duty_cycle == 16'd50000)
inc_dec_flag <= 1'b1;
else
duty_cycle <= duty_cycle + 16'd25;
end
else begin
if(duty_cycle == 16'd0)
inc_dec_flag <= 1'b0;
else
duty_cycle <= duty_cycle - 16'd25;
end
end
end
end
endmodule
从原理图可以看到LED_R,LED_G,LED_B分别对应J4 H5 J5
25M时钟输入对应D7
没有专门的复位按键就使用KEY0 H3
约束如下
下载运行,可以看到三个LED追歼亮灭,呼吸灯效果。
基本原理是基于PWM动态修改占空比实现,几个实例下来,逐渐熟悉了TD的操作,简单工程开发起来还是比较高效的。