AFON // радиотехник affonya@mail.ru
← Проекты на VHDL

Проект 10. Широтно-импульсный модулятор

Свободно бегущий счётчик сравнивается с заданной скважностью — так получается ШИМ. Разрядность задаётся параметром, поэтому модуль подходит и для светодиода, и для двигателя.

Задача

Сформировать сигнал с регулируемой скважностью.

Тип схемы: Синхронная схема: счётчик и компаратор.
Модуль: pwm. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования. Теорию по языку смотрите в статье VHDL — язык описания аппаратуры, по самим микросхемам — на странице ПЛИС.

Алгоритм

  1. Задать разрядность параметром generic.
  2. Непрерывно наращивать счётчик по фронту такта.
  3. Сравнивать его со значением скважности.
  4. Держать выход активным, пока счётчик меньше уставки.

Код на VHDL

Код проверен компилятором GHDL: проходит анализ и элаборацию без ошибок и предупреждений. Скачать: v10.vhd

--=====================================================
-- Проект 10. Широтно-импульсный модулятор
-- Счётчик периода сравнивается с заданной скважностью.
-- Разрядность задаётся параметром generic.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity pwm is
    generic (
        WIDTH : integer := 8                            -- разрядность ШИМ
    );
    port (
        clk     : in  std_logic;
        rst     : in  std_logic;
        duty    : in  std_logic_vector(WIDTH-1 downto 0);   -- скважность
        pwm_out : out std_logic
    );
end entity pwm;

architecture rtl of pwm is
    signal cnt : unsigned(WIDTH-1 downto 0) := (others => '0');
begin
    process (clk, rst)
    begin
        if rst = '1' then
            cnt <= (others => '0');
        elsif rising_edge(clk) then
            cnt <= cnt + 1;                             -- свободно бегущий счётчик
        end if;
    end process;

    -- выход активен, пока счётчик меньше значения скважности
    pwm_out <= '1' when cnt < unsigned(duty) else '0';
end architecture rtl;

Пояснения

  • Частота ШИМ равна тактовой частоте, делённой на два в степени разрядности: при 50 МГц и восьми разрядах получается около 195 кГц.
  • Сравнение выполняется над типом unsigned, поэтому входной вектор приводится к нему прямо в выражении.
  • Больше разрядность — точнее регулировка, но ниже частота ШИМ; выбор всегда компромисс между этими величинами.

Что дальше

Следующие проекты — в разделе проекты на VHDL. Сравнить подход с языком Verilog можно в статье Verilog, а разобраться в устройстве самих кристаллов — в статье ПЛИС: FPGA и CPLD.