FPGA之呼吸灯

基础知识      

        呼吸灯的效果是灯逐渐由暗变亮再逐渐由亮变暗,FPGA的引脚电压只有“0”和“1”两个等级。因此通过改变引脚单位时间内高电平的输出时间来实现呼吸灯,也就是让FPGA引脚输出一系列PWM波信号并不断改变PWM波的占空比。

        PWM(Pluse Width Modulation)脉冲宽度调制,是一种对模拟信号电平进行数字编码的方法。通过高分辨率计数器的使用,方波的占空比被调制用来对一个具体模拟信号的电平进行编码。占空比(Duty Cycle or Duty Ratio),可以解释为,在一脉冲序列中(方波),正脉冲序列的持续时间与脉冲总周期的比值。也可理解为,电路释放能量的有效时间与总释放时间的比值。

波形图

 代码

module breach_led
#(
	parameter CNT_1US_MAX = 6'd49,
	parameter CNT_1MS_MAX = 10'd999,
	parameter CNT_1S_MAX  = 10'd999
)
(
	input	wire	sys_clk,
	input	wire	sys_rst_n,
	
	output	reg 	led_out
);
reg	[9:0]cnt_1s;
reg	[9:0]cnt_1ms;
reg	[5:0]cnt_1us;
reg cnt_en;

always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(!sys_rst_n)
		cnt_1us <= 6'd0;
	else if (cnt_1us == CNT_1US_MAX)
		cnt_1us <= 6'd0;
	else
		cnt_1us <= cnt_1us + 6'd1;
end
	
always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(!sys_rst_n)
		cnt_1ms <= 10'd0;
	else if ((cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))
		cnt_1ms <= 10'd0;
	else if(cnt_1us == CNT_1US_MAX)
		cnt_1ms <= cnt_1ms + 10'd1;
	else
		cnt_1ms <= cnt_1ms;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(!sys_rst_n)
		cnt_1s <= 10'd0;
	else if ((cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))
		cnt_1s <= 10'd0;
	else if ((cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))
		cnt_1s <= cnt_1s + 10'd1;
	else
		cnt_1s <= cnt_1s;
end

always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(!sys_rst_n)
		cnt_en <= 1'b0;
	else if((cnt_1s == CNT_1S_MAX) && (cnt_1ms == CNT_1MS_MAX) && (cnt_1us == CNT_1US_MAX))
		cnt_en <= ~cnt_en;
	else
		cnt_en <= cnt_en;
end
	
always @(posedge sys_clk or negedge sys_rst_n)
begin
	if(!sys_rst_n)
		led_out <= 1'b1;
	else if(((cnt_en == 1'b0)&&(cnt_1ms <= cnt_1s))||((cnt_en == 1'b1)&&(cnt_1ms > cnt_1s)))
		led_out <= 1'b0;
	else
		led_out <= 1'b1;
end

endmodule
`timescale 1ns/1ns
module tb_breach_led();

	reg sys_clk;
	reg sys_rst_n;
	wire led_out;
	
initial
	begin	
		sys_clk = 1'b1;
		sys_rst_n <= 1'b0;
		#20
		sys_rst_n <= 1'b1;
	end
always #10 sys_clk <= ~sys_clk;

breach_led 
#(
	.CNT_1US_MAX (6'd4),
	.CNT_1MS_MAX (10'd9),
	.CNT_1S_MAX  (10'd9)
)
breach_led_inst
(
	.sys_clk	(sys_clk),
	.sys_rst_n	(sys_rst_n),
			
	.led_out    (led_out)
);

endmodule

 仿真

FPGA(Field-Programmable Gate Array)是一种可编程逻辑器件,用于设计和实现各种硬件系统,包括简单的LED灯控制。对于FPGA呼吸灯设计,其基本思路如下: 1. **硬件接口**: 首先,你需要确定使用哪个FPGA的输入/输出引脚来连接LED灯。通常,GPIO(通用输入输出)或类似的模块会被用来作为LED的驱动信号。 2. **时序设计**: 呼吸灯效果依赖于灯的闪烁频率和亮度变化。确定一个基础的周期,比如几个微妙或毫秒,然后通过计数器或者状态机来控制LED的开关。 3. **状态机或计数器**: 使用状态机的设计方法,定义LED的不同工作状态,如关闭、亮起、慢慢亮、慢慢暗等。计数器可以用来控制灯的闪烁速度,比如每增加一定次数就改变亮度或切换到下一个阶段。 4. **编程逻辑**: 在FPGA中,编写Verilog或VHDL代码来描述这个逻辑。这部分代码会定义如何根据状态机的状态来控制LED的驱动信号。 5. **配置和下载**: 使用FPGA开发工具(如Xilinx ISE或Vivado, Intel Quartus II等),将编写的逻辑配置到目标FPGA芯片上。 6. **测试**: 通过硬件调试器或JTAG接口验证设计是否按照预期工作,调整参数以达到理想的效果。 相关问题: 1. FPGA呼吸灯设计中,如何控制LED的亮度变化? 2. 在状态机设计中,有哪些常见的状态用于呼吸灯效果? 3. 如何通过编程逻辑实现灯的闪烁频率变化?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

发光中请勿扰

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值