---------------------------------------------------------------------------------- -- Module Name: ad7766_model -- Project Name: AD7766_prj -- Description: -- Поведенческая модель AD7766 для симуляции. Не синтезируется. -- Воспроизводит: сброс фильтра по SYNC/PD, задержку tSETTLING, период DRDY -- в 8 периодов MCLK, выдачу MSB по спаду CS и остальных бит по спадам SCLK. -- Времена tN — по AD7766 Data Sheet Rev. D, Table 3. ---------------------------------------------------------------------------------- library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity ad7766_model is generic ( SETTLING_MCLK : integer := 590; -- tSETTLING для AD7766, Table 7 ODR_DIV : integer := 8; -- ODR = MCLK/8 для AD7766, Table 6 T4 : time := 265 ns; T5 : time := 294 ns; T7 : time := 6 ns; T8 : time := 24 ns ); port ( mclk : in std_logic; sync_pd_n : in std_logic; cs_n : in std_logic; sclk : in std_logic; next_word : in std_logic_vector(23 downto 0); sdo : out std_logic; drdy : out std_logic; word_tick : out std_logic -- строб: слово защёлкнуто в выходной регистр ); end entity ad7766_model; architecture model of ad7766_model is signal out_reg : std_logic_vector(23 downto 0) := (others => '0'); signal bit_idx : integer range 0 to 23 := 23; signal settled : std_logic := '0'; signal s_cnt : integer := 0; signal div : integer range 0 to ODR_DIV - 1 := 0; begin drdy_proc : process (mclk, sync_pd_n) begin if sync_pd_n = '0' then -- SYNC/PD низкий: выходной регистр недействителен, DRDY уходит вверх drdy <= '1'; settled <= '0'; s_cnt <= 0; div <= 0; word_tick <= '0'; elsif rising_edge(mclk) then word_tick <= '0'; if settled = '0' then if s_cnt = SETTLING_MCLK - 1 then settled <= '1'; div <= 0; out_reg <= next_word; word_tick <= '1'; drdy <= '1' after T4, '0' after T4 + T5; else s_cnt <= s_cnt + 1; end if; else if div = ODR_DIV - 1 then div <= 0; out_reg <= next_word; word_tick <= '1'; drdy <= '1' after T4, '0' after T4 + T5; else div <= div + 1; end if; end if; end if; end process drdy_proc; -- MSB встаёт на SDO по спаду CS, остальные биты — спадами SCLK (стр. 17) shift_proc : process (cs_n, sclk) begin if cs_n = '1' then bit_idx <= 23; elsif falling_edge(sclk) then if bit_idx > 0 then bit_idx <= bit_idx - 1; end if; end if; end process shift_proc; sdo <= 'Z' after T7 when cs_n = '1' else out_reg(bit_idx) after T8; end architecture model;