AD7766 на Tang Primer 25K: отладочная прошивка, структура после рефакторинга
This commit is contained in:
@@ -0,0 +1,72 @@
|
||||
# AD7766 на Tang Primer 25K
|
||||
|
||||
Отладочная прошивка для AD7766: непрерывная оцифровка дифференциального входа
|
||||
и выдача отсчётов по UART для просмотра в `F:\PyPrj\Signal_analayzer`.
|
||||
|
||||
MCLK 1.000 МГц -> ODR 125 kSPS -> дециматор sinc^1 /10 -> **12 500 Гц** ->
|
||||
кадры по 50 отсчётов -> UART 921600.
|
||||
|
||||
Параметры и обоснования со ссылками на даташит — [docs/design.md](docs/design.md).
|
||||
Распиновка — [docs/pinout.md](docs/pinout.md).
|
||||
|
||||
## Состав
|
||||
|
||||
| Файл | Назначение |
|
||||
|:--|:--|
|
||||
| `src/Top.vhd` | верхний уровень: только экземпляры и связи, без логики |
|
||||
| `src/SPI_Master.vhd` | битовый уровень обмена: CS, SCLK, защёлка SDO |
|
||||
| `src/SPI_Ctrl.vhd` | MCLK, сброс через SYNC/PD, запуск чтения по спаду DRDY |
|
||||
| `src/decimator.vhd` | усреднение по 10 отсчётам |
|
||||
| `src/fifo_top.vhd` | буфер отсчётов, заглушка под IP-ядро Gowin |
|
||||
| `src/Packets_creator.vhd` | сборка кадра с CRC-16 |
|
||||
| `src/UART.vhd` | передатчик, взят из `zvp_da_common` без изменений |
|
||||
| `src/led_status.vhd` | индикация частотой мигания |
|
||||
| `src/AD7766.cst` | привязка выводов |
|
||||
| `tb/ad7766_model.vhd` | поведенческая модель АЦП по Table 3 |
|
||||
| `tb/tb_top.vhd` | сквозной тест: модель -> ПЛИС -> UART -> разбор кадра |
|
||||
| `tools/uart_capture.py` | приём кадров, запись `.raw` и `.bin` |
|
||||
| `tools/uart_live.py` | живой просмотр: осциллограмма, спектр, счётчики |
|
||||
|
||||
## Симуляция (GHDL)
|
||||
|
||||
```bash
|
||||
ghdl -a --std=08 --workdir=build src/fifo_top.vhd src/UART.vhd src/led_status.vhd src/SPI_Master.vhd src/SPI_Ctrl.vhd src/decimator.vhd src/Packets_creator.vhd src/Top.vhd tb/ad7766_model.vhd tb/tb_top.vhd && ghdl -e --std=08 --workdir=build tb_top && ./tb_top --stop-time=20ms
|
||||
```
|
||||
|
||||
Модель выдаёт группами по 10 одинаковых слов, поэтому усреднённый отсчёт обязан
|
||||
совпасть со значением группы побитово. Число проверяемых кадров задаётся
|
||||
`-gFRAMES=N` (один кадр ~4 мс модельного времени).
|
||||
|
||||
## Запись с железа
|
||||
|
||||
```bash
|
||||
py -3 tools/uart_capture.py --list
|
||||
```
|
||||
|
||||
```bash
|
||||
py -3 tools/uart_capture.py --port COM5 --seconds 10 --out test1
|
||||
```
|
||||
|
||||
Получаются `test1.raw` (весь поток как пришёл, для отладки канала),
|
||||
`test1.bin` (только отсчёты, читается `read_24bit_bin()`) и `test1.log`.
|
||||
|
||||
В `Signal_analayzer` для этих данных: `'FS': 12500`, `'V_REF': 5`.
|
||||
|
||||
## Живой просмотр
|
||||
|
||||
```bash
|
||||
py -3 tools/uart_live.py --port COM10
|
||||
```
|
||||
|
||||
Осциллограмма, спектр и счётчики кадров в реальном времени — чтобы посмотреть
|
||||
сигнал до того, как писать запись. Управление кнопками внизу окна: запись,
|
||||
автомасштаб, вычитание постоянной составляющей, вид спектра, пауза. Те же
|
||||
действия продублированы клавишами `r`, `a`, `d`, `s`, `f`, выход — `q`.
|
||||
|
||||
Запись встроена в просмотр по необходимости: COM-порт держит один процесс,
|
||||
и запустить `uart_capture.py` на том же порту параллельно нельзя. Для записи
|
||||
без просмотра остаётся `uart_capture.py` — он же нужен, когда важно
|
||||
фиксированное время записи.
|
||||
|
||||
Разбор кадров у обоих инструментов общий (`FrameParser` в `uart_capture.py`):
|
||||
формат описан в одном месте, так что просмотр и запись не могут разойтись.
|
||||
Reference in New Issue
Block a user