Стенд: ЦАП 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:
2026-10-02 14:21:06 +03:00
parent 668c0564e9
commit 2672f8b8a8
16 changed files with 2181 additions and 40 deletions
+37 -10
View File
@@ -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