Anvelina PRO III: Попытка оптимизации FPGA и стабилизация Pure Signal

Автор: | 11.06.2026

Anvelina PRO III: Попытка оптимизации FPGA и стабилизация Pure Signal

Автор: Юрий (EU2AV)

Дата: Июнь 2026

Проект: Anvelina PRO III SDR-трансивер на базе Altera Cyclone IV E (EP4CE115F29I7)

Версия прошивки: AnvelinaPROIII_1000T_2.2.13Final

Введение

В рамках развития проекта Anvelina PRO III была проведена серия оптимизаций FPGA-кода, направленных на:

  • Улучшение временных характеристик (timing margin)
  • Устранение микро-артефактов при работе в режиме QSK (break-in)
  • Стабилизацию переключения Pure Signal Adaptive (PSA)
  • Очистку кода и приведение синтаксиса к стандартам Verilog-2001

Результатом стала прошивка с лучшими временными характеристиками за весь цикл разработки и полностью стабильной работой всех режимов.

1. Комплексная оптимизация таймингов

Улучшение временных характеристик было достигнуто благодаря синергии двух ключевых мер: архитектурным изменениям в Verilog-коде (pipeline-регистры) и оптимизации настроек компилятора.

1.1 Pipeline-регистры для разрыва критических путей (главный фактор)

Проблема

Сигналы udp_recv|to_port → Tx0_frequency и to_port → temp_Rx_frequency представляли собой многонаносекундные комбинационные пути в домене 125 МГц, которые ограничивали максимальную частоту и создавали критические пути.

Решение

Добавлены три взаимозависимых pipeline-регистра на тактовой частоте rx_clock:

  • temp_Tx0_frequency (защёлка байтов 329–332)
  • to_port_pipe
  • High_Priority_from_PC_port_pipe

Результат

Критический путь разбит, временной запас восстановлен с отрицательных значений до положительных.

Важно: Все три регистра взаимозависимы. Удаление любого из них обрушивает slack до <0.05 ns. Это классический пример pipeline-оптимизации, где все стадии должны работать вместе.

Аналогичная оптимизация применена в network.v для сигналов udp_rx_active и udp_rx_data — добавлены регистры udp_rx_active_pipe и udp_rx_data_pipe для консистентной конвейеризации всех C&C-декодеров.

1.2 Переход на HIGH PERFORMANCE EFFORT (вспомогательный фактор)

После внедрения пайплайнов был изменён режим компиляции с AGGRESSIVE POWER на HIGH PERFORMANCE EFFORT, что позволило Fitter’у более агрессивно размещать новую логику и дополнительно улучшить характеристики:

ПараметрДоПослеИзменение
Worst setup slack0.295 ns0.966 ns+0.671 ns
Размер прошивки (RBF)1676 KB1650 KB−26 KB
Время компиляции~18 мин~15 мин−3 мин

Почему это важно:
Режим HIGH PERFORMANCE EFFORT заставляет Quartus более агрессивно оптимизировать размещение логики для соблюдения временных ограничений. В сочетании с правильно структурированными пайплайнами это дало синергетический эффект: Fitter смог найти оптимальное размещение pipeline-регистров, что дополнительно улучшило slack.

Финальная чистая сборка показала 1.058 ns worst-case setup slack — лучший результат за всю историю проекта.

2. Исправление Clock-Domain Crossing (CDC)

Проблема sequence_errors

Исходная ситуация

Счётчик ошибок последовательности (sequence_errors) формировался в домене PHY_RX_CLOCK, но его значение передавалось в домен tx_clock через стандартный cdc_sync (2-регистровый синхронизатор).

Почему это плохо

Для многобитных счётчиков простой cdc_sync опасен: каждый бит проходит через цепочку синхронизации независимо, что создаёт переходные состояния с некорректными значениями (метастабильность).

Решение

  • Счётчики ошибок оставлены в домене rx_clock
  • Суммирование происходит в rx_clock
  • Передача суммы в tx_clock выполнена через handshake-протокол (cdc_mcp) вместо cdc_sync
  • Добавлен pipeline-регистр expected_sequence_number для разрыва комбинационного пути

Результат

