Рис. 11. – схема электрическая принципиальная устройства разделения данных для монофонического подключения микросхемы ЦАП AD1852 (AD1853)
Входы и выходы на схеме обозначены подобно обозначениям на схеме из документации на AD1852.
Для обеспечения устойчивости данных во время загрузки, сигнал BCLK_O для микросхем ЦАП инвертирован относительно сигнала BCLK, по которому происходит загрузка данных в регистры и сдвиг. Это позволяет загрузить данные в микросхемы ЦАП в тот момент, когда на выходах регистров получены устойчивые состояния данных. Для того чтобы при этом не возникало смещения между сигналом LRCLK и SDATA_L/SDATA_R, сигнал LRCLK тактируется сигналом BCLK. Мультиплексоры на микросхемах DD10, DD11 управляются уже тактированным сигналом LRCLK. Для этого используется D-триггер 74HC74, функциональным аналогом которого является микросхема К155ТМ2. Поскольку AD1852(AD1853) также использует сигнал MCLK (128Fs/256Fs/384Fs), который связан с сигналом BCLK, сигнал MCLK_O также инвертирован. Также в связи с подачей на микросхемы ЦАП инвертированного сигнала SCLK возникает необходимость обеспечить дополнительное смещение всей последовательности входных данных еще на один клок, что выполняется D-триггером DD12A.
При необходимости на входе устанавливаются буферные элементы.
Конденсаторы C1-C24 устанавливаются непосредственно возле выводов питания микросхем. C1-C12 – конденсаторы с твердым электролитом SANYOOs-ConSA 10mx 6.3V, С13-С24 – керамические конденсаторы для поверхностного монтажа типоразмера 1206, емкостью 100n и группой ТКЕ X7R. Такой выбор обусловливает максимальную эффективность подавления помех по питанию при сохранении относительно невысокой стоимости устройства.
Вход схем RESET подключается к генератору сброса системы. Активным уровнем сброса является уровень логического "0". Данный узел может быть выполнен, к примеру, на микросхеме ADM707.
Несмотря на то, что микросхемы ЦАП часто имеют питание цифровой части 5 V, имеет смысл выделить для них отдельный источник питания, а не использовать один источник для схемы разделения цифрового потока и ЦАП одновременно. Это позволит уменьшить уровень помех, проникающих из цифровой части микросхемы ЦАП в аналоговую часть устройства и улучшит звучание системы.
Рис. 12. - Временная диаграмма работы устройства разделения данных для микросхемы ЦАП AD1851
Рис. 13. - Временная диаграмма работы устройства разделения данных для микросхемы ЦАП AD1852
Поскольку полученные схемы не всегда удобно размещать в конечном устройстве ввиду их громоздкости, имеет смысл создать проект на языке VHDL и составить код для программирования кристалла ПЛМ. Помимо значительного сокращения занимаемой на плате площади это позволит также поднять общее быстродействие модуля разделения потоков данных, снизить наводимые цифровые помехи, промоделировать устройство без пайки.
Коды на языке VHDL представлены ниже с краткими пояснениями, где это необходимо.
Для начала выберем необходимые компоненты и составим их модели:
--Components.vhd
--16-bit Serial to Parallel Shift Register with asynchronous reset
library ieee ;
use ieee.std_logic_1164.all ;
entity SPREG16R is
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 SPREG16R ;
architecture v1 of SPREG16R is
signal sreg16 : std_logic_vector (15 downto 0) ;
begin
process (RST,CLK)
begin
if RST = '1' then
sreg16 <= (others => '0') ;
elsif CLK = '1' and CLK'event then
sreg16 <= sreg16(14 downto 0) & SI ;
end if ;
end process ;
Q15 <= sreg16(15) after 1 ns ;
Q14 <= sreg16(14) after 1 ns ;
Q13 <= sreg16(13) after 1 ns ;
Q12 <= sreg16(12) after 1 ns ;
Q11 <= sreg16(11) after 1 ns ;
Q10 <= sreg16(10) after 1 ns ;
Q9 <= sreg16(9) after 1 ns ;
Q8 <= sreg16(8) after 1 ns ;
Q7 <= sreg16(7) after 1 ns ;
Q6 <= sreg16(6) after 1 ns ;
Q5 <= sreg16(5) after 1 ns ;
Q4 <= sreg16(4) after 1 ns ;
Q3 <= sreg16(3) after 1 ns ;
Q2 <= sreg16(2) after 1 ns ;
Q1 <= sreg16(1) after 1 ns ;
Q0 <= sreg16(0) after 1 ns ;
end v1 ;
--32-bit Serial to Parallel Shift Register with asynchronous reset
library ieee ;
use ieee.std_logic_1164.all ;
entity SPREG32R is
port ( RST : in std_logic ;
CLK : in std_logic ;
SI : in std_logic ;
Q31,Q30,Q29,Q28,Q27,Q26,Q25,Q24 : out std_logic;
Q23,Q22,Q21,Q20,Q19,Q18,Q17,Q16 : out 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 SPREG32R ;
architecture v1 of SPREG32R is
signal sreg32 : std_logic_vector (31 downto 0) ;
begin
process (RST,CLK)
begin
if RST = '1' then
sreg32 <= (others => '0') ;
elsif CLK = '1' and CLK'event then
sreg32 <= sreg32(30 downto 0) & SI ;
end if ;
end process ;
Q31 <= sreg32(31) after 1 ns ;
Q30 <= sreg32(30) after 1 ns ;
Q29 <= sreg32(29) after 1 ns ;
Q28 <= sreg32(28) after 1 ns ;
Q27 <= sreg32(27) after 1 ns ;
Q26 <= sreg32(26) after 1 ns ;
Q25 <= sreg32(25) after 1 ns ;
Q24 <= sreg32(24) after 1 ns ;
Q23 <= sreg32(23) after 1 ns ;
Q22 <= sreg32(22) after 1 ns ;
Q21 <= sreg32(21) after 1 ns ;
Q20 <= sreg32(20) after 1 ns ;
Q19 <= sreg32(19) after 1 ns ;
Q18 <= sreg32(18) after 1 ns ;
Q17 <= sreg32(17) after 1 ns ;
Q16 <= sreg32(16) after 1 ns ;
Q15 <= sreg32(15) after 1 ns ;
Q14 <= sreg32(14) after 1 ns ;
Q13 <= sreg32(13) after 1 ns ;
Q12 <= sreg32(12) after 1 ns ;
Q11 <= sreg32(11) after 1 ns ;
Q10 <= sreg32(10) after 1 ns ;
Q9 <= sreg32(9) after 1 ns ;
Q8 <= sreg32(8) after 1 ns ;
Q7 <= sreg32(7) after 1 ns ;
Q6 <= sreg32(6) after 1 ns ;
Q5 <= sreg32(5) after 1 ns ;
Q4 <= sreg32(4) after 1 ns ;
Q3 <= sreg32(3) after 1 ns ;
Q2 <= sreg32(2) after 1 ns ;
Q1 <= sreg32(1) after 1 ns ;
Q0 <= sreg32(0) after 1 ns ;
end v1 ;
--64-bit Serial to Parallel Shift Register with asynchronous reset
library ieee ;
use ieee.std_logic_1164.all ;
entity SPREG64R is
port ( RST : in std_logic ;
CLK : in std_logic ;
SI : in std_logic ;
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;
Q31,Q30,Q29,Q28,Q27,Q26,Q25,Q24 : out std_logic;
Q23,Q22,Q21,Q20,Q19,Q18,Q17,Q16 : out 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 SPREG64R ;
architecture v1 of SPREG64R is
signal sreg64 : std_logic_vector (63 downto 0) ;
begin
process (RST,CLK)
begin
if RST = '1' then
sreg64 <= (others => '0') ;
elsif CLK = '1' and CLK'event then
sreg64 <= sreg64(62 downto 0) & SI ;
end if ;
end process ;
Q63 <= sreg64(63) after 1 ns ;
Q62 <= sreg64(62) after 1 ns ;
Q61 <= sreg64(61) after 1 ns ;
Q60 <= sreg64(60) after 1 ns ;
Q59 <= sreg64(59) after 1 ns ;
Q58 <= sreg64(58) after 1 ns ;
Q57 <= sreg64(57) after 1 ns ;
Q56 <= sreg64(56) after 1 ns ;
Q55 <= sreg64(55) after 1 ns ;
Q54 <= sreg64(54) after 1 ns ;
Q53 <= sreg64(53) after 1 ns ;
Q52 <= sreg64(52) after 1 ns ;
Q51 <= sreg64(51) after 1 ns ;
Q50 <= sreg64(50) after 1 ns ;
Q49 <= sreg64(49) after 1 ns ;
Q48 <= sreg64(48) after 1 ns ;
Q47 <= sreg64(47) after 1 ns ;
Q46 <= sreg64(46) after 1 ns ;
Q45 <= sreg64(45) after 1 ns ;
Q44 <= sreg64(44) after 1 ns ;
Q43 <= sreg64(43) after 1 ns ;
Q42 <= sreg64(42) after 1 ns ;
Q41 <= sreg64(41) after 1 ns ;
Q40 <= sreg64(40) after 1 ns ;
Q39 <= sreg64(39) after 1 ns ;
Q38 <= sreg64(38) after 1 ns ;
Q37 <= sreg64(37) after 1 ns ;
Q36 <= sreg64(36) after 1 ns ;
Q35 <= sreg64(35) after 1 ns ;
Q34 <= sreg64(34) after 1 ns ;
Q33 <= sreg64(33) after 1 ns ;
Q32 <= sreg64(32) after 1 ns ;
Q31 <= sreg64(31) after 1 ns ;
Q30 <= sreg64(30) after 1 ns ;
Q29 <= sreg64(29) after 1 ns ;
Q28 <= sreg64(28) after 1 ns ;
Q27 <= sreg64(27) after 1 ns ;
Q26 <= sreg64(26) after 1 ns ;
Q25 <= sreg64(25) after 1 ns ;
Q24 <= sreg64(24) after 1 ns ;
Q23 <= sreg64(23) after 1 ns ;
Q22 <= sreg64(22) after 1 ns ;
Q21 <= sreg64(21) after 1 ns ;
Q20 <= sreg64(20) after 1 ns ;
Q19 <= sreg64(19) after 1 ns ;
Q18 <= sreg64(18) after 1 ns ;
Q17 <= sreg64(17) after 1 ns ;
Q16 <= sreg64(16) after 1 ns ;
Q15 <= sreg64(15) after 1 ns ;
Q14 <= sreg64(14) after 1 ns ;
Q13 <= sreg64(13) after 1 ns ;
Q12 <= sreg64(12) after 1 ns ;
Q11 <= sreg64(11) after 1 ns ;
Q10 <= sreg64(10) after 1 ns ;
Q9 <= sreg64(9) after 1 ns ;
Q8 <= sreg64(8) after 1 ns ;
Q7 <= sreg64(7) after 1 ns ;
Q6 <= sreg64(6) after 1 ns ;
Q5 <= sreg64(5) after 1 ns ;
Q4 <= sreg64(4) after 1 ns ;
Q3 <= sreg64(3) after 1 ns ;
Q2 <= sreg64(2) after 1 ns ;
Q1 <= sreg64(1) after 1 ns ;
Q0 <= sreg64(0) after 1 ns ;
end v1 ;
-- D Flip Flop w asynchronous reset
library ieee ;
use ieee.std_logic_1164.all ;
entity DFFR is
port (RST : in std_logic ;
CLK : in std_logic ;
D : in std_logic ;
Q : out std_logic ;
QN : out std_logic
) ;
end DFFR ;
architecture v1 of DFFR is
signal n1 : std_logic ;
begin
process (RST,CLK)
begin
if RST = '1' then
n1 <= '0' after 1 ns ;
elsif (CLK'event and CLK='1') then
n1 <= D after 1 ns ;
end if ;
end process ;
Q <= n1 after 1 ns ;
QN <= not n1 after 1 ns ;
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 ;
end v1 ;
-- Inverter
library ieee ;
use ieee.std_logic_1164.all ;
entity INV is
port (
IN0 : in std_logic ;
Z : out std_logic
) ;
end INV ;
architecture v1 of INV is
begin
Z <= not IN0 after 1 ns ;
end v1 ;
-- Buffer
library ieee ;
use ieee.std_logic_1164.all ;
entity BUF is
port (
IN0 : in std_logic ;
Z : out std_logic
) ;
end BUF ;
architecture v1 of BUF is
begin
Z <= IN0 after 1 ns ;
end v1 ;
-- 2-1 Multiplexer
library ieee ;
use ieee.std_logic_1164.all ;
entity MUX21 is
port (IN0,IN1,SEL : in std_logic ;
Z : out std_logic
) ;
end MUX21 ;
architecture v1 of MUX21 is
begin
Z <= IN0 after 1 ns when SEL = '0' else IN1 ;
end ;
-- 4-1 Multiplexer
library ieee ;
use ieee.std_logic_1164.all ;
entity MUX41 is
port (IN0,IN1,IN2,IN3,SEL0,SEL1 : in std_logic ;
Z : out std_logic
) ;
end MUX41 ;
architecture v1 of MUX41 is
signal SEL : std_logic_vector(1 downto 0) ;
begin
SEL <= SEL1 & SEL0 ;
Z <= IN0 when SEL = "00" else
IN1 when SEL = "01" else
IN2 when SEL = "10" else
IN3 ;
end ;
Далее составим модели для каждого устройства разделения данных, при этом дополнительно оптимизируем набор элементов и соединений для получения наибольшего возможного соответствия между задержками распространения выходных сигналов.