呼吸灯-#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 |
仿真结果

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
浙公网安备 33010602011771号