Перейти к содержанию

Лабораторная 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 упаковывает это в итоговые проекты курса.