Anvelina PRO3: Глубокая переработка CDC

Автор: | 02.06.2026

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 constrainedFully constrainedИдеально ✅

🎯 Заключение

Прошивка metis AnvelinaPROIII_1000T_2.2.12 — это фундаментальный апдейт «под капотом». Мы заменили «заплатки» на инженерно грамотные, параметризуемые решения.

Трансивер стал холоднее, стабильнее и готов к круглосуточной работе в самых сложных эфирных условиях. Код теперь полностью соответствует стандартам промышленной разработки ПЛИС, что облегчит его поддержку и модификацию в будущем.

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

Юрий, EU2AV
Разработчик SDR, радиолюбитель
eu2av.com | OpenHPSDR Community

Спасибо сообществу за тестирование и обратную связь. 73! 📡✨🇧🇾

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

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