Лабораторная 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, EVM0,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: повод присмотреться, а не результат.
Маршрут импорта в Simulink¶
Используйте те же handoff-файлы в модели Simulink:
- импортируйте
tx_symbols_q15.txtкак источник потока символов; - импортируйте
rrc_taps_q15.txtв блоки FIR на TX и RX; - по
sample_plan.jsonзадайте смещение выборки символов после согласованного фильтра; - оставляйте ширину потока знаковой 16-битной, пока счётчики насыщения не потребуют более широкого внутреннего узла;
- сохраняйте определение кадра Блока 11, чтобы BER оставался сопоставимым между этапами Python и HDL.
Связь с HDL handoff¶
Эта работа, fixed-point-компаньон к:
blocks/block_05_fpga_hdl_flow/rtl/bpsk_symbol_mapper.vblocks/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, потому что ______.