--=====================================================
-- Проект 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;
