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

Проект 24. Прямой цифровой синтез (DDS)

Частота задаётся числом: накопитель фазы переполняется тем быстрее, чем больше приращение. Старшие разряды фазы адресуют таблицу синуса.

Задача

Сформировать сигнал с частотой, задаваемой цифровым кодом.

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

Алгоритм

  1. Накапливать фазу, прибавляя приращение каждый такт.
  2. Позволить аккумулятору переполняться — это и задаёт период.
  3. Старшими разрядами фазы адресовать таблицу отсчётов.
  4. Менять приращение для перестройки частоты.

Код на 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.