一、设计文件
//======================================================================
// --- 名称 : breathing_led
// --- 作者 : 又菜又爱玩
// --- 日期 : 2024-4-5
// --- 描述 : PWM频率调制实现呼吸灯的效果,4秒1次循环,
// 每2ms秒变化1次,前2秒亮度增大,后2秒亮度减小
//======================================================================
module breathing_led
(
input clk ,
input rst ,
output reg led
);
reg [16:0] cnt_2ms;
reg [10:0] cnt_2ms22s;
reg [16:0] pwm;
reg s;
always @(posedge clk or negedge rst)
if (~rst)
cnt_2ms <= 17'b0;
else if (cnt_2ms == 17'd99999)
cnt_2ms <= 17'd0;
else
cnt_2ms <= cnt_2ms + 1'b1;
always @ (posedge clk or negedge rst)
if (!rst)
cnt_2ms22s <= 10'b0;
else if (cnt_2ms22s == 11'd1999)
cnt_2ms22s <= 10'b0;
else if (cnt_2ms == 17'd99999)
cnt_2ms22s <= cnt_2ms22s + 1'b1;
else
cnt_2ms22s <= cnt_2ms22s;
always @(posedge clk or negedge rst )
if(~rst)
s <= 'b0;
else if (cnt_2ms == 17'd99999)
s <= 1'b1;
else
s <= 1'b0;
always @(posedge clk or negedge rst)
if (~rst)
pwm <= 17'd0;
else if(s==1'b1 & cnt_2ms22s < 1000)
pwm <= pwm + 7'd100;
else if(s==1'b1 & cnt_2ms22s > 999)
pwm <= pwm - 100;
always @(posedge clk or negedge rst)
if (~rst)
led <= 1'b0;
else if(cnt_2ms < pwm)
led <= 1'b1;
else
led <= 1'b0;
endmodule
二、仿真文件
`timescale 1ns/1ps //时间精度
`define Clock 20
module breathing_led_tb;
//---------------------<端口定义>---------------------------------------
reg clk ; //时钟,50Mhz
reg rst ; //复位,低电平有效
wire led ;
//----------------------------------------------------------------------
//-- 模块例化
//----------------------------------------------------------------------
breathing_led
u_breathing_led
(
.clk (clk ),
.rst (rst ),
.led (led )
);
//----------------------------------------------------------------------
//-- 时钟信号和复位信号
//----------------------------------------------------------------------
initial begin
rst = 0; #(`Clock*20+1);
rst = 1;
end
initial begin
clk = 1;
forever
#(`Clock/2) clk = ~clk;
end
endmodule
三、仿真波形