Задача
Сформировать сигнал с частотой, задаваемой цифровым кодом.
Тип схемы: Синхронный накопитель фазы, работает совместно с таблицей отсчётов.
Модуль: dds. Среда: Quartus, Vivado, ISE или свободный GHDL для моделирования.
Теорию по языку смотрите в статье VHDL — язык описания аппаратуры,
по самим микросхемам — на странице ПЛИС.
Алгоритм
- Накапливать фазу, прибавляя приращение каждый такт.
- Позволить аккумулятору переполняться — это и задаёт период.
- Старшими разрядами фазы адресовать таблицу отсчётов.
- Менять приращение для перестройки частоты.
Код на VHDL
Код проверен компилятором GHDL: проходит анализ и элаборацию без ошибок и предупреждений. Скачать: v24.vhd
--=====================================================
-- Проект 24. Прямой цифровой синтез (DDS)
-- Накопитель фазы адресует таблицу синуса.
-- Частота задаётся приращением фазы за такт.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity dds is
generic ( PHASE_W : integer := 24 ); -- разрядность аккумулятора
port (
clk : in std_logic;
rst : in std_logic;
step : in std_logic_vector(PHASE_W-1 downto 0); -- код частоты
addr : out std_logic_vector(4 downto 0); -- адрес таблицы
phase : out std_logic_vector(PHASE_W-1 downto 0)
);
end entity dds;
architecture rtl of dds is
signal acc : unsigned(PHASE_W-1 downto 0) := (others => '0');
begin
process (clk, rst)
begin
if rst = '1' then
acc <= (others => '0');
elsif rising_edge(clk) then
acc <= acc + unsigned(step); -- переполнение задаёт период
end if;
end process;
-- старшие разряды фазы адресуют таблицу отсчётов
addr <= std_logic_vector(acc(PHASE_W-1 downto PHASE_W-5));
phase <= std_logic_vector(acc);
end architecture rtl;
Пояснения
- Выходная частота равна тактовой, умноженной на приращение и делённой на два в степени разрядности аккумулятора.
- При 24 разрядах и 50 МГц шаг перестройки составляет около трёх герц — отсюда исключительная точность метода.
- Разрядность аккумулятора отвечает за разрешение по частоте, а разрядность адреса таблицы — за чистоту спектра.
Что дальше
Следующие проекты — в разделе проекты на VHDL. Сравнить подход с языком Verilog можно в статье Verilog, а разобраться в устройстве самих кристаллов — в статье ПЛИС: FPGA и CPLD.