led实现呼吸灯

1.呼吸灯原理就是要让led灯的亮灭时间不同,需要多个计数器实现。从1us到1s钟,改变led呼吸灯的触发条件。

《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.仿真时序,就可以看出计数器的问题,说白了就是自己仿真做的少。波形分析的太少,需要多分析模块中的波形。

《led实现呼吸灯》

         波形分析:计数器第一个是实现1000us的计数,因为时钟频率为50MHZ,所以周期就是20us技术到50就是千分之一ms,所以第二个计数器记到1000就是1ms,第三个计数器就是记到1000就达到了1s钟的亮了。仿真的时候,修改了计数器的最大值参数,第二第三没记到1000而是记到10,第一个记到4。仿真出了,以上的波形。

    原文作者:Headogerz
    原文地址: https://blog.csdn.net/Headogerz/article/details/81604056
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