Лабораторная 11.4 — Итоговый измерительный отчёт¶
Цель¶
Итоговый инженерный отчёт по интегрированному SDR-проекту: QPSK-модем в fabric на Zynq-7020 + AD9361, проверенный на двухплатном RF-канале по кабелю.
Инженерный вопрос¶
Даёт ли проект достаточно доказательств того, что SDR-цепочка работает как задумано?
Да. Синтезированный модем PL восстанавливает известный кадр без ошибок в 50 из 50 холодных загрузок через loopback fabric, а на двухплатном RF-канале декодирует непрерывно передаваемый кадр без катастрофических (потеря всего пакета) отказов и с BER payload около 4×10⁻⁴. Доказательства детерминированы, статистичны и воспроизводимы по закоммиченным скриптам.
Аннотация¶
Детерминированный пакет QPSK формируется в PL (ROM кадра → дифференциальный кодер → RRC → ЦАП), передаётся платой A по закрытому кабелю SMA + аттенюатор 30 дБ на частоте 915 МГц и принимается платой B, чья RX-цепочка в fabric (DC-блокер → согласованный фильтр → выбор фазы прямой связью → восстановление тайминга по Гарднеру → грубый CFO → восстановление несущей по Костасу → жёсткое решение → дифференциальный декодер → счётчик BER с разрешением квадранта) восстанавливает кадр и оценивает его на кристалле. Канал закрывается с 0 ошибок на 5,6 млн бит (BER < 5,34×10⁻⁷) в когерентном loopback fabric и при ~4×10⁻⁴ на двух независимых по опоре RF-фронтендах, причём отказы поворота всего пакета устранены дифференциальным кодированием и удлинённой преамбулой.
Архитектура¶
Плата A (TX) Плата B (RX, модем в fabric)
ROM кадра (512b) AD9361 RX1 ─ АЦП
│ диф. кодирование (хост) │
│ QPSK-маппинг + RRC (SPS=8) DC-блокер (скользящее среднее, удаление утечки LO)
│ iio_writedev -c (циклически) │ согласованный RRC FIR
AD9361 TX1 ─ ЦАП ── SMA + 30 дБ ──► │ выбор фазы прямой связью
аттенюатор │ восстановление тайминга по Гарднеру
│ грубый CFO (4-я степень, прямая связь)
│ восстановление несущей по Костасу (gp_ctrl[10])
│ жёсткое решение → диф. декодер (gp_ctrl[17])
│ счётчик BER с разрешением квадранта + телеметрия позиции
gpreg @ 0x79040000 (хост читает счётчики)
Runtime-переключатели функций находятся в gp_ctrl (DC-блокер, Костас, грубый CFO, выбор фазы, Гарднер, чтение позиции payload, чтение декодированных бит, дифференциальный режим). Плоскость управления/статуса: окно axi_gpreg по адресу 0x79040000.
Метод¶
- Симуляция / RTL: у каждого блока есть testbench на Icarus; весь набор Блока 5 это 36/36, несколько testbench управляются реальными захватами с платы (
tb_qpsk_rx_costas,tb_qpsk_costas_stress,tb_qpsk_two_board_residual_cfo). RTL подкреплён офлайн-моделями, побитово совпадающими с ним (dc_blocker_margin.py,lab_11_43_dqpsk_model.py). - RF: две платы; плата A это образ вендора Pluto (непрерывная передача
iio_writedev), плата B это загрузочный образ курса (приём в fabric). Кадр побитово точно пересобирается на Python из того же ROM, что читает RTL. - Запись / оценка: счётчик BER на кристалле оценивает каждый пакет; хост читает счётчики через gpreg (
qpsk_ber_once). Телеметрия позиции (gp_ctrl[15]) и чтение декодированных бит (gp_ctrl[16]) локализуют ошибки.
Установка¶
| Параметр | Значение |
|---|---|
| Несущая | 915 МГц |
| Частота дискретизации | 3,84 МГц (SPS = 8) |
| Символьная скорость | 480 кСимв/с, QPSK (Грей) |
| Усиление TX | −30 дБ на вход аттенюатора 30 дБ (закрытый кабель SMA) |
| Усиление RX | 50 дБ, ручное |
| Кадр | 152 символа = 24-символьная преамбула + 256 бит payload (дифференциальный, длинная преамбула) |
| Безопасность в простое | обе платы возвращаются на −89,75 дБ после каждого теста |
| Микросхема / инструменты | xc7z020clg400-2, Vivado 2021.1, тайминг WNS +0,116 нс (поставляемый дифференциальный образ, по логу его сборки) |
Результаты¶
Loopback fabric (когерентный, детерминированный), кампания холодных загрузок: 50/50 холодных загрузок декодируют чисто; BPSK+QPSK вместе 5 610 000 бит, 0 ошибок → BER < 5,34×10⁻⁷ (95 %, односторонняя граница, правило трёх).
Двухплатный RF-канал (A TX1 → 30 дБ → B RX1), 915 МГц:
| Конфигурация | Чистые кадры | Грубые (поворот всего пакета) | BER payload |
|---|---|---|---|
| абсолютный, lock-tol=1 (140/24) | 98,9 % (1182/1195) | 0,75 % | ~3×10⁻³ |
| дифференциальный + 24-симв. преамбула (152/48) | 96,9–98,8 % | 0 % | ~4×10⁻⁴ |
Несущая / частота: собственный межплатный CFO измерен как −194 / −238 / −288 Гц на трёх холодных загрузках; оценщик грубого CFO отслеживает намеренно введённый сдвиг во всём однозначном диапазоне ±60 кГц (Lab 11.31), а петля Костаса убирает остаток, поэтому созвездие неподвижно на протяжении кадра.
Минимум графиков (артефакты)¶
- схема архитектуры: выше;
- частотный план TX/RX: таблица «Установка»;
- FFT / созвездие:
docs/assets/lab1132_two_board_fabric_coarse_cfo.pngи читатели отвода захвата (capture_tap_symbol_margin.py); - сводка BER:
docs/assets/lab1142_ber_floor_live.json,lab1145_diff_long_preamble_live.json; - воспроизводимость: скрипты
lab_11_30…11_45.
Таблица «прошёл/не прошёл»¶
| Критерий | Цель | Измерено | Статус |
|---|---|---|---|
| частотная ошибка (остаток после восстановления) | ≈ 0 (петля неподвижна) | собственная ~200–300 Гц, отслеживается; диапазон ±60 кГц | PASS |
| SNR / запас решения | положительный запас по каждой оси | нормированный запас решения ~0,97 (медиана), ни одна ось не < 0 | PASS |
| EVM | (отдельно не инструментирован) | сквозное качество отражено в BER | н/д |
| BER (две платы) | работающий канал, нет катастрофических потерь | 4,5×10⁻⁴, 0 грубых | PASS |
| BER (loopback fabric) | ≈ 0 | < 5,34×10⁻⁷ на 5,6 млн бит | PASS |
| доля ограничения | 0 | TX на 0,70× полной шкалы; RX не упирается в шину | PASS |
Обсуждение: ограничения и источники ошибок¶
- Дифференциальный штраф. Дифференциальный QPSK стоит присущих ~3 дБ (каждая символьная ошибка даёт две битовые), что видно как остаточная перемежающаяся частота одиночных бит-ошибок, из-за которой число чистых кадров остаётся около 97–99 %, а не 100 %. Это не отказ поворота. Компромисс того стоит: катастрофические пакеты с BER ~46 % исчезли, а суммарный BER упал на порядок.
- Переходный процесс адаптивной петли. Дифференциальное декодирование считывает разность фаз между соседними символами, поэтому любая RX-петля, ещё устанавливающаяся в начале payload, портит результат. Исправление (24-символьная преамбула, чтобы payload начинался после захвата) описано в Lab 11.45; более длинная 32-символьная преамбула хуже (доля захвата падает за пределами запаса сэмплера).
- Зависимость AD9361 от холодного сброса. Тёплая перезагрузка оставляет BBPLL в таймауте калибровки; после загрузки нового образа PL требуется физическое выключение питания.
- SNR/EVM отдельно не инструментированы. Отчётной метрикой сквозного качества служит BER; отдельный захват EVM: возможное будущее дополнение.
Воспроизводимость¶
# плата A (вендорский Pluto) передаёт дифференциальный кадр с длинной преамбулой; плата B (курс) оценивает его
python blocks/block_11_integrated_sdr_project/python/lab_11_45_differential_long_preamble.py # -> docs/assets/lab1145_diff_long_preamble_live.json
python blocks/block_11_integrated_sdr_project/python/lab_11_42_ber_floor_lock_tolerance.py --predict # арифметика ложного захвата, без стенда
python tools/run_block5_hdl_smoke.py # набор RTL, 36/36
Идентичность bitstream, тайминг и использование ресурсов для каждой вехи находятся в закрытом репозитории артефактов (zynq-sdr-course-artifacts) с созданными и проверенными манифестами. Поставляемый дифференциальный образ: исходный system_top.bit sha256 69023a2b…, WNS +0,116 нс, 176 DSP. (Тайминг взят из строки верификатора в логе сборки, который хранится вместе с образом; отчёты трассировки этой сборки не сохранились. Прежняя версия отчёта указывала +0,036 нс, что не совпадает с логом сборки этого образа.)
Чек-лист отчёта¶
- Указаны все графики/артефакты.
- У всех метрик есть единицы.
- Приложены метаданные (результаты JSON, хеши bitstream, коммиты).
- Команды воспроизводимы.
- Ограничения указаны честно (дифференциальный штраф, холодный сброс, EVM не инструментирован).
- Вывод следует из измеренных данных.
Инженерный вывод¶
Итоговый SDR-проект дал работающий QPSK-модем в fabric, проверенный на двухплатном RF-канале 915 МГц.
Остаточная межплатная частотная ошибка составила ~200–300 Гц (отслеживается; диапазон ±60 кГц),
запас решения RX оставался положительным по каждой оси (~0,97 нормированная медиана), а BER payload
составил 4,5e-4 по RF-каналу и < 5,3e-7 в когерентном loopback fabric. Проект ДОСТИГАЕТ критериев
успеха: цепочка детерминированно восстанавливает известный кадр, отказы поворота всего пакета
устранены дифференциальным кодированием и удлинённой преамбулой, а каждый результат воспроизводим
по закоммиченным скриптам.
Следующие шаги: гоняться за остаточной частотой одиночных дифференциальных бит-ошибок стоит только если это нужно конкретному приложению (присущий штраф ~3 дБ); в остальном канал завершён. Блок 12 упаковывает это в итоговые проекты курса.