Лабораторная 5.9 — Кадровый BPSK TX/RX loopback верхнего уровня¶
Цель¶
Объединить отдельные якоря TX и RX в одну детерминированную кадровую HDL-цепочку:
биты кадра -> маппер символов -> upsampler 8x -> RRC TX FIR -> RRC RX FIR -> тайминг с фиксированной фазой -> жёсткое решение
Это первый шаг интеграции верхнего уровня в Блоке 5, ориентированный на Zynq. Он добавляет две вещи, которых ранние работы намеренно избегали:
- управление кадровым источником сигналами
valid/ready/last; - детерминированную очистку нулевыми символами после последнего бита, чтобы хвосты 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 и настоящим трактом модема уровня платы:
- теперь есть кадровая точка входа вместо отдельных векторов;
- у цепочки TX есть явное поведение при завершении пакета;
- цепочка RX подключена к тому же контракту тайминга и BER;
- сквозной 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.
- Примените инверсию полярности из Lab 5.8 (
out_bit <= (in_i >= 0);). Этот testbench падает так же:total/payload errors = 281 / 256. Ничто в этом верхнем уровне не знает, как должна выглядеть преамбула. - Почему TX должен посылать ещё
flush_symbols = 16нулевых символов после последнего бита кадра? Свяжите это число с групповой задержкой TX- и RX-RRC-фильтров (по 65 отводов, 8 отсчётов на символ). - Какой один сигнал на waveform вы бы смотрели первым, чтобы найти начало кадра, и почему
start_offset: ненадёжный способ найти его на реальном железе?
Ответы (сверены с RTL и стендом)
- Наблюдаемый вывод приведён в упражнении: у этого верхнего уровня нет опоры, чтобы обнаружить инверсию.
- Каждый 65-отводный RRC-фильтр задерживает сигнал на 32 отсчёта, то есть 4 символа при 8 отсчётах на символ; TX и RX вместе на 8 символов плюс регистровая латентность конвейера. Без хвостовых символов последние биты кадра ещё были бы внутри фильтров, когда вход остановится; 16 нулевых символов проталкивают их с запасом.
- Выход согласованного фильтра (или сигнал корреляции/захвата преамбулы, где он есть): кадр начинается там, где появляется известный шаблон преамбулы.
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.