呼吸灯-#DE10-Lite

这是一个适用于 FPGA/CPLD 的 Verilog 呼吸灯代码,采用 PWM 原理实现。代码默认板载时钟为 50MHz,呼吸周期为 4 秒(2 秒渐亮,2 秒渐暗),LED 高电平点亮。

 

设计原理

通过三个级联计数器,将一个 2 秒的时间划分为 2ms 的 1000 个小段。再用一个线性递增/递减的计数值作为比较阈值,通过改变 PWM 占空比,实现 LED 亮度的平滑变化。

引脚分配

信号名

管脚名

管脚号

clk

MAX10_CLK1_50

P11

rst_n

KEY0

B8

led

LEDR9

B11

 

仿真结果

 

image

 

module led_breath_v2(
    input clk,
    input rst_n,
    output led
    );
    
    parameter T_2us = 100;
    parameter T_2ms = 1000;
    parameter T_2s = 1000;
    
    reg [6:0] cnt_2us;
    reg [9:0] cnt_2ms;
    reg [9:0] cnt_2s;
    
    //2us counter
    always @(posedge clk,negedge rst_n)
        begin
            if(!rst_n)
                cnt_2us <= 0;
            else
                if(cnt_2us < T_2us - 1)
                    cnt_2us <= cnt_2us + 1;
                else
                    if(cnt_2us == T_2us - 1)
                        cnt_2us <= 0;
                    else
                        cnt_2us <= cnt_2us;
        end
        
    wire flag_2us;
    
    assign flag_2us = (cnt_2us == T_2us - 1) ? 1'b1 : 1'b0;
    
    //2ms counter
    always @(posedge clk,negedge rst_n)
        begin
            if(!rst_n)
                cnt_2ms <= 0;
            else
                if(cnt_2ms < T_2ms - 1 && flag_2us)
                    cnt_2ms <= cnt_2ms + 1;
                else
                    if(cnt_2ms == T_2ms - 1 && flag_2us)
                        cnt_2ms <= 0;
                    else
                        cnt_2ms <= cnt_2ms;
        end
        
    wire flag_2ms;
    
    assign flag_2ms = (cnt_2ms == T_2ms - 1 && flag_2us) ? 1'b1 : 1'b0;
    
    //2s counter
    always @(posedge clk,negedge rst_n)
        begin
            if(!rst_n)
                cnt_2s <= 0;
            else
                if(cnt_2s < T_2s - 1 && flag_2ms)
                    cnt_2s <= cnt_2s + 1;
                else
                    if(cnt_2s == T_2s - 1 && flag_2ms)
                        cnt_2s <= 0;
                    else
                        cnt_2s <= cnt_2s;
        end
        
    
    wire led_temp;
    
    assign led_temp = (cnt_2s > cnt_2ms) ? 1'b1 : 1'b0;
    
    reg change_en;
    //呼-吸切换
    always @(posedge clk,negedge rst_n)
        begin
            if(!rst_n)
                change_en <= 1'b0;
            else 
                if(cnt_2s == T_2s - 1 && flag_2ms)
                    change_en <= ~change_en;
                else
                    change_en <= change_en;
        end
        
    assign led = (!change_en) ? led_temp : ~led_temp;
    
endmodule

 

posted on 2026-03-28 11:14  yf.x  阅读(4)  评论(0)    收藏  举报

导航