Порядок CIC 3 вместо 4: аккумуляторы шире 18 бит не работают в кристалле
Тракт молча отдавал нули: CIC с 26-битными аккумуляторами в железе не считает, хотя синтез, трассировка, тайминг и симуляция чистые. Порог найден перебором на плате с приёмом по UART: 26, 24 и 20 бит мертвы, 18, 16 и 10 работают. Порядок 3 требует ровно 18 бит вместо 24 и попадает в рабочую область. Характеристики от этого стали лучше: подавление в задерживании 76 дБ вместо 72, сворачиваемых полос 92 дБ вместо 77, полоса та же 0.032 дБ. Коэффициенты ФНЧ пересчитаны под sinc^3, сдвиг выхода уменьшен до 13 -- усиление CIC теперь 50^3, и коэффициенты по-прежнему укладываются в 18 бит. Сброс по включению убран: он тоже убивает тракт, проверено прошивкой в обе стороны. Маяк светодиода вынесен в условную генерацию, чтобы его широкий счётчик не собирался в рабочем режиме. Проверено на плате: 1481 кадр за 6 с, 74050 отсчётов, CRC без ошибок, STATUS чистый, на входе живой звук.
This commit is contained in:
@@ -3,7 +3,7 @@
|
||||
Прошивка принимает поток PDM с микрофона SPH9855LM4H-C, приводит его к
|
||||
**24 бит / 12 500 Гц** и отдаёт отсчёты кадрами по UART.
|
||||
|
||||
MIC_CLK 3.125 МГц -> CIC sinc^4 /50 -> 62.5 кГц -> ФНЧ /5 -> **12 500 Гц** ->
|
||||
MIC_CLK 3.125 МГц -> CIC sinc^3 /50 -> 62.5 кГц -> ФНЧ /5 -> **12 500 Гц** ->
|
||||
кадры по 50 отсчётов -> UART 921600.
|
||||
|
||||
## Тактирование и частоты
|
||||
@@ -12,7 +12,7 @@ MIC_CLK 3.125 МГц -> CIC sinc^4 /50 -> 62.5 кГц -> ФНЧ /5 -> **12 500
|
||||
|:--|:--|:--|
|
||||
| Системный клок | 50 МГц (E2) | генератор платы |
|
||||
| MIC_CLK | 3.125 МГц = 50/16 | Normal mode микрофона 1.1...4.8 МГц |
|
||||
| CIC | sinc^4, децимация 50 | до 62.5 кГц, без умножителей |
|
||||
| CIC | sinc^3, децимация 50 | до 62.5 кГц, без умножителей, аккумуляторы 18 бит |
|
||||
| ФНЧ | 221 отвод, децимация 5 | до 12 500 Гц |
|
||||
| Выходная ЧД | 12 500 Гц | |
|
||||
| UART | 921600, 8N1 | 157 байт на кадр, 250 кадров/с, 39.25 кБ/с (43% канала) |
|
||||
@@ -31,11 +31,15 @@ CIC снимает поток до 62.5 кГц, а всю избирательн
|
||||
| Показатель | Значение |
|
||||
|:--|:--|
|
||||
| неравномерность полосы 0...5000 Гц | 0.032 дБ |
|
||||
| подавление от 6250 Гц | 72 дБ |
|
||||
| подавление сворачиваемых полос | 77 дБ |
|
||||
| подавление от 6250 Гц | 76 дБ |
|
||||
| подавление сворачиваемых полос | 92 дБ |
|
||||
|
||||
Спад CIC в полосе (до 0.36 дБ на краю) не компенсируется отдельным звеном:
|
||||
он задан прямо в желаемой АЧХ при расчёте ФНЧ.
|
||||
Спад CIC в полосе не компенсируется отдельным звеном: он задан прямо в желаемой
|
||||
АЧХ при расчёте ФНЧ, поэтому смена порядка CIC требует только перезапуска
|
||||
генератора коэффициентов.
|
||||
|
||||
Порядок 3, а не 4, выбран не из соображений АЧХ — характеристики с ним даже
|
||||
лучше — а по ограничению кристалла, см. ниже.
|
||||
|
||||
Коэффициенты и разрядности лежат в `src/fir_coefs_pkg.vhd`, файл генерируется:
|
||||
|
||||
@@ -46,7 +50,7 @@ py -3 tools/gen_fir_coefs.py
|
||||
## Шкала
|
||||
|
||||
Постоянная `'1'` на выводе данных микрофона даёт полную шкалу 24 бит
|
||||
(код 8 388 567). Отсюда шкала выхода — dBFS, ровно та, в которой микрофон
|
||||
(код 8 388 596). Отсюда шкала выхода — dBFS, ровно та, в которой микрофон
|
||||
специфицирован. Вольт в тракте нет, `V_REF` в приёмных скриптах не нужен.
|
||||
|
||||
## Формат кадра UART
|
||||
@@ -85,6 +89,21 @@ B3 (`FPGA_UART_RX`, контакт 19).
|
||||
выборка идёт в середине низкой фазы. Если вывод SELECT посажен на питание
|
||||
платой, поменять `SEL_HIGH` в `Top.vhd` на `'1'` — точка выборки переедет сама.
|
||||
|
||||
## Два ограничения кристалла, добытые на железе
|
||||
|
||||
Оба проявляются одинаково: синтез и трассировка проходят без замечаний, тайминг
|
||||
чистый, симуляция верная, а в кристалле тракт молча отдаёт нули.
|
||||
|
||||
**Разрядность аккумуляторов CIC не выше 18 бит.** Проверено перебором на плате
|
||||
с приёмом по UART: 26, 24 и 20 бит — тракт мёртв, 18, 16 и 10 бит — работает.
|
||||
Отсюда порядок 3: требуется `ORDER*log2(DECIM)+1`, для 3 и 50 это ровно 18, для
|
||||
4 было бы 24. На аккумулятор ФНЧ (40 бит) ограничение не распространяется — он
|
||||
проверен на железе и считает верно.
|
||||
|
||||
**Сброс по включению ставить нельзя.** Добавление счётчика, держащего `rst_n`
|
||||
в нуле первые 256 тактов, убивает тракт целиком. С константой `'1'` всё
|
||||
работает. Проверено прошивкой в обе стороны.
|
||||
|
||||
## Сборка
|
||||
|
||||
Выводы `clk` (E2) и `LED` (E8) на этом корпусе сидят на двойных функциях
|
||||
@@ -93,8 +112,9 @@ B3 (`FPGA_UART_RX`, контакт 19).
|
||||
в `gw_sh` -- `set_option -use_cpu_as_gpio 1 -use_sspi_as_gpio 1
|
||||
-use_ready_as_gpio 1`.
|
||||
|
||||
Занято на GW5A-25: 778 LUT/ALU (4%), 616 регистров (3%), 5 BSRAM (9%),
|
||||
1 DSP (4%). Fmax 164 МГц при требуемых 50, нарушений установки и удержания нет.
|
||||
Занято на GW5A-25: 649 LUT/ALU (3%), 461 регистр (2%), 4 BSRAM (8%), 1 DSP (4%).
|
||||
Тайминг сходится с запасом, но полагаться на него как на признак исправности
|
||||
нельзя — см. раздел про ограничения кристалла выше.
|
||||
|
||||
## Состав
|
||||
|
||||
@@ -102,7 +122,7 @@ B3 (`FPGA_UART_RX`, контакт 19).
|
||||
|:--|:--|
|
||||
| `src/Top.vhd` | верхний уровень: только экземпляры и связи |
|
||||
| `src/pdm_rx.vhd` | тактирование микрофона и выборка бита в нужной фазе |
|
||||
| `src/cic_decim.vhd` | CIC sinc^4, децимация 50 |
|
||||
| `src/cic_decim.vhd` | CIC sinc^3, децимация 50 |
|
||||
| `src/fir_decim.vhd` | ФНЧ с децимацией 5, последовательная свёртка |
|
||||
| `src/fir_coefs_pkg.vhd` | коэффициенты ФНЧ, генерируется |
|
||||
| `src/fifo_top.vhd` | буфер отсчётов, заглушка под IP-ядро Gowin |
|
||||
|
||||
Reference in New Issue
Block a user