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

Лабораторная 4.3 — BPSK-цепочка в фиксированной точке

Цель

Превратить общий handoff-пакет BPSK из Блока 11 в мост fixed-point для основного маршрута модема:

эталон MATLAB -> Simulink fixed-point -> HDL-маппер символов -> будущий поток BER на Zynq TX/RX

Лабораторная отвечает на практический вопрос:

Можно ли провести тот же BPSK-кадр через формирующий и согласованный фильтры в Q1.15 с приемлемой ошибкой, прежде чем переходить к Simulink и RTL?

Зачем это нужно

Python-модель с плавающей точкой показывает, что алгоритм должен делать. У FPGA нет float: у каждого провода фиксированное число бит, каждый умножитель даёт более широкий результат, который нужно округлять обратно, а каждая сумма может переполниться. Этап fixed-point это место, где «математика работает» превращается в «железо будет работать», или в тонкую ошибку, которая проявится только на плате. Здесь этот переход сделан в одном контролируемом месте: тот же BPSK-кадр проходит через цепочку с плавающей точкой и через цепочку Q1.15, и вы сравниваете их число за числом до того, как написана хоть одна строка RTL. Если fixed-point модель расходится с float здесь, вы узнаете об этом за секунды в Python, а не после сборки Vivado.

Исполняемые файлы

Среда Файл Результат
Python blocks/block_04_simulink_and_fixed_point/python/lab_4_3_bpsk_fixed_point_chain.py метрики + PNG-графики + таблица форматов в docs/assets
MATLAB blocks/block_04_simulink_and_fixed_point/matlab/lab_4_3_bpsk_fixed_point_chain.m зеркальные MATLAB-графики в docs/assets

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

python blocks/block_04_simulink_and_fixed_point/python/lab_4_3_bpsk_fixed_point_chain.py

MATLAB:

matlab -batch "run('blocks/block_04_simulink_and_fixed_point/matlab/lab_4_3_bpsk_fixed_point_chain.m')"

Python-скрипт автоматически пересоздаёт пакет BPSK Блока 11, если общие handoff-файлы отсутствуют.

Общая зависимость handoff

Работа намеренно переиспользует файлы из:

blocks/block_11_integrated_sdr_project/assets/end_to_end_bpsk_reference/

Важнейшие входные данные:

Файл Роль
tx_bits.txt детерминированные биты BPSK-кадра
tx_symbols_q15.txt эталонный выход маппера символов
rrc_taps_q15.txt общие коэффициенты формирующего фильтра TX/RX
sample_plan.json тайминг символов после согласованного фильтра
end_to_end_bpsk_reference_v1_tx_reference.ci16 экспортированный float-сигнал TX
end_to_end_bpsk_reference_v1.ci16 синтетический захват с искажениями для проверок на стороне RX

Цепочка обработки

flowchart LR
    BITS[Биты кадра] --> MAP[BPSK-маппер Q1.15]
    MAP --> UPS[Повышение частоты в sps раз]
    UPS --> TXFIR[RRC TX FIR Q1.15]
    TXFIR --> GAIN[Масштаб TX Q1.15]
    GAIN --> CAP[Эталонный захват]
    CAP --> CORR[Коррекция известных CFO/фазы]
    CORR --> RXFIR[Согласованный RRC-фильтр Q1.15]
    RXFIR --> SAMP[Выборка символов]
    SAMP --> BER[BER и EVM]

Сгенерированные Python-артефакты

docs/assets/lab43_bpsk_fixed_point_tx_waveform.png
docs/assets/lab43_bpsk_fixed_point_error.png
docs/assets/lab43_bpsk_fixed_point_constellation.png
docs/assets/lab43_bpsk_fixed_point_metrics.json
docs/assets/lab43_bpsk_fixed_point_format_table.md

Сгенерированные MATLAB-графики:

docs/assets/lab43_bpsk_fixed_point_tx_waveform_matlab.png
docs/assets/lab43_bpsk_fixed_point_error_matlab.png
docs/assets/lab43_bpsk_fixed_point_constellation_matlab.png

Рекомендуемые начальные форматы

Узел Начальный формат Примечания
Выход BPSK-маппера Q1.15 0 -> +32767, 1 -> -32767
Поток после повышения частоты Q1.15 между символами вставлены нули
Коэффициенты RRC Q1.15 общие для будущих Simulink и HDL
Произведение FIR Q2.30 комплексный отсчёт × вещественный коэффициент
Аккумулятор FIR Q9.30 для 65 коэффициентов 7 защитных бит над произведением Q2.30
Коэффициент усиления TX Q1.15 масштабирование после фильтра в запас по амплитуде
Захват / скорректированный вход RX Q1.15 fixed-point-представление для анализа
Символы после выборки Q1.15 до скалярного выравнивания при анализе

