1.脉冲宽度调制(Pulse Width Modulation,PWM)
仅从本次实验(呼吸灯)的角度进行解释:通过不断调节信号的占空比来改变LED灯的亮度,如占空比逐渐递增会使得LED逐渐变亮,占空比逐渐递减会使得LED逐渐变暗。
其原因是LED会根据单位时间内通过的电量改变自身亮度。
实验原理:
本实验中,占空比初始值为0,以1kHz的频率,即每隔1ms占空比增加一个定值(具体值的大小影响呼吸灯变化的快慢),当占空比增加到100%则开始递减,当占空比递减至0,继续开始递增,如此循环。
2.VHDL代码(基于领航者开发板)
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity breath_led is
Port (
clk : in std_logic;
rst_n : in std_logic;
led : out std_logic
);
end breath_led;
architecture Behavioral of breath_led is
signal period_cnt : integer; --周期计数器频率:1khz 周期:1ms 计数值:1ms/20ns=50000
signal duty_cycle : integer; --占空比数值
signal inc_dec_flag : std_logic; --0 递增 1 递减
begin
--led赋值
led <= '1' when (period_cnt >= duty_cycle) else
'0';
--计时器,1ms
process(clk, rst_n)
begin
if (rst_n='0') then
period_cnt <= 0;
else
if (clk'event and clk='1') then
if (period_cnt = 50_000) then
period_cnt <= 0;
else
period_cnt <= period_cnt + 1;
end if;
end if;
end if;
end process;
--在周期计数器的节拍下递增或递减占空比
process(clk, rst_n)
begin
if (rst_n='0') then
duty_cycle <= 0;
inc_dec_flag <= '0';
else
if (clk'event and clk='1') then
if (period_cnt=50_000) then --计满1ms,即1ms才变换一次占空比
if (inc_dec_flag='0') then --占空比递增状态,呼吸灯逐渐变亮
if (duty_cycle=50_000) then --如果占空比已递增至最大
inc_dec_flag <= '1'; --则占空比开始递减
else
duty_cycle <= duty_cycle + 25; --否则占空比以25为单位递增
end if;
else --占空比递减状态,呼吸灯逐渐变暗
if (duty_cycle=0) then --如果占空比已递减至0
inc_dec_flag <= '0'; --则占空比开始递增
else
duty_cycle <= duty_cycle - 25; --否则占空比以25为单位递减
end if;
end if;
end if;
end if;
end if;
end process;
end Behavioral;
管脚约束:
set_property -dict {PACKAGE_PIN U18 IOSTANDARD LVCMOS33} [get_ports clk]
set_property -dict {PACKAGE_PIN J15 IOSTANDARD LVCMOS33} [get_ports rst_n]
set_property -dict {PACKAGE_PIN J16 IOSTANDARD LVCMOS33} [get_ports led]