per-point switching: hardware bring-up, profiles, protocol doc

Verified on the bench that the modified master bitstream excites in every stage
and the RF switch routes: 16 traces per sweep, 62 dB between the two switch
positions of one master port, 9.9k measurements/s. Adds the built master image,
two run profiles, a verification script and librevna_protocol.md, and drops the
stale prototype driver copy that the firmware tree still carried.
This commit is contained in:
Ayzen
2026-09-15 14:41:54 +03:00
parent 3f6cfc9108
commit 62c0266a6b
30 changed files with 1392 additions and 2863 deletions
@@ -4,9 +4,13 @@
Проект лежит целиком — не патч, а полное дерево с уже внесёнными доработками.
> **Исходники опережают бинарники.** В дерево внесено переключение стимула
> внутри частотной точки (см. [`../../per_point_switching.md`](../../per_point_switching.md)),
> а лежащие рядом `.vnafw`, `extracted/` и `build*/` — это ПРЕДЫДУЩАЯ прошивка,
> собранная до этой доработки и сейчас залитая в приборы. Поэтому:
> внутри частотной точки (см. [`../../per_point_switching.md`](../../per_point_switching.md)).
> Битстрим и готовый образ с доработкой уже собраны:
> `FPGA/VNA/top_master_per_point_switching.bin` и
> `../combined_per_point_switching.vnafw`. **На железе они ещё не проверены.**
> А `combined.vnafw`, `extracted/` и `build/` — это ПРЕДЫДУЩАЯ прошивка,
> собранная до доработки и сейчас залитая в приборы, то есть путь отката.
> Поэтому:
>
> * `./build.sh` без аргументов по-прежнему даёт побайтовое совпадение — он
> только переупаковывает готовые `.bin`, не трогая исходники;
@@ -87,9 +91,18 @@ tail -c +341737 combined.vnafw | head -c 85004 > VNA_embedded.bin # STM32
Аппаратный триггер и external-LO slave — 13 файлов (не 12: в списке не значился
`PC_Application/LibreVNA-GUI/Traces/trace.cpp`, правка в GUI, к прошивкам
отношения не имеющая). Переключение стимула внутри точки добавило ещё 5
изменённых файлов и один новый. Всё остальное дерево совпадает с апстримом байт
в байт.
отношения не имеющая). Переключение стимула внутри точки добавило ещё **7
изменённых файлов и 2 новых** (`git diff --stat d2338ff HEAD -- reproduce/LibreVNA/`):
`FPGA/VNA/{Sweep,SPIConfig,top}.vhd`, `FPGA/VNA/VNA.xise`,
`Application/Drivers/FPGA/FPGA.{hpp,cpp}`, `Application/VNA.cpp`; новые —
`FPGA/VNA/Test_Sweep.vhd` и `FPGA/VNA/top_master_per_point_switching.bin`.
Ещё из дерева удалён каталог `Python/` — прототип драйвера multi-device, который
переехал в `python_app/hardware_full/librevna_multi_device_driver/`. К сборке
прошивок он отношения не имел; разбор протокола из него сохранён как
[`../../librevna_protocol.md`](../../librevna_protocol.md).
Всё остальное дерево совпадает с апстримом байт в байт.
### STM32 — поддержка аппаратного триггера (это и есть съём без USB)
@@ -138,8 +151,28 @@ tail -c +341737 combined.vnafw | head -c 85004 > VNA_embedded.bin # STM32
### Переключение стимула внутри частотной точки
Внесено позже остального, бинарников рядом ещё нет (см. блок в начале файла).
Полное описание — [`../../per_point_switching.md`](../../per_point_switching.md).
Внесено позже остального. В репозитории лежит и битстрим
(`FPGA/VNA/top_master_per_point_switching.bin`), и готовый образ
`../combined_per_point_switching.vnafw` — оба с хешами в `SHA256SUMS`.
Образ собран **локально на Linux тулчейном `arm-none-eabi-gcc 14.2.1`**, а не
CubeIDE 1.17.0 / gcc 12.3.1, которым собран текущий рабочий `combined.vnafw`.
Логика та же (исходники те же), но байты MCU-секции отличаются: 88 660 против
85 044. Пересобрать этим же способом:
```sh
cd LibreVNA/Software/VNA_embedded && make BUILD_DIR=build_per_point_switching
cd .. && python3 AssembleFirmware.py \
--bitstream FPGA/VNA/top_master_per_point_switching.bin \
--mcu Software/VNA_embedded/build_per_point_switching/VNA_embedded.bin \
--output ../combined_per_point_switching.vnafw
```
`BUILD_DIR` обязательно отдельный: в `build/` лежит эталонный
`VNA_embedded.bin`, извлечённый из рабочей прошивки, его перезаписывать нельзя.
Полное описание — [`../../per_point_switching.md`](../../per_point_switching.md),
базовый протокол — [`../../librevna_protocol.md`](../../librevna_protocol.md).
**`FPGA/VNA/Sweep.vhd`** — порт излучает не в одной стадии, а в БЛОКЕ подряд
идущих: младшие `SUBSTAGE_BITS` бит счётчика стадий стали положением выходного
@@ -158,6 +191,13 @@ tail -c +341737 combined.vnafw | head -c 85004 > VNA_embedded.bin # STM32
железа нет порта 3, поле свободно, и его переиспользование не меняет формат
пакета.
**`FPGA/VNA/VNA.xise`** — одна строка: `Starting Placer Cost Table (1-100) Map
spartan6` переведена с `1` на `2`. **Не сбрасывать.** Ограничение
`MCU_MOSI OFFSET hold` маргинально уже в стоке (запас +0.458 нс), поэтому любое
изменение нетлиста может его опрокинуть; с cost table 2 получается Timing Score 0
и запас +0.642 нс, то есть больше стокового. Подробности и цифры ресурсов — в
[`../../per_point_switching.md`](../../per_point_switching.md).
**При `SUBSTAGE_BITS = 0` логика бит в бит совпадает с апстримом** — это
проверено симуляцией.