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

Лабораторная 5.9 — Кадровый BPSK TX/RX loopback верхнего уровня

Цель

Объединить отдельные якоря TX и RX в одну детерминированную кадровую HDL-цепочку:

биты кадра -> маппер символов -> upsampler 8x -> RRC TX FIR -> RRC RX FIR -> тайминг с фиксированной фазой -> жёсткое решение

Это первый шаг интеграции верхнего уровня в Блоке 5, ориентированный на Zynq. Он добавляет две вещи, которых ранние работы намеренно избегали:

  1. управление кадровым источником сигналами valid/ready/last;
  2. детерминированную очистку нулевыми символами после последнего бита, чтобы хвосты FIR были полностью наблюдаемы в loopback.

Исполняемый HDL-пакет

Файл Назначение
blocks/block_05_fpga_hdl_flow/rtl/bpsk_framed_tx_chain.v кадровая BPSK-цепочка TX с автоматическим хвостом очистки
blocks/block_05_fpga_hdl_flow/rtl/bpsk_rx_bit_recovery_chain.v обёртка RX: согласованный фильтр, сэмплер тайминга и жёсткое решение
blocks/block_05_fpga_hdl_flow/python/generate_bpsk_framed_loopback_vectors.py генерирует кадровые входные биты и метаданные loopback
blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_framed_loopback.v самопроверяющийся интегрированный testbench loopback TX/RX

Запуск из корня репозитория:

python blocks/block_05_fpga_hdl_flow/python/generate_bpsk_framed_loopback_vectors.py

iverilog -g2012 \
  -o blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_framed_loopback.out \
  blocks/block_05_fpga_hdl_flow/rtl/bpsk_symbol_mapper.v \
  blocks/block_05_fpga_hdl_flow/rtl/bpsk_upsampler_8x.v \
  blocks/block_05_fpga_hdl_flow/rtl/bpsk_rrc_tx_fir.v \
  blocks/block_05_fpga_hdl_flow/rtl/bpsk_rrc_rx_fir.v \
  blocks/block_05_fpga_hdl_flow/rtl/bpsk_symbol_timing_sampler.v \
  blocks/block_05_fpga_hdl_flow/rtl/bpsk_hard_decision.v \
  blocks/block_05_fpga_hdl_flow/rtl/bpsk_framed_tx_chain.v \
  blocks/block_05_fpga_hdl_flow/rtl/bpsk_rx_bit_recovery_chain.v \
  blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_framed_loopback.v

vvp blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_framed_loopback.out

Ожидаемый результат:

PASS: bpsk_framed_loopback completed without errors

Что изменилось по сравнению с Lab 5.6–5.8

Ранние работы доказывали каждый мост по отдельности:

  • отображение бит в символы;
  • расширение от символьной частоты к частоте отсчётов;
  • формирование импульса на TX;
  • согласованная фильтрация RX и детерминированное восстановление бит.

Эта работа доказывает, что эти этапы теперь могут работать как один кадровый пакет, а не как изолированные статические проверки.

Контракт кадрирования

Обёртка TX принимает:

Сигнал Смысл
s_valid доступен один исходный бит
s_ready цепочка может принять следующий бит кадра
s_last отмечает последний бит payload кадра

После s_last обёртка вставляет детерминированный хвост очистки нулевыми символами. В текущей BPSK-конфигурации метаданные loopback определяют его как 16 нулевых символов: этого достаточно, чтобы вытолкнуть суммарные хвосты FIR на TX и RX.

Общие метаданные из Блока 11

Генератор loopback использует:

Общий файл Роль
tx_bits.txt кадровый payload и эталон BER
rrc_taps_q15.txt общие коэффициенты формирования импульса TX/RX
config.json samples_per_symbol = 8 и контекст кадра

Генератор ищет детерминированную точку выборки согласованного фильтра для полностью интегрированного HDL-эквивалентного loopback и сохраняет её в bpsk_framed_loopback_meta.txt.

