Verilog:LED呼吸灯

模块接口说明

信号 方向 描述
clk 输入 系统时钟(100MHz,周期10ns)
rst_n 输入 低电平有效的异步复位信号
led_en 输入 总使能信号(1=开启呼吸灯,0=关闭)
speed_en 输入 呼吸速度调节使能信号
speed[2:0] 输入 呼吸速度分级(0-7对应8级速度,0最慢,7最快)
led 输出 即PWM输出(受led_en控制)

模块代码:

复制代码
/* 呼吸灯模块例化
led_breath #(
    .STEP     (1)
) led_breath(
    .clk      (clk     ),         
    .rst_n    (rst_n   ),
    .led_en   (led_en  ),
    .speed_en (speed_en),     
    .speed    (speed   ),
    .led      (led     )   
);
*/

`timescale 1ns/1ps
// 呼吸灯模块(输出PWM波实现)
module led_breath #(
    parameter STEP = 1      //默认PWM占空比变化步长
)(
    input  wire clk,        // 时钟(100MHz)
    input  wire rst_n,      // 复位
    input  wire led_en,     // LED使能控制信号 1亮 0灭
    input  wire speed_en,   // 设置LED呼吸频率使能信号
    input  wire [2:0]speed, // LED呼吸频率(8级调节 0最慢 7最快)
    output wire led         // LED(PWM波)
);
localparam T_MAX    = 100000;// 占空比阈值变化周期的计数上限(1ms阈值变化一次)
localparam DUTY_MAX = 1000;  // 占空比计数上限(也是PWM波周期,同一占空比下周期长短不影响平均电压)
// 占空比阈值1ms变化一次,占空比计数上限1000,最小步长为1,最大8:因此LED呼吸一次周期最长2s、最短0.25s

reg [3:0]  step;            // PWM波占空比变化步长
reg [23:0] t_cnt;           // 呼吸周期计数器
reg [15:0] duty;            // 当前占空比阈值
reg [15:0] duty_cnt;        // 占空比计数
reg direction;              // 亮度变化方向 0变亮 1变暗
wire PWM;                   //PWM波信号线

// 设置PWM波占空比步长(最小步长为1,最大8)
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) 
        step <= STEP;
    else if (speed_en)
        step <= (speed==7) ? 8 : (speed+1); //步长+1:最小步长1、最大8
end

// 呼吸周期计数器
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) 
        t_cnt <= 0;
    else if (t_cnt == T_MAX-1)
        t_cnt <= 0;
    else
        t_cnt <= t_cnt + 1;
end

// PWM占空比阈值变化
always @(posedge clk or negedge rst_n) begin
    if (!rst_n) begin
        duty      <= 0;
        direction <= 0;
    end
    else if (t_cnt == T_MAX-1) begin 
        if (direction == 0) begin //变亮
            if (duty +step < DUTY_MAX) //防止占空比阈值不超过最大
                duty <= duty + step;
            else
                direction <= 1;
        end
        else begin //变暗
            if (duty -step > 0 && duty -step < DUTY_MAX) //防止减法溢出的情况
                duty <= duty - step;
            else
                direction <= 0;
        end
    end
end

// 占空比计数器
always @(posedge clk or negedge rst_n) begin
    if (!rst_n)
        duty_cnt <= 0;
    else if (duty_cnt == DUTY_MAX-1)
        duty_cnt <= 0;
    else
        duty_cnt <= duty_cnt + 1;
end
// PWM波输出
assign PWM = (duty_cnt <= duty);

// LED使能输出
assign led = led_en && PWM;

endmodule
相关推荐
LCMICRO-133108477467 小时前
国产长芯微LPS7118完全pin-pin替代ADP7118,是一款采用 CMOS 技术设计的低噪声、高 PSRR、快速瞬态响应、低压差线性稳压器
arm开发·单片机·嵌入式硬件·fpga开发·硬件工程·线性稳压器·adp7118
LCMICRO-133108477467 小时前
国产长芯微LM3042完全P2P替代LT3042,是一款高性能低压差线性稳压器
arm开发·单片机·嵌入式硬件·fpga开发·硬件工程·线性稳压器·lt3042
ARM|X86+FPGA工业主板厂家7 小时前
基于ARM+FPGA平台在精密测控领域的应用:ZYNQ高精度温振压多参融合采集系统
fpga开发
辰丁电子1 天前
PCB设计:EMMC设计规范
fpga开发·pcb设计·pcb工艺·layout·pcb layout
小蘇的FPGA2 天前
FPGA远程更新升级和测试(MultiBoot)
fpga开发
156082072192 天前
关于国微SQM7VX690T和复旦微JFM7VX690T调试
fpga开发
minglie13 天前
简易寄存器接口SMMR---正交编码器
fpga开发
神电测控3 天前
新品发布:32通道50MS/s同步并行14位采集模块PG-FMC9249(支持任意FPGA/ZYNQ,兼容LabVIEW FPGA软件开发)
fpga开发·labview·ni·神电测控·王电令·ad9249·32通道
Drgfd3 天前
半导体国产替代进入“深水区”:决战设备、材料、IP三大高地
网络·fpga开发
国产HT1621B3 天前
YL1650 LED驱动芯片详解:从原理到实战应用(附51单片机驱动代码)
stm32·单片机·嵌入式硬件·mcu·fpga开发·lcd驱动