end v1 ;
-- 2-input NAND
library ieee ;
use ieee.std_logic_1164.all ;
entity NAND2 is
port (
IN1,IN0 : in std_logic ;
Z : out std_logic
) ;
end NAND2 ;
architecture v1 of NAND2 is
begin
Z <= not (IN1 and IN0) after 1 ns ;
-- Inverter
entity INV is
IN0 : in std_logic ;
end INV ;
architecture v1 of INV is
Z <= not IN0 after 1 ns ;
-- Buffer
entity BUF is
end BUF ;
architecture v1 of BUF is
Z <= IN0 after 1 ns ;
-- 2-1 Multiplexer
entity MUX21 is
port (IN0,IN1,SEL : in std_logic ;
end MUX21 ;
architecture v1 of MUX21 is
Z <= IN0 after 1 ns when SEL = '0' else IN1 ;
end ;
-- 4-1 Multiplexer
entity MUX41 is
port (IN0,IN1,IN2,IN3,SEL0,SEL1 : in std_logic ;
end MUX41 ;
architecture v1 of MUX41 is
signal SEL : std_logic_vector(1 downto 0) ;
SEL <= SEL1 & SEL0 ;
Z <= IN0 when SEL = "00" else
IN1 when SEL = "01" else
IN2 when SEL = "10" else
IN3 ;
Далее составим модели для каждого устройства разделения данных, при этом дополнительно оптимизируем набор элементов и соединений для получения наибольшего возможного соответствия между задержками распространения выходных сигналов.
--DS1851.vhd
--Data Separator for AD1851/AD1861/AD1862/AD1865 parallel DAC
entity DS1851 is
RST : in std_logic;
SCLK : in std_logic;
SDATA : in std_logic;
LRCLK : in std_logic;
RL1 : in std_logic;
RL0 : in std_logic;
LE : out std_logic;
CLK : out std_logic;
DOL : out std_logic;
DOR : out std_logic
);
end DS1851;
architecture v1 of DS1851 is
component SPREG16R
port ( RST : in std_logic ;
CLK : in std_logic ;
SI : in std_logic ;
Q15,Q14,Q13,Q12,Q11,Q10,Q9,Q8 : out std_logic ;
Q7,Q6,Q5,Q4,Q3,Q2,Q1,Q0 : out std_logic
end component ;
component SPREG32R
Q31,Q30,Q29,Q28,Q27,Q26,Q25,Q24 : out std_logic;
Q23,Q22,Q21,Q20,Q19,Q18,Q17,Q16 : out std_logic;
component DFFR
port (RST : in std_logic ;
D : in std_logic ;
Q : out std_logic ;
QN : out std_logic
component INV
end component;
component BUF
component MUX41
signal nLRCLK, pLRCLK, nSCLK, pSCLK, nSDATA, pSDATA : std_logic;
signal i24b, i20b, i18b, i16b : std_logic;
signal RESET, iDOL, iDOR, iCLK, iLE : std_logic;
RSTI: INV port map (IN0 => RST, Z => RESET);
DD1A: INV port map (IN0 => SCLK, Z => nSCLK);
DD1D: INV port map (IN0=> nSCLK, Z => pSCLK);
DD1B: INV port map (IN0 => SDATA, Z => nSDATA);
DD1E: INV port map (IN0 => nSDATA, Z => pSDATA);
DD1C: INV port map (IN0 => LRCLK, Z => nLRCLK);
DD1F: INV port map (IN0 => nLRCLK, Z => pLRCLK);
CLKB: BUF port map (IN0 => nSCLK, Z => iCLK);
DD2: SPREG16R port map (RST => RESET, CLK => pSCLK, SI => pSDATA,
Q7 => i24b, Q11 => i20b, Q13 => i18b, Q15 => i16b);
DDMX: MUX41 port map (IN0 => i24b, IN1 => i20b, IN2 => i18b, IN3 => i16b,
SEL0 => RL0, SEL1 => RL1, Z => iDOR);
DD4: DFFR port map (RST => RESET, D => pLRCLK, CLK => pSCLK, Q => iLE);
DD5: SPREG32R port map (RST => RESET, CLK => pSCLK, SI => iDOR,
Q31 => iDOL);
BUFE: BUF port map (IN0 => iLE, Z => LE);
BUFC: BUF port map (IN0 => iCLK, Z => CLK);
BUFL: BUF port map (IN0 => iDOL, Z => DOL);
BUFR: BUF port map (IN0 => iDOR, Z => DOR);
--DS1853.vhd
--Data Separator for AD1852/AD1853 delta-sigma DAC
entity DS1853 is
BCLK : in std_logic;
MCLK : in std_logic;
BCLK_O : out std_logic;
LRCLK_O : out std_logic;
SDATA_L : out std_logic;
SDATA_R : out std_logic;
MCLK_O : out std_logic
end DS1853;
architecture v1 of DS1853 is
component SPREG64R
Q63,Q62,Q61,Q60,Q59,Q58,Q57,Q56 : out std_logic;
Q55,Q54,Q53,Q52,Q51,Q50,Q49,Q48 : out std_logic;
Q47,Q46,Q45,Q44,Q43,Q42,Q41,Q40 : out std_logic;
Q39,Q38,Q37,Q36,Q35,Q34,Q33,Q32 : out std_logic;
Q15,Q14,Q13,Q12,Q11,Q10,Q9,Q8 : out std_logic;
component MUX21
signal iBCLK, iSDATA, iLRCLK, iMCLK : std_logic;
signal RESET, nLRCLK, pLRCLK : std_logic;
signal o31, o63, o31n, o31p, o63n, bSDATA: std_logic;
INBB: BUF port map (IN0 => BCLK, Z => iBCLK);
INBS: BUF port map (IN0 => SDATA, Z => bSDATA);
INBL: BUF port map (IN0 => LRCLK, Z => iLRCLK);
INBM: BUF port map (IN0 => MCLK, Z => iMCLK);
DD12A: DFFR port map (RST => RESET, D => iLRCLK,
CLK => iBCLK, Q => pLRCLK, QN => nLRCLK);
DD12B: DFFR port map (RST => RESET, D => bSDATA,
CLK => iBCLK, Q => iSDATA);
DD1: SPREG64R port map (RST => RESET, SI => iSDATA,
CLK => iBCLK, Q31 => o31, Q63 => o63);
O31B: BUF port map (IN0 => o31, Z => o31p);
O31I: INV port map (IN0 => o31, Z => o31n);
O63I: INV port map (IN0 => o63, Z => o63n);
MUXL: MUX21 port map (IN0 => o63n, IN1 => o31p,
SEL => pLRCLK, Z => SDATA_L);
MUXR: MUX21 port map (IN0 => o31n, IN1 => iSDATA,
SEL => pLRCLK, Z => SDATA_R);
INVL: INV port map (IN0 => pLRCLK, Z => LRCLK_O);
INVB: INV port map (IN0 => iBCLK, Z => BCLK_O);
INVM: INV port map (IN0 => iMCLK, Z => MCLK_O);
Далее необходимо составить код для генератора отладочной последовательности.
--Tester1851.vhd
--Test signal generator for DS1851
entity Tester1851 is
CLK : in std_logic
end Tester1851;
architecture v1 of Tester1851 is
component TS1851
RST : out std_logic;
SDATA : out std_logic;
LRCLK : out std_logic
component DS1851
signal SCLK, SDATA, LRCLK, RST : std_logic;
signal LD1, LD2, LD3, RD1, RD2, RD3, DSReg : std_logic_vector (31 downto 0);
D0: BUF port map (IN0 => CLK, Z => SCLK);
D2: DS1851 port map (RST => RST, SCLK => SCLK,
SDATA => SDATA, LRCLK => LRCLK,
RL1 => '1', RL0 => '1');
Test: process
LD1 <= "01100110000000011000000000000000";
RD1 <= "01111000000001111000000000000000";
LD2 <= "01100110000111111000000000000000";
RD2 <= "01111000011111111000000000000000";
LD3 <= "01100111111111111000000000000000";
RD3 <= "01111111111111111000000000000000";
SDATA <= '0';
LRCLK <= '1';
RST <= '0';
wait for 50ns;
RST <= '1';
wait on SCLK until SCLK='0';
DSReg <= LD1;
wait for 10ns;
LRCLK <= '0';
SDATA <= DSReg(31);
LD1L: for i in 30 downto 0 loop
DSReg <= DSReg(30 downto 0) & '0';
end loop LD1L;
DSReg <= RD1;
RD1L: for i in 30 downto 0 loop
end loop RD1L;
DSReg <= LD2;
LD2L: for i in 30 downto 0 loop
end loop LD2L;
DSReg <= RD2;
RD2L: for i in 30 downto 0 loop
end loop RD2L;
DSReg <= LD3;
LD3L: for i in 30 downto 0 loop
end loop LD3L;
DSReg <= RD3;
RD3L: for i in 30 downto 0 loop
end loop RD3L;
wait;
end process;
end v1;
--Tester1853.vhd
--Test signal generator for DS1853
entity Tester1853 is
end Tester1853;
architecture v1 of Tester1853 is
component TS1853
component DS1853
signal BCLK, SDATA, LRCLK, RST : std_logic;
D0: BUF port map (IN0 => CLK, Z => BCLK);
D2: DS1853 port map (RST => RST, BCLK => BCLK,
MCLK => BCLK);
wait on BCLK until BCLK='0';
При выполнении работы были рассмотрены вопросы реализации разделения цифрового потока от приемника сигнала SPDIF (и/или AES/EBU) для подачи его непосредственно на микросхемы ЦАП. Из набора наиболее часто используемых способов реализации были выбраны наиболее универсальные и лучшим образом отвечающие требованиям стандарта.
При схемной реализации была выполнена оптимизация схемы для получения наилучших условий прохождения сигнала. Также была затронута проблема обеспечения качественной фильтрации питания в аппаратуре с большим числом цифровых микросхем.
В результате выполнения работы были получены работающие схемы, пригодные к воплощению в готовом устройстве. Работа схем была промоделирована на языке VHDL. Помимо VHDL моделей был получен готовый код, пригодный для прошивки кристалла ПЛМ.
Тем не менее, основным результатом работы следует считать закрепление знаний по дисциплинам "Прикладная теория цифровых автоматов", "Цифровая схемотехника" и "Моделирование на языке VHDL", а также повышение опыта работы с соответствующими средствами и способами разработки.
Страницы: 1, 2, 3, 4