Files
AD7766_fw/tb/ad7766_model.vhd
T

94 lines
3.1 KiB
VHDL

----------------------------------------------------------------------------------
-- 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;