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

Проект 29. Сигма-дельта ЦАП

Одна цифровая ножка и RC-цепочка дают аналоговое напряжение с разрядностью, недостижимой для простого ШИМ. Весь секрет — в накоплении ошибки.

Задача

Получить аналоговое напряжение, управляя одним цифровым выводом.

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

Алгоритм

  1. Объявить накопитель на разряд шире разрядности данных.
  2. Каждый такт прибавлять к нему входной код.
  3. Старший разряд накопителя вывести на ножку.
  4. Сгладить результат внешней RC-цепочкой.

Код на VHDL

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

--=====================================================
-- Проект 29. Сигма-дельта ЦАП
-- Один цифровой вывод плюс RC-фильтр дают
-- аналоговое напряжение высокой разрядности.
--=====================================================
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;

entity sigma_delta_dac is
    generic (
        WIDTH : integer := 8
    );
    port (
        clk     : in  std_logic;
        rst     : in  std_logic;
        din     : in  std_logic_vector(WIDTH-1 downto 0);   -- код уровня
        dac_out : out std_logic                             -- на RC-фильтр
    );
end entity sigma_delta_dac;

architecture rtl of sigma_delta_dac is
    -- аккумулятор на разряд шире: старший бит и есть выход
    signal acc : unsigned(WIDTH downto 0) := (others => '0');
begin
    process (clk, rst)
    begin
        if rst = '1' then
            acc <= (others => '0');
        elsif rising_edge(clk) then
            -- накапливаем код, перенос уходит в выходной бит
            acc <= ('0' & acc(WIDTH-1 downto 0)) + ('0' & unsigned(din));
        end if;
    end process;

    dac_out <= acc(WIDTH);
end architecture rtl;

Пояснения

  • В отличие от ШИМ, импульсы здесь распределены по времени равномерно, поэтому пульсации на выходе фильтра многократно меньше при той же частоте.
  • Переполнение накопителя — не ошибка, а рабочий механизм: перенос и есть выходной поток бит.
  • Постоянную времени RC выбирают много больше периода тактов, но меньше периода полезного сигнала.

Что дальше

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