Стенд: ЦАП PCM5102A, кнопка усиления, линия LVDS, UART через BL616
- вторая ветвь тракта: отсчёты ФНЧ -> пересчёт в 48 828 Гц -> I2S на PCM5102A (dac_stream.v, i2s_transmitter.v), тест tb_dac_stream.v; - кнопка S1 (H11): усиление ветви ЦАП ступенями по +6 дБ, показ ступени светодиодом (gain_button.vhd), тест tb_gain_button.vhd; - микрофон через линию SN65LVDS: точка выборки MIC_SMP_CNT = 12 по измерению на плате (pdm_rx.vhd), в tb_top модель линии; - новая распиновка: MIC_CLK K8, MIC_DAT K9, ЦАП G1/G2/L4/L3, UART_TX C3 на встроенный мост BL616; - сборка под GW5A-25 ревизии A, настройки PnR (CPU/SSPI/READY как GPIO); - отладочный выход PLL 80 МГц на E3.
This commit is contained in:
+37
-10
@@ -14,6 +14,12 @@
|
||||
-- Тракт настраивается около 10 мс (запаздывание ФНЧ, заполнение FIFO),
|
||||
-- поэтому в каждом режиме кадры читаются до первого сошедшегося, но не
|
||||
-- больше MAX_TRY.
|
||||
--
|
||||
-- Микрофон подключён как на железе, через линию LVDS: задержка в обе
|
||||
-- стороны и удержание уровня, пока микрофон отпускает линию. Задержка
|
||||
-- подобрана так, чтобы смена данных приходилась на ту же фазу MIC_CLK, что
|
||||
-- измерена на плате (между тактами 1 и 2 из 16), -- тогда проверяется ровно
|
||||
-- та точка выборки, что стоит в Top.
|
||||
----------------------------------------------------------------------------------
|
||||
library ieee;
|
||||
use ieee.std_logic_1164.all;
|
||||
@@ -38,12 +44,21 @@ architecture sim of tb_top is
|
||||
|
||||
constant PAYLOAD_LEN : integer := 2 + 1 + SPF * 3; -- CNT + STATUS + DATA
|
||||
|
||||
-- Линия: смена данных через 16 + 18 (TDD модели) + 16 = 50 нс после спада
|
||||
-- MIC_CLK -- между тактами 1 и 2. Сами SN65LVDS дают единицы наносекунд,
|
||||
-- остальное -- кабель; для выборки важна только получившаяся фаза
|
||||
constant LINE_FWD : time := 16 ns;
|
||||
constant LINE_BACK : time := 16 ns;
|
||||
|
||||
signal mic_clk_far : std_logic;
|
||||
signal mic_dat_far : std_logic;
|
||||
signal mic_dat_kept : std_logic := '0';
|
||||
|
||||
signal clk : std_logic := '0';
|
||||
signal run : boolean := true;
|
||||
|
||||
signal mic_clk : std_logic;
|
||||
signal mic_dat : std_logic;
|
||||
signal mic_sel : std_logic;
|
||||
signal uart_tx : std_logic;
|
||||
signal led : std_logic;
|
||||
|
||||
@@ -104,12 +119,12 @@ begin
|
||||
)
|
||||
port map
|
||||
(
|
||||
clk => clk,
|
||||
MIC_DAT => mic_dat,
|
||||
MIC_CLK => mic_clk,
|
||||
MIC_SEL => mic_sel,
|
||||
UART_TX => uart_tx,
|
||||
LED => led
|
||||
clk => clk,
|
||||
MIC_DAT => mic_dat,
|
||||
MIC_CLK => mic_clk,
|
||||
UART_TX => uart_tx,
|
||||
BTN_GAIN => '0',
|
||||
LED => led
|
||||
);
|
||||
|
||||
mic : entity work.pdm_mic_model(model)
|
||||
@@ -121,11 +136,24 @@ begin
|
||||
)
|
||||
port map
|
||||
(
|
||||
mic_clk => mic_clk,
|
||||
mic_clk => mic_clk_far,
|
||||
mode => mode,
|
||||
mic_dat => mic_dat
|
||||
mic_dat => mic_dat_far
|
||||
);
|
||||
|
||||
mic_clk_far <= transport mic_clk after LINE_FWD;
|
||||
|
||||
-- Пока микрофон отпускает вывод, вход драйвера LVDS держит последний
|
||||
-- уровень: на плате смены данных видны только в одной фазе
|
||||
keep_proc : process (mic_dat_far)
|
||||
begin
|
||||
if mic_dat_far = '0' or mic_dat_far = '1' then
|
||||
mic_dat_kept <= mic_dat_far;
|
||||
end if;
|
||||
end process keep_proc;
|
||||
|
||||
mic_dat <= transport mic_dat_kept after LINE_BACK;
|
||||
|
||||
check_proc : process
|
||||
variable b : std_logic_vector(7 downto 0);
|
||||
variable prev : std_logic_vector(7 downto 0);
|
||||
@@ -144,7 +172,6 @@ begin
|
||||
variable errors : integer := 0;
|
||||
begin
|
||||
wait for CLK_T;
|
||||
assert mic_sel = '0' report "MIC_SEL does not match the sampling phase" severity error;
|
||||
report "start: FIR_DC_CODE = " & integer'image(FIR_DC_CODE);
|
||||
|
||||
for m in 0 to 3 loop
|
||||
|
||||
Reference in New Issue
Block a user