欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

led实现呼吸灯

程序员文章站 2022-07-13 22:26:11
...

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。仿真出了,以上的波形。