Лабораторная 5.11 — Обёртка управления AXI-Lite для BPSK BER верхнего уровня¶
Цель¶
Открыть детерминированный верхний уровень BPSK BER для плоскости управления в стиле Zynq Processing System:
PS / ПО -> регистры AXI-Lite -> кадровое BPSK BER-ядро -> граница отсчётов TX/RX
Это управляющий компаньон Lab 5.10. Тракт данных DSP остаётся тем же, но команда запуска, параметры тайминга и результаты BER теперь проходят через компактный интерфейс регистров, отображённых в память.
Исполняемый HDL-пакет¶
| Файл | Назначение |
|---|---|
blocks/block_05_fpga_hdl_flow/rtl/bpsk_zynq_ber_axi_lite.v |
обёртка AXI-Lite вокруг bpsk_zynq_ber_top.v |
blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_zynq_ber_axi_lite.v |
самопроверяющийся testbench AXI-Lite |
Запуск из корня репозитория:
python blocks/block_05_fpga_hdl_flow/python/generate_bpsk_framed_loopback_vectors.py
python blocks/block_05_fpga_hdl_flow/python/generate_bpsk_rrc_tx_fir_vectors.py
iverilog -g2012 \
-o blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_zynq_ber_axi_lite.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/rtl/bpsk_frame_bit_source.v \
blocks/block_05_fpga_hdl_flow/rtl/bpsk_ber_counter.v \
blocks/block_05_fpga_hdl_flow/rtl/bpsk_zynq_ber_top.v \
blocks/block_05_fpga_hdl_flow/rtl/bpsk_zynq_ber_axi_lite.v \
blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_zynq_ber_axi_lite.v
vvp blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_zynq_ber_axi_lite.out
Ожидаемый результат:
PASS: bpsk_zynq_ber_axi_lite completed without errors
Карта регистров¶
| Адрес | Имя | Доступ | Смысл |
|---|---|---|---|
0x00 |
CONTROL_STATUS |
W/RO |
бит 0: запись 1 запускает один кадр; бит 1: busy; бит 2: done (залипающий), сбрасывается записью 1 в бит 2; бит 3 (только чтение): lock_inverted, последний прогон захватился на инвертированной преамбуле (180 градусов, см. Лабораторную 5.10) |
0x04 |
FRAME_BIT_COUNT |
RW |
число передаваемых и сравниваемых бит |
0x08 |
PREAMBLE_COUNT |
RW |
число бит преамбулы, исключаемых из payload BER |
0x0C |
START_OFFSET |
RW |
детерминированный индекс отсчёта согласованного фильтра для решений по символам |
0x10 |
RECEIVED_BITS |
RO |
число восстановленных бит в последнем завершённом прогоне |
0x14 |
TOTAL_ERRORS |
RO |
полное число битовых ошибок в последнем завершённом прогоне |
0x18 |
PAYLOAD_ERRORS |
RO |
битовые ошибки только payload в последнем завершённом прогоне |
0x1C |
ID |
RO |
фиксированное идентификационное слово 0x4250534B |
Назначение интерфейса¶
Эта обёртка предназначена для управления на низкой скорости, а не для массовой передачи отсчётов:
- AXI-Lite настраивает запуск кадра и считывает счётчики BER;
- поток отсчётов остаётся на явной границе TX/RX из Lab 5.10;
- будущий проект может подключить эту границу к AD9363, DMA или потоковому мосту.
Почему этот этап важен¶
Ранние работы доказали, что логика модема работает. Эта работа доказывает, что плоскость управления тоже готова к интеграции:
- ПО может запрограммировать детерминированную конфигурацию кадра;
- ПО может запустить ровно один пакет;
- ПО может опрашивать
busyиdone; - ПО может считать счётчики BER после завершения пакета.
Это минимальный контракт регистров, необходимый, прежде чем передавать проект настоящему Zynq PS или слою ПО no-OS.
Стратегия testbench¶
Самопроверяющийся testbench:
- читает общие детерминированные метаданные;
- записывает регистры конфигурации кадра по AXI-Lite;
- запускает один пакет через управляющий регистр;
- замыкает отсчёты TX на отсчёты RX;
- опрашивает регистр статуса, пока не установится залипающий бит
done; - проверяет нулевой BER и затем сбрасывает залипающий флаг
done.
Интерпретация с точки зрения железа¶
Первое применение на железе простое:
PS записывает регистры AXI-Lite -> запускается один короткий детерминированный пакет -> тракт AD9363 TX/RX или внешний монитор наблюдает результат
Это правильное место для подключения ПО no-OS, регистровых обращений из пользовательского пространства Linux или небольшого драйвера.
Порядок первого подключения AD9363¶
Используйте существующие инструменты репозитория как путь запуска:
- Опросите удалённый контекст IIO командой
python blocks/block_06_rf_frontend_and_ad9363/python/lab_6_3_probe_iio_context.py --uri ip:192.168.40.1. - Примените консервативную RF-политику Блока 6.3: минимальная мощность TX, низкое ручное усиление RX, AGC выключен и только короткий пакет.
- Сначала прочитайте регистр AXI-Lite
ID, затем запрограммируйтеFRAME_BIT_COUNT,PREAMBLE_COUNTиSTART_OFFSET. - Запишите
1вCONTROL_STATUS[0], опрашивайтеbusy, затем дождитесь залипающегоdone. - Используйте контролируемый RX-тракт Zynq для счётчиков BER, а RTL-SDR оставьте наблюдателем только за спектром во время первой OTA-проверки.
Так разведочный прогон остаётся небольшим и детерминированным перед переходом к более длинным пакетам или количественному измерению BER.
Чего ожидать¶
PASS: bpsk_zynq_ber_axi_lite completed without errors
Testbench играет роль PS: читает регистр ID, проверяет, что control/status после сброса равен нулю, записывает и читает обратно число бит кадра, число бит преамбулы и начальное смещение, запускает прогон битом 0, опрашивает статус, пока не увидит и busy (бит 1), и done (бит 2), проверяет received_bits и нулевые общие ошибки и ошибки полезной нагрузки, сбрасывает залипающий done записью бита 2 и убеждается, что TX-отсчёты были сформированы.
Раннер курса генерирует векторы, компилирует, запускает симуляцию и считает ошибкой любую строку FAIL или ненулевой код выхода симулятора:
python tools/run_block5_hdl_smoke.py --test tb_bpsk_zynq_ber_axi_lite
Упражнения¶
Каждое упражнение ниже: намеренная мутация RTL в одну строку. Внесите её, запустите testbench, прочитайте сообщения и верните файл (git checkout -- <file>). Приведённые выводы получены на Icarus Verilog 12.0.
- Сделайте
doneнесбрасываемым: вbpsk_zynq_ber_axi_lite.vзаменитеif (wstrb_latched[0] && wdata_latched[2]) beginнаif (1'b0) begin. Testbench сообщаетERROR: done sticky bit did not clear. На железе программа, опрашивающаяdone, считала бы каждый следующий прогон уже завершённым. - Поменяйте местами биты
busyиdoneпри чтении статуса ({29'd0, core_busy, done_sticky, 1'b0}). Testbench сообщаетERROR: busy bit was never observed during the AXI-Lite controlled run. Тракт данных не тронут, и проект бы синтезировался, поэтому такую ошибку ловит только проверка карты регистров. - Напишите ту же последовательность как короткую функцию на C с 32-битными чтениями и записями в стиле
devmemи тайм-аутом опроса. Какой регистр вы читаете, чтобы решить, что прогон закончен, и что будет, если прочитать его только один раз?
Ответы (сверены с RTL и стендом)
- Наблюдаемый вывод приведён в упражнении: бит
done, который нельзя сбросить, делает каждый следующий прогон уже завершённым. - Наблюдаемый вывод приведён в упражнении: ошибка карты регистров не трогает тракт данных и ловится только проверкой карты регистров.
-
Набросок (
rd32/wr32это 32-битные обращения по адресуbase + offset):int run_frame(uintptr_t base, unsigned timeout_ms) { wr32(base + 0x00, 0x4); /* сбросить липкий бит done */ wr32(base + 0x00, 0x1); /* запустить один кадр */ for (unsigned t = 0; t < timeout_ms; ++t) { if (rd32(base + 0x00) & 0x4) /* done */ return (int)rd32(base + 0x18); /* ошибки нагрузки */ usleep(1000); } return -1; /* тайм-аут */ }
Читайте CONTROL_STATUS (0x00) и ждите липкий бит done (бит 2). Однократное чтение сразу после запуска почти всегда видит прогон ещё занятым, а без тайм-аута зависшее ядро навсегда подвешивает программу. Предварительный сброс done и делает так, что опрос означает «этот прогон», а не «какой-то прежний».
Чек-лист отчёта¶
- Приложена карта регистров.
- Указано, какие регистры необходимо запрограммировать до
start. - Показано, как сбрасывается
done. - Показано считывание
IDкак проверка работоспособности при запуске. - Указано, что AXI-Lite управляет только путём конфигурации, а не потоком отсчётов.
Шаблон инженерного вывода¶
Детерминированное ядро BPSK BER теперь доступно через управляющую обёртку AXI-Lite.
ПО может задать размер кадра, размер преамбулы и смещение выборки, запустить один пакет и считать счётчики BER.
Это минимальный контракт со стороны PS, необходимый перед подключением тракта модема к AD9363 или интеграции с DMA.