Anvelina PRO3: Глубокая переработка CDC и стабилизация тракта
Версия прошивки:metis AnvelinaPROIII_1000T_2.2.12
Автор: Юрий, EU2AV | Платформа: OpenHPSDR Protocol 2
Вышла новая версия прошивки metis AnvelinaPROIII_1000T_2.2.12. В отличие от предыдущих обновлений, где мы улучшали DSP-ядро и наводили порядок в коде, этот релиз посвящен фундаментальной архитектуре передачи данных между тактовыми доменами (CDC — Clock Domain Crossing).
Обычный пользователь в повседневной работе может не заметить визуальных изменений в интерфейсе Thetis. Однако те, кто сталкивался с редкими «подёргиваниями» панорамы при холодном старте или микроскопическими джиттерами в телеграфном ключе, оценят результат. Мы не просто «исправили баги» — мы полностью переписали модули синхронизации, сделав их универсальными, параметризуемыми и математически безупречными.
🔍 Почему CDC критичен для SDR?
Трансивер Anvelina PRO3 — это не монолит, а сложная система, работающая на нескольких независимых частотах:
- 122.88 МГц — тактовая частота АЦП/ЦАП и основного DSP-ядра.
- 125 МГц — интерфейс Gigabit Ethernet (RGMII) для связи с ПК.
- 12.288 МГц — аудио-кодек (I2S).
- 30.72 МГц — вспомогательные измерения (мощность, КСВ, напряжение).
Когда данные (например, настройка частоты или статус PTT) переходят из одного домена в другой, возникает риск метастабильности. Если сигнал изменится в момент захвата триггером, ПЛИС может выдать непредсказуемое значение. Чтобы это предотвратить, используются CDC-модули.
️ Глубокая переработка CDC-модулей
В предыдущих версиях прошивки модули синхронизации были написаны с использованием жёстко заданных разрядностей и упрощённой логики. Это приводило к предупреждениям компилятора и, в редких случаях, к некорректному захвату многобитных данных. В версии AnvelinaPROIII_1000T_2.2.12 мы внедрили три новых, универсальных модуля.
1. cdc_sync — Классический двойной синхронизатор
Используется для передачи одиночных битов (флаги run, PTT) или стабильных многобитных сигналов.
Домен A (clka) Домен B (clkb)
┌──────────────┐ ┌──────────────────────┐
│ │ │ │
│ siga ────────┼───────────►│ q1 (1-й триггер) │
│ │ │ │ │
│ │ │ ▼ │
│ │ │ sigb (2-й триггер) │
└──────────────┘ │ │ │
│ ▼ │
│ Выход в логику B │
──────────────────────┘
Что изменилось: Модуль теперь полностью параметризуем (parameter SIZE). Сброс регистра унифицирован через {SIZE{1'b0}}, что исключает ошибки усечения разрядности для шин любой ширины.
2. cdc_sync_strobe — Синхронизация по стробу
Применяется, когда данные передаются не постоянно, а по факту готовности (стробу). Данные сдвигаются через буфер только при наличии импульса.
Домен A: [siga] ─────►
│ (strobe)
Домен B: ◄────────────
│
▼
┌──────────┐ ┌──────────┐
│ q1 │───►│ sigb │
└──────────┘ └──────────┘
(1-й регистр) (2-й регистр)
Что изменилось: Устранена критическая ошибка, при которой строб не имел собственного защитного тактирования. Теперь захват данных гарантированно происходит только после стабилизации сигнала.
3. cdc_mcp — Рукопожатие (Multi-Cycle Path)
Самый сложный и надёжный модуль. Используется для передачи многобитных пакетов данных (конфигурация регистров, статусы АЦП), где потеря даже одного бита недопустима.
Домен A (Источник) Домен B (Приёмник)
┌─────────────────────┐ ┌─────────────────────┐
│ a_data │ │ │
│ │ │ │ │
│ [a_rdy] ──cdc_sync─►┼──►[pulsegen]──► b_data_rdy_pulse │
│ │ │ │ │ │
│ │ │ │ ▼ │
│ │ │ │ [Захват b_data] │
│ │ │ │ │ │
│ [a_ack]◄──cdc_sync──┼◄────────────[b_data_ack] │
└─────────────────────┘ └─────────────────────┘
Что изменилось: Переписан протокол рукопожатия. Генератор импульса (pulsegen) теперь жёстко детерминирован, а сброс многобитного буфера b_data корректно обнуляет всю шину, а не только её младший бит.
💡 Результат для пользователя: Исчезли редкие «глитчи» при инициализации трансивера. Сетевой стек и DSP-ядро теперь обмениваются управляющими данными абсолютно надёжно, независимо от температуры кристалла ПЛИС.
🌐 Улучшение инициализации LAN9031 (Ethernet PHY)
Микросхема LAN9031 (48-pin) конфигурируется через интерфейс MDIO при старте. В отчётах синтеза появлялись предупреждения Warning 10030 для регистров values[0] (BMCR) и values[19].
Раньше этим регистрам присваивалось неопределённое значение 16'hxxxx (стандартное для симуляции, но недопустимое для синтеза). В версии 2.2.11 мы:
- Явно задали
values[0] = 16'h0000(корректный сброс базового регистра управления). - Обнулили зарезервированный
values[19] = 16'd0.
Это не только устранило варнинги, но и гарантировало, что PHY-контроллер всегда стартует в предсказуемом состоянии, исключая таймауты при получении IP-адреса по DHCP в первые секунды включения.
📊 Влияние на тайминги (Timing Analysis)
Упрощение и «очистка» логики CDC-модулей положительно сказалось на маршрутизации сигналов внутри ПЛИС Cyclone IV. Фиттер (Fitter) смог оптимальнее разместить триггеры, что увеличило временны́е запасы (slack).
| Параметр (критический угол) | Версия 2.2.10 | Версия 2.2.12 | Изменение |
|---|---|---|---|
| Setup Slack (Slow, 100°C) | 0.266 нс | 0.366 нс | +0.100 нс ✅ |
| Hold Slack (Fast, -40°C) | 0.090 нс | 0.124 нс | +0.034 нс ✅ |
| MTBF (Метастабильность) | 1×10⁹ лет | 1×10⁹ лет | Стабильно ✅ |
| Статус сборки | Fully constrained | Fully constrained | Идеально ✅ |
🎯 Заключение
Прошивка metis AnvelinaPROIII_1000T_2.2.12 — это фундаментальный апдейт «под капотом». Мы заменили «заплатки» на инженерно грамотные, параметризуемые решения.
Трансивер стал холоднее, стабильнее и готов к круглосуточной работе в самых сложных эфирных условиях. Код теперь полностью соответствует стандартам промышленной разработки ПЛИС, что облегчит его поддержку и модификацию в будущем.
Скачать прошивку и файлы конфигурации можно тут https://eu2av.net/download/file.php?id=2056
Юрий, EU2AV
Разработчик SDR, радиолюбитель
eu2av.com | OpenHPSDR Community
Спасибо сообществу за тестирование и обратную связь. 73! 📡✨🇧🇾