FPGA入门学习——呼吸灯

呼吸灯

理论学习

呼吸灯在我们的生活中很常见,在手机上多作为消息提醒指示灯而被广泛使用,其效果是小灯在一段时间内从完全熄灭的状态逐渐变到最亮,再在同样的时间段内逐渐达到完全熄灭的状态,并循环往复。这种效果就像“呼吸”一样,有张有弛,而且给人一种很舒服的感觉。

实战思路

呼吸灯的实现可以分为两个过程,第一个过程为:完全熄灭->完全点亮
第二个过程为:完全点亮->完全熄灭
要实现“呼吸”一样的点亮效果,可以通过控制PWM的占空比来实现led灯越亮的效果。
在这里插入图片描述
第一个过程为:完全熄灭->完全点亮
如图所示,第一个T为熄灭状态;第二个T先点亮1/10T的时间,再熄灭;第三个T先点亮2/10T的时间,再熄灭;第四个T先点亮3/10T的时间,再熄灭…
第二个过程为:完全点亮->完全熄灭
将第一个过程取反即可

程序框图

在这里插入图片描述

波形图

在这里插入图片描述
图中,以1s为呼吸灯的完整过程周期,将1s分为1000份,则每份为1ms,再将1ms分为1000份,则每份为1us。那么每一个时间小段就是1us, 在逐渐变亮的过程中我们可以让led灯在第1个1ms的时间小段内亮0us,即全灭;第2个1ms的时间小段亮1us;第3个1ms的时间 小段亮2us,……,第998个1ms的时间小段亮997us,第999个1ms的时间小段亮998us,第1000个1ms的时间小段亮999us。

使能信号为低电平,则表示为呼吸灯的第一个过程,否则为呼吸灯的第二个过程。
呼吸灯第一个过程中的低电平时刻,可以通过判断cnt_1ms <= cnt_1s来实现,第二个过程中的高电平时刻同理。

代码

module breath_led
#(
	parameter CNT_1US_MAX = 6'd49,
	parameter CNT_1MS_MAX = 10'd999,
	parameter CNT_1S_MAX = 10'd999
)
(
	input clk,reset,
	output reg led_out
);

reg[9:0]  cnt_1s;
reg[9:0]  cnt_1ms;
reg[5:0]  cnt_1us;
reg cnt_en;


always @(posedge clk or negedge reset)
	if(reset == 1'b0)
		cnt_1us <= 6'd0;
	else if(cnt_1us == CNT_1US_MAX)
		cnt_1us <= 6'd0;
	else
		cnt_1us <= cnt_1us + 6'd1;
		
always @(posedge clk or negedge reset)
	if(reset == 1'b0)
		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;

always @(posedge clk or negedge reset)
	if(reset == 1'b0)
		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;
		
	
// 使能信号	
always @(posedge clk or negedge reset)
	if(reset == 1'b0)
		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;
		

// 输出信号
always @(posedge clk or negedge reset)
	if(reset == 1'b0)		
		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;
endmodule

仿真测试

`timescale 1 ns/ 1 ns
module breath_led_vlg_tst();

reg clk;
reg reset;                                           
wire led_out;
         
breath_led
#(
	.CNT_1US_MAX(6'd4),
	.CNT_1MS_MAX(10'd9),
	.CNT_1S_MAX(10'd9)
)
i1 (
	.clk(clk),
	.led_out(led_out),
	.reset(reset)
);
initial                                                
begin
	clk = 1'b1;
	reset <= 1'b0;
	#20
	reset <= 1'b1;
end                                                    
always #10 clk = ~clk;                                                
                                 
endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
FPGA自学笔记——设计与验证JMB FPGA(可编程逻辑门阵列)是一种可编程的硬件平台,可以实现各种数字电路的设计与验证。本文将简要介绍使用FPGA自学设计与验证JMB(低功耗、高效能、集成度高的多媒体芯片)的过程。 首先,我们需要了解JMB的功能和特性。JMB是一种面向多媒体应用的芯片,具备低功耗、高效能和高集成度的优势。我们需要详细研究JMB的硬件架构和内部模块,包括处理器核、存储器模块、图像和音频处理模块等。 接下来,我们可以使用FPGA开发板来设计和验证JMB。首先,我们需要熟悉FPGA设计工具,例如Vivado或Quartus等。这些工具提供了图形化界面和硬件描述语言(HDL)等设计方法。我们可以使用HDL编写JMB的功能模块,并将其综合为FPGA可执行的位流文件。 在设计完成后,我们需要验证JMB的功能和性能。我们可以使用仿真工具(例如ModelSim或ISE Simulator)来模拟JMB在不同情况下的行为。通过设计测试程序并运行仿真,我们可以验证JMB的各个模块是否正确地工作,是否满足设计要求。 在验证完成后,我们可以将位流文件下载到FPGA开发板中进行智能芯片的物理实现和测试。通过与外部设备的连接以及相关测试程序的运行,我们可以验证JMB在实际硬件中的功能和性能。 总结起来,学习FPGA设计与验证JMB,我们需要熟悉JMB的硬件架构和内部模块,并使用FPGA开发工具进行设计与验证。通过仿真和物理实现测试,我们可以验证JMB的功能和性能。这些过程需要理论知识和实践经验的结合,希望这些笔记能够给你提供一些参考和指导。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值