PWM脉冲宽度调制,实现呼吸灯_领航者开发板

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]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值