基于易灵思FPGA的呼吸灯-易灵思(Elitestek)社区-FPGA CPLD-ChipDebug

基于易灵思FPGA的呼吸灯

基于FPGA的PWM实现

一 .原理概述

PWM,Pulse Width Modulation,脉冲宽度调制,也就是说脉冲波形的占空比是可以调节。

呼吸灯顾名思义,随着呼吸的节奏,灯也是逐步变亮和变灭,这是两个步骤。
我们将开始点亮和最亮这段时间,无限等分,可以推导在单位时长内,控制变亮的电路所占的比重逐渐增加,到最后是全份额;变灭也是同等过程。

同上原理,因此我们可以设计相关的实现。

二 .代码实现

FPGA逻辑控制本身就3种东西:状态机,计数器,RAM

module    LED 
#(
		parameter		DELAY_us	=	125,			
		parameter		DELAY_ms	=	1000,		
		parameter		DELAY_s		=	1000		
)(
		input  			sclk,
		input   		rst_n,	
		output wire  	led
	
);
//-----------------------------------------------------------
	reg [9:0]	cnt_1;		
	reg [9:0]	cnt_2;		
	reg [9:0]	cnt_3;	
		
	reg			delay_mode;
	reg			power;
	
	wire [9:0]	en		=	cnt_2;
	wire [9:0]	light	=	cnt_3;
//-----------------------------------------------------------	
	wire	delay_1us	=	(cnt_1==DELAY_us-1'b1)?1'b1:1'b0;
	wire	delay_1ms	=	(delay_1us&&cnt_2==DELAY_ms-1'b1)?1'b1:1'b0;
	wire	delay_1s	=	(delay_1ms&&cnt_3==DELAY_s-1'b1)?1'b1:1'b0;
//-----------------------------------------------------------	
always@(posedge	sclk	or	negedge	rst_n)
	begin
	if (!rst_n)
			cnt_1	<= 10'd0;
		else if	(cnt_1==DELAY_us-1'b1)
			cnt_1	<= 10'd0;
		else 
			cnt_1	<= cnt_1+1'b1;
			
	if (!rst_n)
			cnt_2	<= 10'd0;
		else if	(delay_1us&&cnt_2==DELAY_ms-1'b1)
			cnt_2	<= 10'd0;
		else if (delay_1us)
			cnt_2	<= cnt_2+1'b1;		
	
	if (!rst_n)
			cnt_3	<= 10'd0;
		else if	(delay_1ms&&cnt_3==DELAY_s-1'b1)
			cnt_3	<= 10'd0;
		else if (delay_1ms)
			cnt_3	<= cnt_3+1'b1;		
	
	if (!rst_n)
			delay_mode	<= 1'b0;
		else if (delay_1s)
			delay_mode	<=~delay_mode;
		else ;
	end
	
always@(posedge	sclk	or	negedge	rst_n)
	if (!rst_n)
		power	<= 1'b0;
	else case (delay_mode)
		1'b0:power	<= (en<light)? 1'b1:1'b0;
		1'b1:power	<= (en<light)? 1'b0:1'b1;
	endcase
//-----------------------------------------------------------

assign 	led	=	power	;

endmodule
/*
led   	
#(
		.DELAY_us(1),
        .DELAY_ms(100),
        .DELAY_s(100)
) led_inst
(		.sclk(sclk),	
		.rst_n(s_rst_n),	
		.led(led) 
); 			
*/

 

请登录后发表评论

    没有回复内容