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