Маяк 1 Гц на светодиод для проверки системной частоты

LED_SRC=3 гонит на светодиод делитель прямо от clk, мимо тракта. Период,
отличный от секунды, означает, что clk не равен SYS_CLK_HZ -- тогда неверны
и частота PDM, и скорость UART, и шкала мигания.

README: UART обратно на G5, добавлены номера контактов гребёнки и заметка
про VCCIO6/7, подаваемое снаружи.
This commit is contained in:
nikit3s
2026-08-17 18:13:16 +03:00
parent 5fbb3c3eb9
commit 58e6a11a3f
2 changed files with 33 additions and 9 deletions
+4 -5
View File
@@ -67,16 +67,15 @@ SYNC в CRC не входит: он нужен приёмнику для рес
| Цепь | Назначение | Пин ПЛИС | Контакт J1 |
|:--|:--|:--:|:--:|
| clk_50m | тактовый генератор платы, 50 МГц | E2 | — |
| UART_TX | на встроенный мост BL616, ПЛИС -> ПК | **C3** | 21 |
| UART_TX | на внешний мост, ПЛИС -> ПК | G5 | 22 |
| LED | индикация | E8 | 17 |
| MIC_CLK | тактирование микрофона, 3.125 МГц | J11 | 33 |
| MIC_DAT | однобитный поток PDM | J10 | 35 |
| MIC_SEL | вывод SELECT микрофона | K7 | 34 |
C3 (IOB56B) — это то, что на Dock-плате подписано `FPGA_UART_TX` и заведено на
приёмник моста BL616, банк 4 с фиксированными 3.3 В. Обычный контакт гребёнки
для UART не годится: мост туда не смотрит. Под внешний мост, посаженный прямо
на гребёнку, вывод меняется на нужный контакт.
UART идёт на внешний мост, посаженный на гребёнку: встроенный BL616 ограничен
по скорости. Его цепи, если понадобятся, — C3 (`FPGA_UART_TX`, контакт 21) и
B3 (`FPGA_UART_RX`, контакт 19).
Микрофон сидит в банке 7, а VCCIO банков 6/7 на этой плате подаётся снаружи
через контакты 29 и 31 гребёнки — без 3.3 В на них выводы микрофона не работают.
+29 -4
View File
@@ -22,9 +22,14 @@ entity Top is
generic (
SYS_CLK_HZ : integer := 50_000_000;
BAUD_RATE : integer := 921600;
-- Что считает светодиод: 0 -- отсчёты ФНЧ (рабочий режим), 1 -- отсчёты
-- CIC, 2 -- биты PDM. Быстрое мерцание значит, что выбранный строб живой,
-- так обрыв тракта находится перебором без осциллографа внутри кристалла.
-- Что показывает светодиод:
-- 0 -- отсчёты ФНЧ, рабочий режим
-- 1 -- отсчёты CIC
-- 2 -- биты PDM
-- 3 -- маяк ровно 1 Гц прямо от clk, мимо всего тракта
-- Режимы 0..2 ищут обрыв тракта: быстрое мерцание значит, что выбранный
-- строб живой. Режим 3 меряет сам clk: период не 1 с означает, что
-- системная частота не SYS_CLK_HZ, и тогда врут все производные от неё.
LED_SRC : integer := 0
);
port (
@@ -72,6 +77,10 @@ architecture Behavioral of Top is
signal uart_busy : std_logic;
signal led_event : std_logic;
signal led_chain : std_logic;
signal beat_cnt : integer range 0 to SYS_CLK_HZ / 2 - 1 := 0;
signal beacon : std_logic := '0';
begin
@@ -81,6 +90,22 @@ begin
cic_valid when LED_SRC = 1 else
fir_valid;
LED <= beacon when LED_SRC = 3 else led_chain;
-- Маяк: полпериода = SYS_CLK_HZ/2 тактов, то есть ровно 1 Гц на выводе.
-- Ни от чего, кроме clk, не зависит.
beacon_proc : process (clk)
begin
if rising_edge(clk) then
if beat_cnt = SYS_CLK_HZ / 2 - 1 then
beat_cnt <= 0;
beacon <= not beacon;
else
beat_cnt <= beat_cnt + 1;
end if;
end if;
end process beacon_proc;
pdm_rx_inst : entity work.pdm_rx(rtl)
generic map(
CLK_DIV => PDM_DIV,
@@ -205,7 +230,7 @@ begin
(
clk => clk,
data_event => led_event,
led => LED
led => led_chain
);
end architecture Behavioral;