Критический путь устранён, CDC-глитчи полностью исключены.

Урок:
Никогда не используйте cdc_sync #(N>1) для многобитных счётчиков. Для многобитных шин, пересекающих тактовые домены, применяйте handshake-протоколы или код Грея.

3. Стабилизация Pure Signal Adaptive (PSA)

3.1 Проблема холодного старта

Симптом

При первом включении питания (cold boot) в редких случаях наблюдались артефакты на спектре TX при переключении PSA. После перезапуска Thetis проблема исчезала.

Причина

Сигнал ps (флаг выбора Pure Signal feedback) формировался из C122_RxADC[1], который передаётся через CDC-мост из домена rx_clock в C122_clk. При холодном старте, до полной синхронизации системы, на выходе CDC-моста мог присутствовать некорректный «мусор», который интерпретировался как активный PSA.

Решение

Добавлена комбинационная квалификация холодного старта на уровне порта инстанцирования Rx0_fifo_ctrl_inst:

.ps(C122_run ? (C122_RxADC[1] == 8'd2) : 1'b0)

Эта конструкция гарантирует, что флаг ps жёстко равен 0 до тех пор, пока сигнал C122_run не будет утверждён (т.е. система полностью синхронизирована).

Результат

  • PSA переключается чисто (5/5 тестов)
  • Артефакты холодного старта полностью устранены
  • Нет необходимости перезапускать Thetis после включения питания

3.2 Прямое переключение без задержек

Адаптивный фильтр Thetis требует немедленной реакции на смену тракта. Внутренние дебаунсеры и задержки в Rx_fifo_ctrl.v ухудшали сходимость фильтра. Возврат к прямому входу ps обеспечил чистое переключение без аудио-артефактов.

4. Экспериментальная LED-индикация

Исторически светодиоды были удалены из кода проекта по техническим причинам. Однако их экспериментальное возвращение показало отсутствие какого-либо негативного влияния на тайминги, CDC-пересечения или ВЧ-характеристики. Функция добавлена в качестве эксперимента.

Текущее поведение

  • Один светодиод работает в режиме мигания (индикация активности системы / heartbeat)
  • Второй загорается и горит постоянно при успешном подключении к SDR-программе
  • Тактирование линии индикации осталось на штатных 25 МГц (без изменений в логике деления)

Примечание:
Нумерация пинов в коде может не соответствовать физической маркировке на плате. Для точного сопоставления рекомендуется сверяться с принципиальной схемой проекта.

5. Результаты аппаратной верификации

ТестРезультат
CIC на всех частотах дискретизации (48–1536 kHz)✅ Pass
Включение/выключение Audio RX2✅ Pass (без щелчков)
Общая работа RX/TX✅ Pass
Микро-артефакты Tx break-in (QSK)✅ ПОЛНОСТЬЮ УСТРАНЕНЫ
Переключение PSA (адаптивный фильтр Thetis)✅ Чистое переключение 5/5

Ключевое достижение:
Микро-глитчи на TX при работе в режиме QSK полностью устранены. Это лучший результат на воздухе за всю историю разработки.

6. Важное примечание: почему одна и та же прошивка может вести себя по-разному на одинаковых платах?

Многие пользователи сталкиваются с ситуацией, когда прошивка идеально работает на одной плате Anvelina PRO III, но на другой (той же ревизии, с тем же чипом) проявляются редкие glitches, рассинхрон или повышенный шум. Это не дефект проектирования, а фундаментальное свойство ПЛИС и процесса Place & Route (P&R):

6.1 Вариативность P&R (Place & Route)

Fitter Quartus использует эвристические алгоритмы размещения логики. Даже при идентичном коде и настройках, разные прогоны компиляции могут дать разную трассировку критических путей. Разница в задержках между соседними LUT/FF может составлять ±0.2–0.4 нс.

6.2 Запас по времени (Timing Slack)

Если дизайн собран «впритык» (slack < 0.3 нс), то небольшие отклонения в трассировке, температуре или напряжении питания могут вывести путь за пределы setup/hold требований. На одной плате чип окажется «быстрее» (лучший кремний, стабильнее питание), на другой — «медленнее». В нашем дизайне slack повышен до >1.0 ns, что делает поведение детерминированным на любых экземплярах EP4CE115F29I7.

6.3 Кремниевая лотерея и температурный дрейф

Cyclone IV выпускается в разных speed-grade и bin-группах. Даже в рамках одной маркировки -I7 существуют допуски по внутренней задержке межсоединений. При нагреве во время TX задержки растут. Дизайн с запасом <0.5 нс может стабильно работать при 25°C, но давать ошибки при 60°C.

6.4 Целостность питания и земли

Микро-просадки на линиях VCCINT/VCCIO при импульсных нагрузках (Ethernet PHY, DAC, PLL) влияют на скорость переключения триггеров. Качественная разводка платы и развязывающие конденсаторы критичны для дизайнов с tight timing.

Вывод для пользователей

Если вы наблюдаете нестабильность на новой прошивке, убедитесь, что:

  • Используется актуальная версия Quartus и чистая сборка (без инкрементального компилирования)
  • Блок питания стабилен, нет просадок при TX
  • Плата не перегревается (радиатор на FPGA обязателен при длительной работе)
  • Прошивка собрана с режимом HIGH PERFORMANCE EFFORT (slack > 0.9 ns)

Данный релиз специально нацелен на устранение этой вариативности за счёт увеличения timing margin и упрощения критических CDC-путей.

7. Ключевые выводы и уроки

  1. Pipeline-регистры — основа timing closure. В данном дизайне temp_Tx0_frequency, to_port_pipe, udp_rx_active_pipe и High_Priority_from_PC_port_pipe образуют взаимозависимую сеть закрытия таймингов. Удаление даже одного обрушивает запас. Это главный фактор улучшения slack.
  2. Режим компилятора усиливает архитектурные решения. Переход на HIGH PERFORMANCE EFFORT не спас бы критические пути сам по себе, но в сочетании с правильными пайплайнами дал Fitter’у свободу для оптимального размещения и выжал дополнительные 0.1–0.2 ns запаса.
  3. Никогда не используйте cdc_sync для многобитных счётчиков. Каждый бит сдвигается независимо, создавая переходные искажённые значения. Применяйте handshake (cdc_mcp) или код Грея.
  4. Защита RxSampleRate != 16'd0 обязательна. Запись нуля в децимацию CIC замораживает out_strobe и разрушает обратную связь PSA.
  5. Адаптивный фильтр Thetis ожидает немедленного переключения ps. Задержки и дебаунсеры ухудшают сходимость и вызывают дёрганье RX при TX. Прямой вход ps — правильная архитектура.
  6. Квалификация холодного старта требует комбинационного MUX на верхнем уровне. Зарегистрированный ps_sync внутри Rx_fifo_ctrl.v вызывал дёрганье RX. Комбинационный C122_run ? (C122_RxADC[1]==2) : 0 — единственный рабочий подход.
  7. Quartus чувствителен к форме выражений. В audio_I2S.v предупреждения об усечении безвредны — синтезатор выводит специфическую структуру, которую нельзя изменять.

8. Итоги и планы

Данный этап стал смелым инженерным экспериментом, и его результат по производительности и стабильности, без преувеличения, является лучшим за всё время разработки проекта. Впереди — интересные полевые тесты и сбор обратной связи от пользователей. На основе полученных данных будет принято решение о дальнейших направлениях работы.

Передал исходники Рику N1GP интересно будет если он испытает на другом оборудовании open-hpsdr.

Заключение

Проведённая оптимизация позволила достичь лучших временных характеристик за весь цикл разработки при одновременном устранении всех известных артефактов. Финальная версия прошивки AnvelinaPROIII_1000T_2.2.13Final стабильна, предсказуема и готова к использованию в эфире.

Проект Anvelina PRO III продолжает развиваться, оставаясь верным принципам открытого кода и инженерного совершенства.

Скачать прошивку и файлы конфигурации можно тут: https://eu2av.net/download/file.php?id=2059

Юрий, EU2AV
Разработчик SDR, радиолюбитель
eu2av.com | OpenHPSDR Community Спасибо сообществу за тестирование и обратную связь. 73! 📡🇧🇾

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *