09 呼吸灯
温馨提示:这篇文章已超过413天没有更新,请注意相关的内容是否还可用!
呼吸灯简介
呼吸灯实际展示的效果就是一个 LED 灯的亮度由亮到暗,再由暗到亮的变化过程,并且该过程是循环往复的,像呼吸一样那么有节奏。 呼吸灯通常是采用 PWM(Pulse Width Modulation,即脉冲宽度调制) 的方式实现,在 PWM 频率固定的情况下,通过调整其占空比来控制 LED 灯亮度的变化。
在固定周期的 PWM 信号下,如果其占空比为 0,则 LED 灯不亮;如果其占空比为100%,则 LED 灯最亮。将占空比从 0 到 100%,再从 100%到 0 不断变化,就可以实现 LED 灯的“呼吸”效果,PWM 占空比调节示意图如下所示:
PWM信号的产生
可以使用1个寄存器和一个比较值来控制 PWM 信号的产生,寄存器进行周期计数,控制 PWM 的周期,在计数器周期计数过程中同时将计数值与比较值比较,当周期计数器的值小于比较寄存器时输出低电平,否则输出高电平,此时通过调节比较值便可调节 PWM 占空比,调节周期计数器的最大计数值便可调节 PWM 的周期,PWM 信号产生原理如下图所示:
原理图
LED0 到 LED3 这 4 个发光二极管的阴极分别连到 S8050(NPN 三极管)的集电极上,阳极都与 3.3V 电压相连,三极管的基极分别与 FPGA 相连,这是由于 FPGA 的 IO 口的电压只有 1.5V,电压较低,所以此处连接三极管是为了起到放大电压的作用。这样就可以通过改变三极管的状态来控制 LED 的亮灭。当 FPGA 输出到为高电平时,三极管导通,LED 灯亮;当 FPGA 输出到为低电平时,三极管截止,LED 灯灭。
此实验中只用到了LED0
系统框图
系统框图如下,包括两部分,分别是产生PWM信号的PWM模块和控制PWM占空比的呼吸灯模块
编写代码
PWM信号生成模块
PWM信号生成模块包含一个周期计数器和一个比较值,比较值通过模块外部输入的占空比结合PWM周期转换得到(这里由呼吸灯模块进行占空比控制),模块代码如下:
`timescale 1ns / 1ns module pwm_generate ( input sys_clk, //系统时钟 input sys_rst_n, //系统复位,低电平有效 input [31:0] period, //PWM周期 input [31:0] duty_cycle, //PWM占空比 output pwm_out //输出的PWM信号 ); //PWM周期 wire [31:0] pwm_period; //PWM比较值 wire [31:0] pwm_compare; //周期计数器,用于控制PWM周期 reg [31:0] count; //PWM周期,不能小于1 assign pwm_period = (period