Что измеряется

Метрика Смысл
tx_float_rebuild_rmse_vs_export проверка, что float-пересборка совпадает с общим экспортом TX
tx_fixed_rms_error ошибка fixed-point формирования импульса относительно float
tx_fixed_evm_percent расхождение сигнала TX в виде EVM
matched_filter_rms_error ошибка fixed-point согласованного фильтра относительно float
ber_payload_fixed BER payload после fixed-point фильтрации RX
rx_fixed_evm_percent потеря качества символов из-за fixed-point тракта RX
счётчики насыщения нужен ли Q1.15 дополнительный запас по амплитуде на каком-либо этапе

Чего ожидать

С закоммиченным эталонным пакетом Блока 11 корректный запуск печатает:

TX rebuild RMSE vs exported CI16: 1.55e-05
TX fixed RMS error: 4.75e-05
TX fixed EVM: 0.0091 %
RX float/fixed payload BER: 0.000000e+00 / 0.000000e+00
RX float/fixed EVM: 2.1538 / 1.5303 %
FIR guard bits: 7

Читайте эти числа вместе:

  • Ошибка TX fixed относительно float ничтожна (RMS 4,7e-05, EVM 0,009 %): коэффициенты Q1.15 и 39-битный аккумулятор воспроизводят формирование передаваемого импульса намного точнее разрешения 16 бит. На передающей стороне проблем с запасом по амплитуде нет (оба счётчика насыщения TX равны 0).
  • BER payload нулевой и для float, и для fixed: fixed-point приёмный тракт по-прежнему декодирует кадр.
  • Счётчик насыщения RX не нулевой. rx_filter_saturation_count в lab43_bpsk_fixed_point_metrics.json равен 1663: на согласованном фильтре приёма выход Q1.15 упирается в границу на 1663 отсчётах. BER остаётся нулевым, поэтому это предупреждение, а не отказ, но именно такие находки эта работа и призвана вскрывать. Исправлять это нужно в RTL-проекте: дать выходу приёмного фильтра дополнительный запас (или уменьшить масштаб входа), а не молча обрезать.
  • Не читайте «EVM fixed (1,53 %) меньше EVM float (2,15 %)» как улучшение. Fixed-point цепочка не может быть точнее float-цепочки, которую приближает; разница возникает из анализа (скалярное выравнивание и обрезанные отсчёты), поэтому действенное число: счётчик насыщения, а разрыв EVM: повод присмотреться, а не результат.

Используйте те же handoff-файлы в модели Simulink:

  1. импортируйте tx_symbols_q15.txt как источник потока символов;
  2. импортируйте rrc_taps_q15.txt в блоки FIR на TX и RX;
  3. по sample_plan.json задайте смещение выборки символов после согласованного фильтра;
  4. оставляйте ширину потока знаковой 16-битной, пока счётчики насыщения не потребуют более широкого внутреннего узла;
  5. сохраняйте определение кадра Блока 11, чтобы BER оставался сопоставимым между этапами Python и HDL.

Связь с HDL handoff

Эта работа, fixed-point-компаньон к:

  • blocks/block_05_fpga_hdl_flow/rtl/bpsk_symbol_mapper.v
  • blocks/block_05_fpga_hdl_flow/tb/tb_bpsk_symbol_mapper.v

Планируемый следующий шаг: вырастить RTL-тракт от маппера символов до RRC-фильтра TX, а затем до полной кадровой цепочки модема на Zynq.

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

  • Указана точная версия общего пакета Блока 11.
  • Приложена таблица fixed-point-форматов.
  • Приведена ошибка сигнала TX float-vs-fixed.
  • Приведены EVM RX float-vs-fixed и BER payload.
  • Указаны защитные биты FIR и ширина аккумулятора.
  • Указаны все наблюдавшиеся счётчики насыщения.
  • Объяснено, достаточно ли Q1.15 или внутренним узлам нужен больший запас.
  • Описано, как те же файлы будут импортированы в Simulink.

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

На общем пакете BPSK ______ цепочка TX/RX в Q1.15 дала BER payload = ____ и EVM RX = ____ %.
65-коэффициентному RRC-фильтру потребовалось ____ защитных бит и аккумулятор шириной ____ бит.
Конфигурация готова / не готова к передаче в Simulink и HDL, потому что ______.