一、概述
原理:呼吸灯其实是在微控制器的控制下,由暗渐亮、然后再由亮渐暗,模仿人呼吸方式的 LED 灯。通过脉冲宽度调制(PWM)实现,即通过调节占空比来对模拟信号电平进行数字编码,进而控制高电平时间。
实验现象:LED灯由暗逐渐变亮,再由亮逐渐变暗。
二、实验
1、源代码
module pwm_d
#(
parameter u1s_max = 10'd999,
parameter u1ms_max = 10'd999,
parameter u1us_max = 7'd99
)
(clk,rst,led);
input clk,rst;
output led;
reg led;
reg [9:0]u1s;
reg [9:0]u1ms;
reg [6:0]u1us;
reg en;
always @(posedge clk or negedge rst)
if(!rst)
u1us <= 0;
else if(u1us == u1us_max)
u1us <= 0;
else
u1us <= u1us + 1;
always @(posedge clk or negedge rst)
if(!rst)
u1ms <= 0;
else if((u1ms == u1ms_max) && (u1us == u1us_max))
u1ms <= 0;
else if(u1us == u1us_max)
u1ms <= u1ms + 1;
else
u1ms <= u1ms;
always @(posedge clk or negedge rst)
if(!rst)
u1s <= 0;
else if((u1s == u1s_max) && (u1ms == u1ms_max) && (u1us == u1us_max))
u1s <= 0;
else if((u1ms == u1ms_max) && (u1us == u1us_max))
u1s <= u1s + 1;
else
u1s <= u1s;
always @(posedge clk or negedge rst)
if(!rst)
en <= 0;
else if((u1s == u1s_max) && (u1ms == u1ms_max) && (u1us == u1us_max))
en <= ~en;
else
en <= en;
always @(posedge clk or negedge rst)
begin
if(!rst)
led <= 0;
else if((en == 0) && (u1ms <= u1s) || (en == 1) && (u1ms >= u1s))
led <= 1;
else
led <= 0;
end
endmodule
2、仿真代码
`timescale 1ns / 1ps
module hxd_fz;
reg clk,rst;
wire led;
pwm_d
#(
.u1s_max(5),
.u1ms_max(5),
.u1us_max(1)
)
u1(clk,rst,led);
initial
begin
rst <= 0;
#20 rst <= 1;
end
initial
begin
clk <= 0;
while(1) #5 clk <= ~clk;
end
endmodule
三、实验现象
hxd