led实现呼吸灯
程序员文章站
2022-07-13 22:26:11
...
1.呼吸灯原理就是要让led灯的亮灭时间不同,需要多个计数器实现。从1us到1s钟,改变led呼吸灯的触发条件。
2.依旧把程序写出来,这次在写计数器的时候,发现自己很大问题,就是计数器条件写不全。要不就是只写计数不清零,要么就是忘记清零不拉高。说白了,就是不理解时序,没有将一个周期的计算器完全描述出来。
module hx_led(
input wire sclk,
input wire rst_n,
output reg [3:0]led
);
reg [6:0] cnt_1;
reg [9:0] cnt_2;
reg [9:0] cnt_3;
//reg flag_cnt_1;
//reg flag_cnt_2;
//reg flag_cnt_3;
parameter CNT_1=10'd49;
parameter CNT_2=10'd999;
always @(posedge sclk or negedge rst_n) //计数器2us
if(!rst_n)
cnt_1<=7'b0000_000;
else if(cnt_1==CNT_1)
cnt_1<=7'b0000_000;
else cnt_1<=cnt_1+1'b1;
always @(posedge sclk or negedge rst_n) //少记了一个2us
if(!rst_n)
cnt_2<=10'd0;
else if(cnt_2==CNT_2&&cnt_1==CNT_1) //拉低条件要仔细看
cnt_2<=10'd0;
else if(cnt_1==CNT_1)
cnt_2<=cnt_2+1'b1;
always @(posedge sclk or negedge rst_n)
if(!rst_n)
cnt_3<=10'd0;
else if(cnt_3==CNT_2&&cnt_2==CNT_2&&cnt_1==CNT_1)
cnt_3<=10'd0;
else if(cnt_2==CNT_2&&cnt_1==CNT_1)
cnt_3<=cnt_3+1'b1;
//
//always @(posedge sclk or negedge rst_n) //产生flag-cntus标志位
//if(!rst_n)
//flag_cnt_1<=1'b0;
//else if(cnt_1==CNT_1)
// flag_cnt_1<=1'b1;
// else flag_cnt_1<=1'b0;
//
/*always @(posedge sclk or negedge rst_n) //产生flag-cntms标志位
if(!rst_n)
flag_cnt_2<=1'b0;
else if(flag_cnt_1==1'b1&&) */
always @(posedge sclk or negedge rst_n)
if(!rst_n)
led<=4'b0000;
else if(cnt_2<=cnt_3)
led<=4'b1111;
else led<=4'b0000;
endmodule
3.仿真时序,就可以看出计数器的问题,说白了就是自己仿真做的少。波形分析的太少,需要多分析模块中的波形。
波形分析:计数器第一个是实现1000us的计数,因为时钟频率为50MHZ,所以周期就是20us技术到50就是千分之一ms,所以第二个计数器记到1000就是1ms,第三个计数器就是记到1000就达到了1s钟的亮了。仿真的时候,修改了计数器的最大值参数,第二第三没记到1000而是记到10,第一个记到4。仿真出了,以上的波形。
上一篇: c++类和对象详细总结
下一篇: Mixly遥控器调节LED灯亮度