Почему этот этап важен

Это недостающий мост между юнит-проверками HDL и настоящим трактом модема уровня платы:

  1. теперь есть кадровая точка входа вместо отдельных векторов;
  2. у цепочки TX есть явное поведение при завершении пакета;
  3. цепочка RX подключена к тому же контракту тайминга и BER;
  4. сквозной HDL-маршрут теперь можно поднять до верхнего уровня Zynq с DMA или RF-вводом-выводом.

Чего ожидать

PASS: bpsk_framed_loopback completed without errors (281 bits, payload errors 0)

tb/bpsk_framed_loopback_meta.txt: start_offset = 62, sps = 8, 281 бит, 25 бит преамбулы, flush_symbols = 16. Здесь отсчёты формирует TX-цепочка внутри того же верхнего уровня, поэтому смещение задаётся внутренним конвейером, а не сохранёнными входными векторами, как в Lab 5.8.

Раннер курса генерирует векторы, компилирует, запускает симуляцию и считает ошибкой любую строку FAIL или ненулевой код выхода симулятора:

python tools/run_block5_hdl_smoke.py --test tb_bpsk_framed_loopback

Упражнения

Каждое упражнение ниже: намеренная мутация RTL в одну строку. Внесите её, запустите testbench, прочитайте сообщения и верните файл (git checkout -- <file>). Приведённые выводы получены на Icarus Verilog 12.0.

  1. Примените инверсию полярности из Lab 5.8 (out_bit <= (in_i >= 0);). Этот testbench падает так же: total/payload errors = 281 / 256. Ничто в этом верхнем уровне не знает, как должна выглядеть преамбула.
  2. Почему TX должен посылать ещё flush_symbols = 16 нулевых символов после последнего бита кадра? Свяжите это число с групповой задержкой TX- и RX-RRC-фильтров (по 65 отводов, 8 отсчётов на символ).
  3. Какой один сигнал на waveform вы бы смотрели первым, чтобы найти начало кадра, и почему start_offset: ненадёжный способ найти его на реальном железе?
Ответы (сверены с RTL и стендом)
  1. Наблюдаемый вывод приведён в упражнении: у этого верхнего уровня нет опоры, чтобы обнаружить инверсию.
  2. Каждый 65-отводный RRC-фильтр задерживает сигнал на 32 отсчёта, то есть 4 символа при 8 отсчётах на символ; TX и RX вместе на 8 символов плюс регистровая латентность конвейера. Без хвостовых символов последние биты кадра ещё были бы внутри фильтров, когда вход остановится; 16 нулевых символов проталкивают их с запасом.
  3. Выход согласованного фильтра (или сигнал корреляции/захвата преамбулы, где он есть): кадр начинается там, где появляется известный шаблон преамбулы. start_offset жёстко задаёт полную латентность в отсчётах, а на оборудовании она зависит от FIFO преобразователей, тракта AD936x и момента включения каждого блока; она может различаться между сборками и между загрузками, как показывают разборы случаев блока 11.

Чек-лист отчёта

  • Показано, что s_ready ограничивает кадровый источник скоростью upsampler 8x.
  • Указано число символов очистки и зачем они нужны.
  • Приведено детерминированное start_offset, использованное приёмником loopback.
  • Показан финальный лог pass с нулём полных и payload-ошибок.
  • Указан следующий аппаратный шаг: интеграция маршрутизированного top-level или проверка TX/RX на плате.

Шаблон инженерного вывода

Кадровый BPSK HDL loopback соединил маппер, upsampler 8x, RRC TX FIR и детерминированную цепочку восстановления RX в один самопроверяющийся пакетный тракт.
Сторона TX теперь предоставляет кадровый интерфейс ready/valid и добавляет детерминированный хвост очистки после последнего бита.
Это первый интегрированный HDL-якорь верхнего уровня, который можно поднять до маршрутизированного проекта Zynq и затем до измерений BER.