呼吸灯
我今天分享一个呼吸灯的代码,挺有意思的!
呼吸灯字意就像人的呼吸一样的变化的灯,什么变化呢?指的是灯的暗慢慢变亮,再由亮慢慢变暗重复变化。
生活中常见的呼吸灯也就是手机上来消息时那个灯一闪一闪的变化。
我是怎么设计的这个呼吸灯的呢?
其中涉及到了脉宽调制的手段,利用占空比的变化来改变灯的暗慢慢到亮的状态!具体请见如下代码:
大家测试的时候需要用到FPGA的开发板,利用Altera或者Xilinx的开发环境将程序下载到FPGA芯片即可!
程序哪有疑问可以找我哦,我会帮你解答的哦。
module breathe(
input wire sys_clk ,
input wire sys_rst_n ,
output reg led
);
reg [6:0] cnt_2us ;
reg [9:0] cnt_2ms ;
reg [9:0] cnt_2s ;
reg wave_flag ;
parameter CNT_MAX = 100 ;
parameter T_2US = 1,
T_2MS = 1000,
T_2S = 1000_000;
always @ (posedge sys_clk or negedge sys_rst_n)
if(sys_rst_n == 1'b0)
cnt_2us <= 7'd0;
else
if(cnt_2us == CNT_MAX - 1'b1)
cnt_2us <= 7'd0;
else
cnt_2us <= cnt_2us + 1'b1;
always @ (posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt_2ms <= 10'd0;
else if ((cnt_2us == CNT_MAX - 1'b1)&&(cnt_2ms == T_2MS / T_2US - 1'b1))
cnt_2ms <= 10'd0;
else if (cnt_2us == CNT_MAX - 1'b1)
cnt_2ms <= cnt_2ms + 1'b1;
else
cnt_2ms <= cnt_2ms;
always @ (posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
cnt_2s <= 10'd0;
else if((cnt_2us == CNT_MAX - 1'b1)&&(cnt_2s == T_2S / T_2MS - 1'b1)&&(cnt_2ms == 10'd1000 - 1'b1))
cnt_2s <= 10'd0;
else if ((cnt_2ms == 10'd1000 - 1'b1)&&(cnt_2us == CNT_MAX - 1'b1))
cnt_2s <= cnt_2s + 1'd1;
else
cnt_2s <= cnt_2s;
always @ (posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
wave_flag <= 1'b0;
else if ((cnt_2us == CNT_MAX - 1'b1)&&(cnt_2s == T_2S / T_2MS - 1'b1)&&(cnt_2ms == 10'd1000 - 1'b1))
wave_flag <= ~ wave_flag;
else
wave_flag <= wave_flag;
always @ (posedge sys_clk or negedge sys_rst_n)
if (sys_rst_n == 1'b0)
led <= 0;
else if ((cnt_2s > cnt_2ms)&&(wave_flag == 1'b0))
led <= 1'b1;
else if((cnt_2s < cnt_2ms)&&(wave_flag == 1'b1))
led <= 1'b1;
else
led <= 1'b0;
endmodule
3125

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



