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