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

Лабораторная 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 или потоковому мосту.

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

Ранние работы доказали, что логика модема работает. Эта работа доказывает, что плоскость управления тоже готова к интеграции:

  1. ПО может запрограммировать детерминированную конфигурацию кадра;
  2. ПО может запустить ровно один пакет;
  3. ПО может опрашивать busy и done;
  4. ПО может считать счётчики BER после завершения пакета.

Это минимальный контракт регистров, необходимый, прежде чем передавать проект настоящему Zynq PS или слою ПО no-OS.

Стратегия testbench

Самопроверяющийся testbench:

  1. читает общие детерминированные метаданные;
  2. записывает регистры конфигурации кадра по AXI-Lite;
  3. запускает один пакет через управляющий регистр;
  4. замыкает отсчёты TX на отсчёты RX;
  5. опрашивает регистр статуса, пока не установится залипающий бит done;
  6. проверяет нулевой BER и затем сбрасывает залипающий флаг done.

Интерпретация с точки зрения железа

Первое применение на железе простое:

PS записывает регистры AXI-Lite -> запускается один короткий детерминированный пакет -> тракт AD9363 TX/RX или внешний монитор наблюдает результат

Это правильное место для подключения ПО no-OS, регистровых обращений из пользовательского пространства Linux или небольшого драйвера.

Порядок первого подключения AD9363

Используйте существующие инструменты репозитория как путь запуска:

  1. Опросите удалённый контекст IIO командой python blocks/block_06_rf_frontend_and_ad9363/python/lab_6_3_probe_iio_context.py --uri ip:192.168.40.1.
  2. Примените консервативную RF-политику Блока 6.3: минимальная мощность TX, низкое ручное усиление RX, AGC выключен и только короткий пакет.
  3. Сначала прочитайте регистр AXI-Lite ID, затем запрограммируйте FRAME_BIT_COUNT, PREAMBLE_COUNT и START_OFFSET.
  4. Запишите 1 в CONTROL_STATUS[0], опрашивайте busy, затем дождитесь залипающего done.
  5. Используйте контролируемый 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.

  1. Сделайте 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, считала бы каждый следующий прогон уже завершённым.
  2. Поменяйте местами биты busy и done при чтении статуса ({29'd0, core_busy, done_sticky, 1'b0}). Testbench сообщает ERROR: busy bit was never observed during the AXI-Lite controlled run. Тракт данных не тронут, и проект бы синтезировался, поэтому такую ошибку ловит только проверка карты регистров.
  3. Напишите ту же последовательность как короткую функцию на C с 32-битными чтениями и записями в стиле devmem и тайм-аутом опроса. Какой регистр вы читаете, чтобы решить, что прогон закончен, и что будет, если прочитать его только один раз?
Ответы (сверены с RTL и стендом)
  1. Наблюдаемый вывод приведён в упражнении: бит done, который нельзя сбросить, делает каждый следующий прогон уже завершённым.
  2. Наблюдаемый вывод приведён в упражнении: ошибка карты регистров не трогает тракт данных и ловится только проверкой карты регистров.
  3. Набросок (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.