Задача
Сформировать сигнал с регулируемой скважностью.
Тип схемы: Синхронная схема: счётчик и компаратор.
Модуль: pwm. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования.
Теорию по языку смотрите в статье VHDL — язык описания аппаратуры,
по самим микросхемам — на странице ПЛИС.
Алгоритм
- Задать разрядность параметром
generic. - Непрерывно наращивать счётчик по фронту такта.
- Сравнивать его со значением скважности.
- Держать выход активным, пока счётчик меньше уставки.
Код на 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.