Описание стенда и быстрый старт
- docs/stand.md: состав стенда, схема и таблица соединений, питание, порядок работы, нормальные показания на ПК и на выходе ЦАП, неисправности; - README: UART через мост BL616 вместо внешнего FT232, быстрый старт, структура, команды симуляции через --elab-run (работают и с mcode-сборкой GHDL), python вместо py -3, список локальной документации; - .gitignore: мусор генератора IP Gowin, Python, Windows.
This commit is contained in:
+16
-1
@@ -3,7 +3,12 @@ impl/*
|
|||||||
!impl/*_process_config.json
|
!impl/*_process_config.json
|
||||||
*.gprj.user
|
*.gprj.user
|
||||||
|
|
||||||
# Даташиты: большие, не трекаем
|
# Мусор генератора IP-ядер Gowin
|
||||||
|
**/temp/
|
||||||
|
*_tmp.v
|
||||||
|
*_tmp.vhd
|
||||||
|
|
||||||
|
# Даташиты и схемы плат: большие, не трекаем, список -- в README
|
||||||
docs/*.pdf
|
docs/*.pdf
|
||||||
docs/*.PDF
|
docs/*.PDF
|
||||||
docs/Primer_25K/
|
docs/Primer_25K/
|
||||||
@@ -12,10 +17,20 @@ docs/Primer_25K/
|
|||||||
*.bin
|
*.bin
|
||||||
*.raw
|
*.raw
|
||||||
*.log
|
*.log
|
||||||
|
*.wav
|
||||||
|
|
||||||
# Симуляция
|
# Симуляция
|
||||||
build/
|
build/
|
||||||
*.cf
|
*.cf
|
||||||
*.ghw
|
*.ghw
|
||||||
|
*.vcd
|
||||||
|
*.vvp
|
||||||
|
|
||||||
|
# Python
|
||||||
__pycache__/
|
__pycache__/
|
||||||
|
*.py[cod]
|
||||||
|
.venv/
|
||||||
|
|
||||||
|
# Windows
|
||||||
|
Thumbs.db
|
||||||
|
desktop.ini
|
||||||
|
|||||||
@@ -1,10 +1,52 @@
|
|||||||
# Цифровой микрофон SPH9855 на Tang Primer 25K
|
# Цифровой микрофон SPH9855 на Tang Primer 25K
|
||||||
|
|
||||||
Прошивка принимает поток PDM с микрофона SPH9855LM4H-C, приводит его к
|
Прошивка ПЛИС GW5A-25 принимает поток PDM с микрофона SPH9855LM4H-C,
|
||||||
**24 бит / 12 500 Гц** и отдаёт отсчёты кадрами по UART.
|
подключённого по линии LVDS (SN65LVDS), приводит его к **24 бит / 12 500 Гц**
|
||||||
|
и отдаёт отсчёты сразу в две стороны: кадрами по UART через встроенный мост
|
||||||
|
BL616 на ПК и по I2S на ЦАП PCM5102A, чей аналоговый выход смотрят
|
||||||
|
осциллографом.
|
||||||
|
|
||||||
MIC_CLK 3.125 МГц -> CIC sinc^3 /50 -> 62.5 кГц -> ФНЧ /5 -> **12 500 Гц** ->
|
MIC_CLK 3.125 МГц -> CIC sinc^3 /50 -> 62.5 кГц -> ФНЧ /5 -> **12 500 Гц** ->
|
||||||
кадры по 50 отсчётов -> UART 921600.
|
- кадры по 50 отсчётов -> UART 921600 -> BL616 -> USB на ПК;
|
||||||
|
- пересчёт в 48 828 Гц -> I2S -> PCM5102A -> осциллограф.
|
||||||
|
|
||||||
|
**Стенд целиком** — состав, схема соединений, питание, порядок включения,
|
||||||
|
нормальные показания и неисправности — описан в [docs/stand.md](docs/stand.md).
|
||||||
|
|
||||||
|
## Быстрый старт
|
||||||
|
|
||||||
|
Сборка — в Gowin IDE: открыть `DigMic.gprj`, Run All. Битстрим —
|
||||||
|
`impl\pnr\DigMic.fs`.
|
||||||
|
|
||||||
|
Загрузка в ПЛИС через мост BL616 (DirtyJTAG):
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
openFPGALoader -c dirtyJtag impl\pnr\DigMic.fs
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка: светодиод платы часто мигает (10 Гц), а на ПК идёт поток:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m pip install -r tools/requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python tools/uart_live.py --port COM14
|
||||||
|
```
|
||||||
|
|
||||||
|
COM14 — порт моста BL616 на рабочем ПК стенда; на другом ПК номер покажет
|
||||||
|
`python tools/uart_capture.py --list`. Норма: 250 кадров/с, CRC 0, STATUS чисто.
|
||||||
|
|
||||||
|
## Структура
|
||||||
|
|
||||||
|
```
|
||||||
|
DigMic.gprj проект Gowin, GW5A-LV25MG121NC1/I0, ревизия A
|
||||||
|
impl/DigMic_process_config.json настройки синтеза и PnR (остальное в impl/ не трекается)
|
||||||
|
src/ RTL, ограничения выводов и тайминга, IP-ядро PLL
|
||||||
|
tb/ тестбенчи: сквозной, ветвь ЦАП, кнопка
|
||||||
|
tools/ скрипты ПК: приём, просмотр, прослушивание, расчёт ФНЧ
|
||||||
|
docs/stand.md описание стенда
|
||||||
|
```
|
||||||
|
|
||||||
## Тактирование и частоты
|
## Тактирование и частоты
|
||||||
|
|
||||||
@@ -16,6 +58,7 @@ MIC_CLK 3.125 МГц -> CIC sinc^3 /50 -> 62.5 кГц -> ФНЧ /5 -> **12 500
|
|||||||
| ФНЧ | 221 отвод, децимация 5 | до 12 500 Гц |
|
| ФНЧ | 221 отвод, децимация 5 | до 12 500 Гц |
|
||||||
| Выходная ЧД | 12 500 Гц | |
|
| Выходная ЧД | 12 500 Гц | |
|
||||||
| UART | 921600, 8N1 | 157 байт на кадр, 250 кадров/с, 39.25 кБ/с (43% канала) |
|
| UART | 921600, 8N1 | 157 байт на кадр, 250 кадров/с, 39.25 кБ/с (43% канала) |
|
||||||
|
| I2S | fS 48 828.125 Гц = 50/1024, BCK 64 fS, SCK 12.5 МГц = 256 fS | проверено на железе отдельной прошивкой-генератором синуса |
|
||||||
|
|
||||||
Делитель 16 выбран не произвольно: чтобы обойтись без PLL, частота PDM должна
|
Делитель 16 выбран не произвольно: чтобы обойтись без PLL, частота PDM должна
|
||||||
быть 50 МГц / N, а чтобы децимация до 12 500 Гц была целой, N обязан делить
|
быть 50 МГц / N, а чтобы децимация до 12 500 Гц была целой, N обязан делить
|
||||||
@@ -44,7 +87,7 @@ CIC снимает поток до 62.5 кГц, а всю избирательн
|
|||||||
Коэффициенты и разрядности лежат в `src/fir_coefs_pkg.vhd`, файл генерируется:
|
Коэффициенты и разрядности лежат в `src/fir_coefs_pkg.vhd`, файл генерируется:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
py -3 tools/gen_fir_coefs.py
|
python tools/gen_fir_coefs.py
|
||||||
```
|
```
|
||||||
|
|
||||||
## Шкала
|
## Шкала
|
||||||
@@ -66,31 +109,92 @@ py -3 tools/gen_fir_coefs.py
|
|||||||
SYNC в CRC не входит: он нужен приёмнику для ресинхронизации до того, как тот
|
SYNC в CRC не входит: он нужен приёмнику для ресинхронизации до того, как тот
|
||||||
начнёт что-либо считать.
|
начнёт что-либо считать.
|
||||||
|
|
||||||
|
UART_TX выведен на C3 — цепь `FPGA_UART_TX` платы Dock, к встроенному мосту
|
||||||
|
BL616. На мосту стоит заменённая прошивка (отдельный проект BL616): она
|
||||||
|
держит 921600 без потерь и одновременно даёт JTAG, так что загрузка и приём
|
||||||
|
идут по одному кабелю USB-C. Со штатной прошивкой Sipeed UART моста работал
|
||||||
|
плохо, а Gowin Programmer, наоборот, видит только её — с заменённой прошивкой
|
||||||
|
битстрим грузится через openFPGALoader.
|
||||||
|
|
||||||
|
## Выход на ЦАП
|
||||||
|
|
||||||
|
I2S и SCK — те же, что в отдельной прошивке-генераторе синуса, на которой
|
||||||
|
модуль PCM5102A проверялся на железе: тот же `i2s_transmitter.v` без
|
||||||
|
изменений, те же частоты. Источник отсчётов здесь — выход ФНЧ, те же
|
||||||
|
отсчёты, что уходят в кадры UART, но мимо FIFO.
|
||||||
|
|
||||||
|
Частота ЦАП не равна 12 500 Гц и не кратна ей, но обе делятся из одного
|
||||||
|
клока 50 МГц, так что их отношение точное и постоянное: 4000 / 1024 тактов.
|
||||||
|
Поэтому пересчёт обходится без буфера и без подстройки, которые нужны
|
||||||
|
`uart_audio.py` на ПК. Пересчёт — линейная интерполяция между двумя
|
||||||
|
последними отсчётами, доля берётся из числа тактов с прихода последнего.
|
||||||
|
Простое удержание давало бы ступени по 3–4 повтора с дрожанием на период ЦАП
|
||||||
|
и зеркала 12.5 кГц ± f на −21 дБ (для 1 кГц); с интерполяцией они на −43 дБ.
|
||||||
|
Задержка — один отсчёт, 80 мкс.
|
||||||
|
|
||||||
|
Полоса та же, что у тракта, — до 5 кГц. Полная шкала 24 бит — это 2.1 В скз
|
||||||
|
на выходе PCM5102A, а фон в комнате около −72 dBFS и речь около −50 dBFS —
|
||||||
|
без усиления это доли и единицы милливольт.
|
||||||
|
|
||||||
|
### Усиление ЦАП с кнопки
|
||||||
|
|
||||||
|
Усиление ветви ЦАП переключает кнопка S1 на плате (H11): каждое нажатие —
|
||||||
|
следующая ступень, ровно +6.02 дБ (сдвиг отсчёта на разряд), после
|
||||||
|
`DAC_GAIN_MAX` снова 0. После включения питания усиление 0 — та же шкала,
|
||||||
|
что на UART. На UART всегда уходят исходные отсчёты, кнопка на них не влияет.
|
||||||
|
|
||||||
|
`DAC_GAIN_MAX` в `Top.vhd` по умолчанию 8, то есть до +48 дБ: фон комнаты
|
||||||
|
там уже на −24 dBFS, а при чувствительности микрофона −39 dBFS (на 94 дБ SPL)
|
||||||
|
всё громче примерно 85 дБ SPL упирается в шкалу. Предел — 15 (+90 дБ). Выше
|
||||||
|
шкалы отсчёт ограничивается, признака этого нигде нет.
|
||||||
|
|
||||||
|
Выбранную ступень показывает светодиод: пауза, N коротких вспышек (для 0 —
|
||||||
|
одна длинная, 1 с), пауза, и он возвращается к обычной индикации. Нажатие во
|
||||||
|
время показа начинает показ заново. Дребезг отсекается: уровень кнопки
|
||||||
|
принимается, только если продержался 20 мс.
|
||||||
|
|
||||||
|
Уровень на выходе ЦАП при ступени N больше уровня у микрофона на 6.02·N дБ
|
||||||
|
минус спад интерполяции (−0.18 дБ на 1 кГц). Постоянная составляющая
|
||||||
|
микрофона около −90 dBFS и не мешает даже на верхних ступенях.
|
||||||
|
|
||||||
## Распиновка
|
## Распиновка
|
||||||
|
|
||||||
| Цепь | Назначение | Пин ПЛИС | Контакт J1 |
|
Полная таблица с банками, местом на плате и тем, куда идёт каждая цепь, — в
|
||||||
|:--|:--|:--:|:--:|
|
[docs/stand.md](docs/stand.md#соединения), привязка — в `src/DigMic.cst`.
|
||||||
| clk_50m | тактовый генератор платы, 50 МГц | E2 | — |
|
Кратко: clk E2, MIC_CLK K8, MIC_DAT K9, ЦАП G1/G2/L4/L3 (SCK/BCK/LRCK/DIN),
|
||||||
| UART_TX | на внешний мост, ПЛИС -> ПК | G5 | 22 |
|
UART_TX C3, кнопка H11, светодиод E8, отладочный выход PLL E3.
|
||||||
| LED | индикация | E8 | 17 |
|
|
||||||
| MIC_CLK | тактирование микрофона, 3.125 МГц | J11 | 33 |
|
|
||||||
| MIC_DAT | однобитный поток PDM | J10 | 35 |
|
|
||||||
| MIC_SEL | вывод SELECT микрофона | K7 | 34 |
|
|
||||||
|
|
||||||
UART идёт на внешний мост, посаженный на гребёнку: встроенный BL616 ограничен
|
### Точка выборки через линию LVDS
|
||||||
по скорости. Его цепи, если понадобятся, — C3 (`FPGA_UART_TX`, контакт 21) и
|
|
||||||
B3 (`FPGA_UART_RX`, контакт 19).
|
|
||||||
|
|
||||||
Микрофон сидит в банке 7, а VCCIO банков 6/7 на этой плате подаётся снаружи
|
Кабель, драйверы и приёмники SN65LVDS на обоих концах и задержка выдачи самого
|
||||||
через контакты 29 и 31 гребёнки — без 3.3 В на них выводы микрофона не работают.
|
микрофона сдвигают данные относительно MIC_CLK, и точка выборки для микрофона
|
||||||
Питание самого микрофона 1.65...3.6 В.
|
на коротких проводах сюда не подходит.
|
||||||
|
Фаза измерена на плате: MIC_CLK на K8 и гистограмма смен уровня K9 по 16
|
||||||
|
тактам периода. Все смены — только между тактами 1 и 2, то есть через
|
||||||
|
40–60 нс после спада MIC_CLK (с точностью до целых периодов), в остальное
|
||||||
|
время данные стоят: пока микрофон отпускает вывод, уровень держит вход
|
||||||
|
драйвера LVDS на его плате. Поэтому бит берётся в противоположной фазе,
|
||||||
|
`MIC_SMP_CNT = 12` в `Top.vhd`, — около 150 нс запаса в обе стороны. При
|
||||||
|
смене кабеля или микросхем линии фазу надо перемерить; для микрофона на
|
||||||
|
коротких проводах `MIC_SMP_CNT = -1` возвращает прежнюю точку.
|
||||||
|
|
||||||
`MIC_SEL` прошивка держит в `'0'`: микрофон выставляет бит по спаду MIC_CLK,
|
### Светодиод для поиска обрыва
|
||||||
выборка идёт в середине низкой фазы. Если вывод SELECT посажен на питание
|
|
||||||
платой, поменять `SEL_HIGH` в `Top.vhd` на `'1'` — точка выборки переедет сама.
|
`LED_SRC` в `Top.vhd` выбирает, от чего мигает светодиод: 0 — отсчёты ФНЧ
|
||||||
|
(рабочий режим), 1 — отсчёты CIC, 2 — биты PDM, 3 — маяк ровно 1 Гц прямо
|
||||||
|
от clk, мимо всего тракта. Режимы 0...2 ищут обрыв тракта: быстрое мерцание
|
||||||
|
значит, что выбранный участок живой. Режим 3 меряет сам clk: период не 1 с
|
||||||
|
означает, что системная частота не 50 МГц, и тогда врут все производные от неё.
|
||||||
|
|
||||||
## Два ограничения кристалла, добытые на железе
|
## Два ограничения кристалла, добытые на железе
|
||||||
|
|
||||||
|
> **Скорее всего, оба — следствие сборки под чужую ревизию.** На плате стоит
|
||||||
|
> GW5A-25 **ревизии A**, а проект до 2026-09-30 собирался под B. Проверено на
|
||||||
|
> этой плате: один и тот же проект под B не выдаёт ни одного байта (с любым
|
||||||
|
> `--device` у программатора), под A — 250 кадров/с без ошибок CRC. JTAG-код у
|
||||||
|
> ревизий одинаковый, программатор расхождения не замечает. Под A оба
|
||||||
|
> ограничения ещё не перепроверялись.
|
||||||
|
|
||||||
Оба проявляются одинаково: синтез и трассировка проходят без замечаний, тайминг
|
Оба проявляются одинаково: синтез и трассировка проходят без замечаний, тайминг
|
||||||
чистый, симуляция верная, а в кристалле тракт молча отдаёт нули.
|
чистый, симуляция верная, а в кристалле тракт молча отдаёт нули.
|
||||||
|
|
||||||
@@ -106,13 +210,23 @@ B3 (`FPGA_UART_RX`, контакт 19).
|
|||||||
|
|
||||||
## Сборка
|
## Сборка
|
||||||
|
|
||||||
|
Проект собирается под `GW5A-LV25MG121NC1/I0`, Device Version **A**
|
||||||
|
(`gw5a25a-002`), см. выше. В Gowin IDE — открыть `DigMic.gprj` и Run All.
|
||||||
|
Битстрим — `impl/pnr/DigMic.fs`.
|
||||||
|
|
||||||
Выводы `clk` (E2) и `LED` (E8) на этом корпусе сидят на двойных функциях
|
Выводы `clk` (E2) и `LED` (E8) на этом корпусе сидят на двойных функциях
|
||||||
(SSPI/CPU и READY), поэтому в свойствах проекта их надо разрешить как обычные
|
(SSPI/CPU и READY), поэтому в свойствах проекта их надо разрешить как обычные
|
||||||
выводы, иначе размещение падает с PR2017. В IDE это флажки CPU, SSPI и READY,
|
выводы, иначе размещение падает с PR2017. Это уже сделано в
|
||||||
в `gw_sh` -- `set_option -use_cpu_as_gpio 1 -use_sspi_as_gpio 1
|
`impl/DigMic_process_config.json`, который лежит в репозитории; в IDE это
|
||||||
-use_ready_as_gpio 1`.
|
флажки CPU, SSPI и READY, в `gw_sh` — `set_option -use_cpu_as_gpio 1
|
||||||
|
-use_sspi_as_gpio 1 -use_ready_as_gpio 1`.
|
||||||
|
|
||||||
Занято на GW5A-25: 649 LUT/ALU (3%), 461 регистр (2%), 4 BSRAM (8%), 1 DSP (4%).
|
IP-ядро `src/gowin_pll` (с `src/pll_init.v`) нужно только отладочному выходу
|
||||||
|
`clk_80MHz` на E3, тракт от него не зависит. Ядро сгенерировано ещё под
|
||||||
|
ревизию B; под A проект с ним собирается, но перегенерировать его стоит.
|
||||||
|
|
||||||
|
Занято на GW5A-25 вместе с ветвью ЦАП и кнопкой: 1179 LUT/ALU (6%),
|
||||||
|
804 регистра (4%), 5 BSRAM (9%), 3 DSP (11%).
|
||||||
Тайминг сходится с запасом, но полагаться на него как на признак исправности
|
Тайминг сходится с запасом, но полагаться на него как на признак исправности
|
||||||
нельзя — см. раздел про ограничения кристалла выше.
|
нельзя — см. раздел про ограничения кристалла выше.
|
||||||
|
|
||||||
@@ -128,52 +242,162 @@ B3 (`FPGA_UART_RX`, контакт 19).
|
|||||||
| `src/fifo_top.vhd` | буфер отсчётов, заглушка под IP-ядро Gowin |
|
| `src/fifo_top.vhd` | буфер отсчётов, заглушка под IP-ядро Gowin |
|
||||||
| `src/Packets_creator.vhd` | сборка кадра с CRC-16 |
|
| `src/Packets_creator.vhd` | сборка кадра с CRC-16 |
|
||||||
| `src/UART.vhd` | передатчик |
|
| `src/UART.vhd` | передатчик |
|
||||||
|
| `src/dac_stream.v` | ветвь ЦАП: усиление, пересчёт в 48 828 Гц, I2S и SCK |
|
||||||
|
| `src/i2s_transmitter.v` | передатчик I2S, без изменений из прошивки проверки ЦАП |
|
||||||
| `src/led_status.vhd` | индикация частотой мигания |
|
| `src/led_status.vhd` | индикация частотой мигания |
|
||||||
|
| `src/gain_button.vhd` | кнопка усиления ЦАП: дребезг, ступени, показ светодиодом |
|
||||||
|
| `src/gowin_pll/`, `src/pll_init.v` | PLL для отладочного выхода 80 МГц |
|
||||||
| `src/DigMic.cst` | привязка выводов |
|
| `src/DigMic.cst` | привязка выводов |
|
||||||
|
| `src/DigMic.sdc` | ограничение клока 50 МГц |
|
||||||
| `tb/pdm_mic_model.vhd` | поведенческая модель PDM-микрофона |
|
| `tb/pdm_mic_model.vhd` | поведенческая модель PDM-микрофона |
|
||||||
| `tb/tb_top.vhd` | сквозной тест: модель -> ПЛИС -> UART -> разбор кадра |
|
| `tb/tb_top.vhd` | сквозной тест: модель -> линия LVDS -> ПЛИС -> UART -> разбор кадра |
|
||||||
|
| `tb/tb_dac_stream.v` | тест ветви ЦАП: отсчёты -> I2S на выводах -> разбор слов |
|
||||||
|
| `tb/tb_gain_button.vhd` | тест кнопки: дребезг, ступени по кругу, вспышки |
|
||||||
| `tools/gen_fir_coefs.py` | расчёт коэффициентов ФНЧ |
|
| `tools/gen_fir_coefs.py` | расчёт коэффициентов ФНЧ |
|
||||||
| `tools/uart_capture.py` | приём кадров, запись `.raw` и `.bin` |
|
| `tools/uart_capture.py` | приём кадров, запись `.raw` и `.bin` |
|
||||||
| `tools/uart_live.py` | живой просмотр: осциллограмма, спектр, счётчики |
|
| `tools/uart_live.py` | живой просмотр: осциллограмма, спектр, счётчики |
|
||||||
|
| `tools/uart_audio.py` | прослушивание: поток на звуковую карту ПК |
|
||||||
|
| `tools/Bin_to_wav.py` | перевод записанного `.bin` в WAV |
|
||||||
|
| `tools/requirements.txt` | пакеты Python для скриптов |
|
||||||
|
|
||||||
## Симуляция (GHDL)
|
## Симуляция
|
||||||
|
|
||||||
|
Сквозной тест, GHDL:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
mkdir -p build && ghdl -a --std=08 --workdir=build src/fifo_top.vhd src/UART.vhd src/led_status.vhd src/pdm_rx.vhd src/cic_decim.vhd src/fir_coefs_pkg.vhd src/fir_decim.vhd src/Packets_creator.vhd src/Top.vhd tb/pdm_mic_model.vhd tb/tb_top.vhd && ghdl -e --std=08 --workdir=build -o build/tb_top tb_top && build/tb_top --stop-time=400ms
|
mkdir -p build && ghdl -a --std=08 --workdir=build src/fifo_top.vhd src/UART.vhd src/led_status.vhd src/gain_button.vhd src/pdm_rx.vhd src/cic_decim.vhd src/fir_coefs_pkg.vhd src/fir_decim.vhd src/Packets_creator.vhd src/Top.vhd tb/pdm_mic_model.vhd tb/tb_top.vhd && ghdl --elab-run --std=08 --workdir=build tb_top --stop-time=400ms
|
||||||
```
|
```
|
||||||
|
|
||||||
|
`--elab-run` работает с любой сборкой GHDL, в том числе с mcode, которая не
|
||||||
|
даёт исполняемого файла. Ожидаемый итог — `TEST PASSED`.
|
||||||
|
|
||||||
|
Микрофон в тестбенче подключён как на плате, через модель линии LVDS:
|
||||||
|
задержка в обе стороны и удержание уровня, пока микрофон отпускает вывод.
|
||||||
|
Задержка подобрана так, что смена данных попадает между тактами 1 и 2 — туда
|
||||||
|
же, где её видно на железе, — поэтому проверяется та же точка выборки.
|
||||||
|
|
||||||
Модель прогоняет четыре режима. Три из них дают точно вычислимый ответ:
|
Модель прогоняет четыре режима. Три из них дают точно вычислимый ответ:
|
||||||
постоянные `'1'` и `'0'` — плюс и минус полная шкала, чередование `1010` —
|
постоянные `'1'` и `'0'` — плюс и минус полная шкала, чередование `1010` —
|
||||||
ровно ноль (эта частота попадает в нуль АЧХ CIC). Четвёртый — синус, у него
|
ровно ноль (эта частота попадает в нуль АЧХ CIC). Четвёртый — синус, у него
|
||||||
проверяется размах. Тракт настраивается около 10 мс, поэтому в каждом режиме
|
проверяется размах. Тракт настраивается около 10 мс, поэтому в каждом режиме
|
||||||
кадры читаются до первого сошедшегося.
|
кадры читаются до первого сошедшегося.
|
||||||
|
|
||||||
## Запись с железа
|
Ветвь ЦАП и PLL написаны на Verilog, поэтому GHDL их не собирает и
|
||||||
|
предупреждает, что `dac_stream_inst` и `PLL_dbg` не привязаны; тракт UART от
|
||||||
|
этого не зависит. Ветвь ЦАП проверяется отдельно, в Icarus Verilog:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
py -3 tools/uart_capture.py --list
|
mkdir -p build && iverilog -g2012 -o build/tb_dac_stream tb/tb_dac_stream.v src/dac_stream.v src/i2s_transmitter.v && vvp build/tb_dac_stream
|
||||||
|
```
|
||||||
|
|
||||||
|
Тестбенч разбирает I2S на выводах так же, как ЦАП, и сверяет каждое слово с
|
||||||
|
эталонной интерполяцией бит в бит, с учётом момента, в который оно взято.
|
||||||
|
Параметры `-Ptb_dac_stream.GAIN=2` и `-Ptb_dac_stream.WAVE=1` (меандр
|
||||||
|
между крайними кодами) проверяют ограничение по шкале и разрядности,
|
||||||
|
`-Ptb_dac_stream.GAIN_STEP=3` — переключение усиления на ходу по всем 16
|
||||||
|
значениям, в том числе выше `GAIN_MAX`.
|
||||||
|
|
||||||
|
Кнопка усиления — отдельно, в GHDL:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
mkdir -p build && ghdl -a --std=08 --workdir=build src/gain_button.vhd tb/tb_gain_button.vhd && ghdl --elab-run --std=08 --workdir=build tb_gain_button
|
||||||
|
```
|
||||||
|
|
||||||
|
Такт в нём снижен до 100 кГц, чтобы секунды показа считались быстро.
|
||||||
|
Проверяются дребезг и короткая помеха, ступени по кругу, долгое удержание,
|
||||||
|
число и длительность вспышек и перезапуск показа нажатием.
|
||||||
|
|
||||||
|
## ПО на ПК
|
||||||
|
|
||||||
|
Пакеты Python — в `tools/requirements.txt`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m pip install -r tools/requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
COM-порт держит один процесс: запись, просмотр и прослушивание запускаются
|
||||||
|
по очереди. Разбор кадров у всех трёх общий (`FrameParser` в
|
||||||
|
`uart_capture.py`), так что они не могут разойтись.
|
||||||
|
|
||||||
|
### Запись
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python tools/uart_capture.py --list
|
||||||
```
|
```
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
py -3 tools/uart_capture.py --port COM5 --seconds 10 --out test1
|
python tools/uart_capture.py --port COM14 --seconds 10 --out test1
|
||||||
```
|
```
|
||||||
|
|
||||||
Получаются `test1.raw` (весь поток как пришёл, для отладки канала),
|
Получаются `test1.raw` (весь поток как пришёл, для отладки канала),
|
||||||
`test1.bin` (только отсчёты, читается `read_24bit_bin()`) и `test1.log`.
|
`test1.bin` (только отсчёты, читается `read_24bit_bin()`) и `test1.log`.
|
||||||
Кадр с несошедшейся CRC отбрасывается, пропуск по FRAME_CNT добивается нулями,
|
Кадр с несошедшейся CRC отбрасывается, пропуск по FRAME_CNT добивается нулями,
|
||||||
чтобы не сдвинулась ось времени.
|
чтобы не сдвинулась ось времени. Ключ `--dump` пишет только `.raw`, без
|
||||||
|
разбора, и показывает, теряет ли байты сам канал.
|
||||||
|
|
||||||
## Живой просмотр
|
`.bin` переводится в WAV для прослушивания или отправки:
|
||||||
|
|
||||||
```bash
|
```bash
|
||||||
py -3 tools/uart_live.py --port COM10
|
python tools/Bin_to_wav.py test1.bin
|
||||||
|
```
|
||||||
|
|
||||||
|
Без аргумента файл выбирается в окне. Рядом появляется `test1_gain5.wav`:
|
||||||
|
постоянная составляющая убрана, усиление `GAIN`, 12 500 Гц, PCM 16 бит, по
|
||||||
|
`WAV_BITS = 24` — полная разрядность. Настройки — константы в начале скрипта.
|
||||||
|
Берётся именно `.bin`: в `.raw` лежат кадры целиком, с заголовками и CRC.
|
||||||
|
|
||||||
|
### Живой просмотр
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python tools/uart_live.py --port COM14
|
||||||
```
|
```
|
||||||
|
|
||||||
Осциллограмма в долях шкалы, спектр в dBFS и счётчики кадров в реальном
|
Осциллограмма в долях шкалы, спектр в dBFS и счётчики кадров в реальном
|
||||||
времени. Управление кнопками внизу окна, те же действия — клавишами `r`, `a`,
|
времени. Управление кнопками внизу окна, те же действия — клавишами `r`, `a`,
|
||||||
`d`, `s`, `f`, выход `q`.
|
`d`, `s`, `f`, выход `q`. Запись встроена в просмотр по необходимости:
|
||||||
|
запустить `uart_capture.py` на том же порту параллельно нельзя.
|
||||||
|
|
||||||
Запись встроена в просмотр по необходимости: COM-порт держит один процесс, и
|
### Прослушивание
|
||||||
запустить `uart_capture.py` на том же порту параллельно нельзя. Разбор кадров у
|
|
||||||
обоих инструментов общий (`FrameParser` в `uart_capture.py`), так что просмотр
|
```bash
|
||||||
и запись не могут разойтись.
|
python tools/uart_audio.py --port COM14
|
||||||
|
```
|
||||||
|
|
||||||
|
Поток уходит на звуковую карту ПК, то есть в джек на компьютере: ЦАП здесь
|
||||||
|
она сама, внешнего железа не нужно. Отсчёты 12 500 Гц пересчитываются в
|
||||||
|
частоту устройства вывода (обычно 48 000), на входе стоит ФВЧ 20 Гц — иначе
|
||||||
|
постоянная составляющая микрофона съедает запас по шкале и даёт щелчок на
|
||||||
|
старте. Полоса та же, что у тракта: 5 кГц, звук телефонного качества.
|
||||||
|
|
||||||
|
Выход выбирается тот, что назначен в Windows; если нужен другой —
|
||||||
|
`--list` показывает и порты, и устройства, `--device` выбирает. Слушать лучше
|
||||||
|
в наушниках: динамик рядом с микрофоном даёт самовозбуждение.
|
||||||
|
|
||||||
|
Постоянного отношения частот в программе нет нигде, и это главное: 12 500 Гц
|
||||||
|
отмеряет кварц платы, частоту вывода — кварц звуковой карты, а расхождение в
|
||||||
|
десятки ppm за минуту накапливает миллисекунды и рано или поздно опустошает
|
||||||
|
буфер. Поэтому шаг пересчёта подстраивает регулятор по заполнению буфера —
|
||||||
|
в строке состояния он виден как `шаг ... ppm`, там же `недобор` и `клип`.
|
||||||
|
|
||||||
|
Без порта проигрывается записанный `.bin`:
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python tools/uart_audio.py --file test1.bin --gain 12
|
||||||
|
```
|
||||||
|
|
||||||
|
Проверка без порта и без звука — `--selftest` у `uart_audio.py` (пересчёт
|
||||||
|
по спектру, непрерывность на стыках блоков, реакция регулятора, ФВЧ) и у
|
||||||
|
`uart_live.py` (разбор и отрисовка).
|
||||||
|
|
||||||
|
## Документация
|
||||||
|
|
||||||
|
Даташиты и схемы в репозиторий не кладутся (`.gitignore`), их держат
|
||||||
|
локально в `docs/`:
|
||||||
|
|
||||||
|
| Файл | Что это |
|
||||||
|
|:--|:--|
|
||||||
|
| `docs/SPH9855LM4H-C.PDF` | даташит микрофона |
|
||||||
|
| `docs/Primer_25K/Tang_25K_60033.pdf` | схема платы Dock: гребёнка J3, кнопки, BL616 |
|
||||||
|
| `docs/Primer_25K/Tang_Primer_25K_52300_Schematic.pdf` | схема модуля Tang Primer 25K |
|
||||||
|
| `docs/Primer_25K/Tang_Primer_25K_Specification_V1.0_en.pdf` | спецификация модуля |
|
||||||
|
| `docs/DAC_sch.pdf`, `docs/datasheet_PCM5102APWR.pdf` | схема модуля ЦАП и даташит PCM5102A |
|
||||||
|
|||||||
+211
@@ -0,0 +1,211 @@
|
|||||||
|
# Стенд цифрового микрофона
|
||||||
|
|
||||||
|
Стенд проверяет цифровой микрофон SPH9855LM4H-C, вынесенный на кабель с
|
||||||
|
линией LVDS, вместе с трактом его обработки в ПЛИС. ПЛИС тактирует микрофон,
|
||||||
|
принимает поток PDM, приводит его к **24 бит / 12 500 Гц** и отдаёт отсчёты
|
||||||
|
сразу в две стороны:
|
||||||
|
|
||||||
|
- **на ПК по USB** — кадры с CRC: запись, живой просмотр, прослушивание;
|
||||||
|
- **на ЦАП PCM5102A** — аналоговый сигнал, который смотрят осциллографом.
|
||||||
|
|
||||||
|
Обе ветви получают одни и те же отсчёты. Кнопкой на плате поднимается
|
||||||
|
усиление только ветви ЦАП, на ПК всегда уходит исходная шкала.
|
||||||
|
|
||||||
|
## Состав
|
||||||
|
|
||||||
|
| Узел | Что это | Роль на стенде |
|
||||||
|
|:--|:--|:--|
|
||||||
|
| Плата микрофона | SPH9855LM4H-C и приёмопередатчики SN65LVDS | PDM-микрофон; вывод SELECT задан на плате |
|
||||||
|
| Кабель | две пары LVDS: CLK к микрофону, DATA от микрофона | SN65LVDS на обоих концах |
|
||||||
|
| Tang Primer 25K + Dock | модуль GW5A-LV25MG121NC1/I0, **ревизия A** | тактирование микрофона, дециматор, кадры UART, I2S |
|
||||||
|
| Мост BL616 на Dock | встроенный отладчик с заменённой прошивкой (отдельный проект BL616): DirtyJTAG + CDC-UART | загрузка битстрима и UART на ПК по одному USB-C |
|
||||||
|
| Модуль ЦАП | PCM5102A на своей плате, питание через LDO TPS7A2033 | I2S -> аналог, выход OUTL на BNC |
|
||||||
|
| Осциллограф | — | смотрит выход ЦАП |
|
||||||
|
| ПК | Windows, Python 3.10+, openFPGALoader | сборка, загрузка, запись, просмотр, прослушивание |
|
||||||
|
|
||||||
|
## Схема
|
||||||
|
|
||||||
|
```
|
||||||
|
Плата микрофона Tang Primer 25K + Dock (GW5A-25A)
|
||||||
|
+----------------------+ кабель LVDS +--------------------------------------+
|
||||||
|
| SPH9855LM4H-C | | |
|
||||||
|
| CLK <-- SN65LVDS <====== пара CLK ======< SN65LVDS <-- K8 MIC_CLK 3.125 МГц |
|
||||||
|
| DATA --> SN65LVDS >====== пара DATA =====> SN65LVDS --> K9 MIC_DAT PDM |
|
||||||
|
| SELECT: на плате | | |
|
||||||
|
+----------------------+ | E2 генератор 50 МГц |
|
||||||
|
| PDM -> CIC -> ФНЧ -> 12 500 Гц |
|
||||||
|
+----------------------+ I2S | |
|
||||||
|
| Модуль ЦАП PCM5102A |<--------------------+ G1 SCK G2 BCK L4 LRCK L3 DIN |
|
||||||
|
| OUTL -> BNC ------+--> осциллограф | |
|
||||||
|
+----------------------+ | C3 UART_TX --> BL616 --+ |
|
||||||
|
| JTAG <--------- BL616 <-+--> USB-C --> ПК
|
||||||
|
| | COM14 + DirtyJTAG
|
||||||
|
| H11 кнопка S1: усиление ЦАП |
|
||||||
|
| E8 светодиод: состояние, усиление |
|
||||||
|
| E3 отладка: выход PLL 80 МГц |
|
||||||
|
+--------------------------------------+
|
||||||
|
```
|
||||||
|
|
||||||
|
Земля у ПЛИС, линии LVDS и модуля ЦАП общая.
|
||||||
|
|
||||||
|
## Соединения
|
||||||
|
|
||||||
|
| Цепь | Вывод ПЛИС | Банк | Где на плате | Куда идёт |
|
||||||
|
|:--|:--:|:--:|:--|:--|
|
||||||
|
| clk | E2 | 5 | генератор 50 МГц | системный клок; весь тракт и I2S делятся от него, без PLL |
|
||||||
|
| MIC_CLK | K8 | 0 | гребёнка J3 | вход драйвера SN65LVDS, пара CLK к микрофону, 3.125 МГц |
|
||||||
|
| MIC_DAT | K9 | 0 | гребёнка J3 | выход приёмника SN65LVDS, пара DATA от микрофона; подтяжка ПЛИС вниз |
|
||||||
|
| DAC_SCK | G1 | 2 | гребёнка J3 | SCK модуля ЦАП, 12.5 МГц = 256 fS |
|
||||||
|
| I2S_BCK | G2 | 2 | гребёнка J3 | BCK модуля ЦАП, 3.125 МГц = 64 fS |
|
||||||
|
| I2S_LRCK | L4 | 2 | гребёнка J3 | LRCK модуля ЦАП, fS = 48 828 Гц |
|
||||||
|
| I2S_DIN | L3 | 2 | гребёнка J3 | DIN модуля ЦАП |
|
||||||
|
| UART_TX | C3 | 4 | цепь `FPGA_UART_TX` Dock | RX моста BL616 -> COM-порт на ПК, 921600 8N1 |
|
||||||
|
| BTN_GAIN | H11 | 7 | кнопка S1 Dock | замыкает вывод на +3.3 В через 100 Ом; подтяжка ПЛИС вниз |
|
||||||
|
| LED | E8 | 4 | светодиод (READY) | индикация, см. ниже |
|
||||||
|
| clk_80MHz | E3 | 4 | гребёнка J3 | только отладка: выход PLL, к тракту не относится |
|
||||||
|
|
||||||
|
Привязка выводов — в [`src/DigMic.cst`](../src/DigMic.cst). Номера контактов
|
||||||
|
гребёнки J3 — по схеме Dock (`Tang_25K_60033.pdf`, цепи вида `K8_IOT56B_40P`).
|
||||||
|
|
||||||
|
Направления MIC_CLK и MIC_DAT проверены на плате до первой прошивки
|
||||||
|
диагностической прошивкой, которая ничего не выдаёт на спорные выводы: K8
|
||||||
|
висит на подтяжке ПЛИС (вход драйвера), K9 держит приёмник.
|
||||||
|
|
||||||
|
### Питание
|
||||||
|
|
||||||
|
- **Dock** — от USB-C; тот же разъём даёт JTAG и UART через BL616.
|
||||||
|
- **VCCIO банков 6/7** на этой плате подаётся снаружи, через контакты 29 и 31
|
||||||
|
гребёнки. Без 3.3 В на них не работает кнопка S1 (H11, банк 7).
|
||||||
|
- **Модуль ЦАП** — на разъём X1 (цепь `+5.5V`), дальше два LDO TPS7A2033
|
||||||
|
раздельно дают аналоговые и цифровые 3.3 В. На BNC выведен только OUTL;
|
||||||
|
ПЛИС шлёт один и тот же отсчёт в оба канала.
|
||||||
|
- **Сторона микрофона** — по схеме платы микрофона; сам микрофон допускает
|
||||||
|
1.65...3.6 В.
|
||||||
|
|
||||||
|
## ПО на ПК
|
||||||
|
|
||||||
|
| Что | Зачем |
|
||||||
|
|:--|:--|
|
||||||
|
| Gowin EDA V1.9.12 | сборка в IDE |
|
||||||
|
| openFPGALoader ≥ 1.1.0 или `TangProgrammer.exe` — оба лежат в проекте BL616 | загрузка битстрима через DirtyJTAG |
|
||||||
|
| Python 3.10+ и пакеты из [`tools/requirements.txt`](../tools/requirements.txt) | запись, просмотр, прослушивание |
|
||||||
|
| GHDL, Icarus Verilog | только симуляция |
|
||||||
|
|
||||||
|
Gowin Programmer с заменённой прошивкой BL616 **не работает**: он видит
|
||||||
|
только мост со штатной прошивкой Sipeed. Вернуть штатную —
|
||||||
|
`flash.ps1 -Restore` в проекте BL616, но со штатной UART BL616 работает хуже.
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python -m pip install -r tools/requirements.txt
|
||||||
|
```
|
||||||
|
|
||||||
|
## Порядок работы
|
||||||
|
|
||||||
|
### 1. Собрать
|
||||||
|
|
||||||
|
Gowin IDE: открыть `DigMic.gprj`, Run All.
|
||||||
|
|
||||||
|
Битстрим — `impl\pnr\DigMic.fs`. Проект собирается под Device Version **A**
|
||||||
|
(`gw5a25a-002`). Это важно: битстрим под B на этой плате не выдаёт ни
|
||||||
|
байта, а программатор расхождения не замечает, JTAG-код у ревизий одинаковый.
|
||||||
|
|
||||||
|
### 2. Загрузить
|
||||||
|
|
||||||
|
```powershell
|
||||||
|
openFPGALoader -c dirtyJtag impl\pnr\DigMic.fs
|
||||||
|
```
|
||||||
|
|
||||||
|
Битстрим живёт в SRAM до выключения питания. Чтобы ПЛИС стартовала с ним
|
||||||
|
сама, его записывают во флеш: `openFPGALoader -c dirtyJtag -f impl\pnr\DigMic.fs`.
|
||||||
|
То же самое умеет `TangProgrammer.exe`, а с флажком «Загружать в SRAM
|
||||||
|
автоматически» он заливает каждую новую сборку из IDE.
|
||||||
|
|
||||||
|
### 3. Проверить по светодиоду
|
||||||
|
|
||||||
|
| Светодиод | Что значит |
|
||||||
|
|:--|:--|
|
||||||
|
| не мигает, горит или погашен | клока нет или битстрим не загружен |
|
||||||
|
| медленно, 2 Гц | клок есть, отсчёты с дециматора не приходят |
|
||||||
|
| быстро, 10 Гц | отсчёты идут: тракт PDM -> CIC -> ФНЧ работает |
|
||||||
|
| пауза, N коротких вспышек, пауза | только что нажали S1: выбрана ступень N |
|
||||||
|
| пауза, одна длинная вспышка 1 с, пауза | только что нажали S1: ступень 0 |
|
||||||
|
|
||||||
|
Рабочее состояние — быстрое мигание.
|
||||||
|
|
||||||
|
### 4. Посмотреть поток на ПК
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python tools/uart_live.py --port COM14
|
||||||
|
```
|
||||||
|
|
||||||
|
COM14 — порт моста BL616 на этом ПК; на другом номер другой, его
|
||||||
|
показывает `python tools/uart_capture.py --list`. Порт держит только одна
|
||||||
|
программа: `uart_live`, `uart_capture` и `uart_audio` по очереди.
|
||||||
|
|
||||||
|
В строке состояния исправный стенд показывает:
|
||||||
|
|
||||||
|
| Показатель | Норма |
|
||||||
|
|:--|:--|
|
||||||
|
| кадров/с | 250 |
|
||||||
|
| CRC, потеряно, ресинхр | 0; одна-две ошибки CRC и ресинхронизации в первый момент — норма: порт открылся посреди кадра |
|
||||||
|
| STATUS | чисто (`FIFO=1` — переполнение буфера, `SAT=1` — выход упёрся в шкалу) |
|
||||||
|
| тишина в комнате | СКО около −72 dBFS |
|
||||||
|
| смещение нуля | около −90 dBFS |
|
||||||
|
| речь рядом с микрофоном | пики около −50 dBFS |
|
||||||
|
|
||||||
|
### 5. Посмотреть выход ЦАП
|
||||||
|
|
||||||
|
Осциллограф — на BNC модуля ЦАП. Полная шкала 24 бит — 2.1 В скз на выходе
|
||||||
|
PCM5102A. При ступени 0 сигнал там в той же шкале, что на ПК, то есть
|
||||||
|
доли и единицы милливольт. Каждое нажатие S1 даёт ровно +6.02 дБ (сдвиг на
|
||||||
|
разряд), после ступени 8 снова 0:
|
||||||
|
|
||||||
|
| Ступень S1 | Усиление | Фон комнаты, −72 dBFS | Речь, −50 dBFS |
|
||||||
|
|:--:|:--:|:--:|:--:|
|
||||||
|
| 0 | 0 дБ | ≈ 0.5 мВ скз | ≈ 7 мВ |
|
||||||
|
| 4 | +24 дБ | ≈ 8 мВ | ≈ 0.1 В |
|
||||||
|
| 8 | +48 дБ | ≈ 0.13 В | ≈ 1.7 В, у предела шкалы |
|
||||||
|
|
||||||
|
На ступени 8 всё громче примерно 85 дБ SPL упирается в шкалу и ограничивается;
|
||||||
|
признака этого нигде нет, на ПК при этом шкала прежняя. Полоса выхода, как у
|
||||||
|
всего тракта, — до 5 кГц, задержка относительно UART — один отсчёт, 80 мкс.
|
||||||
|
|
||||||
|
### 6. Записать и послушать
|
||||||
|
|
||||||
|
```bash
|
||||||
|
python tools/uart_capture.py --port COM14 --seconds 10 --out test1
|
||||||
|
python tools/Bin_to_wav.py test1.bin
|
||||||
|
python tools/uart_audio.py --port COM14
|
||||||
|
```
|
||||||
|
|
||||||
|
`uart_capture` пишет `test1.raw` (поток как есть), `test1.bin` (только
|
||||||
|
отсчёты, 3 байта BE) и `test1.log` со сводкой: те же показатели, что в
|
||||||
|
таблице п. 4. `Bin_to_wav` делает из `.bin` WAV. `uart_audio` отправляет
|
||||||
|
поток на звуковую карту ПК, слушать лучше в наушниках. Подробности — в
|
||||||
|
[README](../README.md#по-на-пк).
|
||||||
|
|
||||||
|
## Если не работает
|
||||||
|
|
||||||
|
| Признак | Вероятная причина | Что сделать |
|
||||||
|
|:--|:--|:--|
|
||||||
|
| светодиод не мигает | битстрим не загружен или нет клока | загрузить заново; с `LED_SRC = 3` в `Top.vhd` светодиод мигает ровно 1 Гц прямо от clk: другой период значит, что клок не 50 МГц |
|
||||||
|
| светодиод мигает медленно | отсчёты не идут: обрыв MIC_CLK или MIC_DAT, нет питания линии или микрофона | осциллографом: 3.125 МГц на K8 и PDM на K9; `LED_SRC = 2` — мигание от битов PDM, `1` — от CIC: быстрое мерцание значит, что этот участок живой |
|
||||||
|
| на ПК ни одного байта | битстрим собран под ревизию B; открыт не тот порт; UART не на C3 | проверить Device Version **A** в проекте; `uart_capture.py --list`; `UART_TX` в `DigMic.cst` |
|
||||||
|
| CRC или ресинхронизации растут постоянно | скорость порта не 921600 | `--baud 921600`, это значение по умолчанию |
|
||||||
|
| кадров/с меньше 250, `потеряно` растёт | байты теряются в мосте или драйвере, либо разбор не успевает | `uart_capture.py --port COM14 --dump`: только приём без разбора, сравнивает скорость с ожидаемой и говорит, где потери |
|
||||||
|
| сигнал пропал или стал шумом после замены кабеля или SN65LVDS | сдвинулась точка выборки бита | перемерить фазу смены MIC_DAT относительно MIC_CLK и поправить `MIC_SMP_CNT` в `Top.vhd`, см. README |
|
||||||
|
| кнопка S1 не меняет ступень | нет 3.3 В на VCCIO банков 6/7 | подать 3.3 В на контакты 29 и 31 гребёнки |
|
||||||
|
| на ПК сигнал есть, на осциллографе нет | ступень 0: на выходе доли мВ; нет питания модуля ЦАП | нажать S1 несколько раз; проверить питание X1 и общую землю |
|
||||||
|
| `could not open port` | порт держит другая программа | закрыть `uart_live` / `uart_audio` / терминал |
|
||||||
|
| Gowin Programmer не видит кабель | на BL616 заменённая прошивка | грузить через openFPGALoader или TangProgrammer |
|
||||||
|
|
||||||
|
### Чего не делать
|
||||||
|
|
||||||
|
Два ограничения кристалла найдены на железе ещё при сборке под ревизию B. Под
|
||||||
|
A их пока не перепроверяли, поэтому они остаются в силе:
|
||||||
|
|
||||||
|
- **не расширять аккумуляторы CIC сверх 18 бит**: при 20 битах и больше
|
||||||
|
тракт молча отдаёт нули, хотя синтез, тайминг и симуляция чистые;
|
||||||
|
- **не добавлять сброс по включению**: счётчик, держащий `rst_n`, убивает тракт.
|
||||||
|
|
||||||
|
Подробности — в README, раздел про ограничения кристалла.
|
||||||
Reference in New Issue
Block a user