94 lines
3.1 KiB
VHDL
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;
|