惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
The Last Watchdog
The Last Watchdog
K
KPMG report finds enterprise disconnect between AI and its ROI | CIO
T
Troy Hunt's Blog
L
LINUX DO - 最新话题
C
Check Point Blog
T
Threat Research - Cisco Blogs
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
罗磊的独立博客
V
Vulnerabilities – Threatpost
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
J
Java Code Geeks
Apple Machine Learning Research
Apple Machine Learning Research
大猫的无限游戏
大猫的无限游戏
S
Security @ Cisco Blogs
IT之家
IT之家
T
The Exploit Database - CXSecurity.com
The GitHub Blog
The GitHub Blog
D
Docker
Engineering at Meta
Engineering at Meta
AWS News Blog
AWS News Blog
S
Security Affairs
U
Unit 42
P
Palo Alto Networks Blog
V
Visual Studio Blog
Y
Y Combinator Blog
D
DataBreaches.Net
Forbes - Security
Forbes - Security
阮一峰的网络日志
阮一峰的网络日志
美团技术团队
Security Latest
Security Latest
aimingoo的专栏
aimingoo的专栏
Simon Willison's Weblog
Simon Willison's Weblog
A
Arctic Wolf
博客园_首页
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
H
Hacker News: Front Page
博客园 - 司徒正美
博客园 - Franky
宝玉的分享
宝玉的分享
TaoSecurity Blog
TaoSecurity Blog
Latest news
Latest news
Scott Helme
Scott Helme
MongoDB | Blog
MongoDB | Blog
量子位
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
C
Cisco Blogs
P
Privacy International News Feed
Application and Cybersecurity Blog
Application and Cybersecurity Blog

Все публикации подряд на Хабре

Ловим музу за клавиатуру: как айтишнику стать автором Что умеет Midjourney в 2026? Мой немного грустный разбор этого шикарного инструмента Никто не любит писать тесты, но ИИ может исправить это IPv8 выглядит как мечта. Поэтому почти наверняка не взлетит Производители вернули в продажу материнки с DDR3. Что происходит? Управление агентом с телефона через Telegram теперь в KodaCode От координации к лидерству: как меняется роль руководителя разработки Я сделала родителям бизнес вместо пенсии: зарабатываем 70 тысяч, мама не даёт продать В три раза быстрее приемка товара и оптимизация трудозатрат на 73%: как «РСТ-Инвент» помог Gulliver Group ИИ-шечный мир победил? О влиянии искусственного интеллекта на игропром Кремль снижает давление на Телеграмм пока Европа строит интернет по паспорту Как CEO, CTO и CIO за 8 часов собрали ИИ-директора, который умеет держать позицию под давлением Как (не) потерять домен за выходные Вместо 8 разных VPS: как я организовал практику студентам на одном сервере Почему твой Open Source проект не замечают? R&D: искусство управления неопределенностью в разработке AI-дефляция: вакансий для разработчиков больше, а рост зарплат — худший за 15 лет Мы отдали управление роботами OpenClaw. Что из этого вышло Галактический ID: система идентификации для всех форм разумной жизни Шесть основ бизнес-анализа: начинаем с вопроса «Кто в игре?» Код-ревью, в котором дело не в коде Данные переехали. Команда — нет Системной подход к сдаче OSWE в 2025 Почему комната управления реактором покрашена в цвет морской пены 4 YAML-файла вместо PySpark: как аналитикам строить пайплайны без разработчиков LLM-агент для поиска свободных доменов: автоматизируем подбор Когда, зачем и как правильно начинать новую сессию в Claude Code? Как я заставил нейросеть писать макросы для FreeCAD Анатомия ИИ‑агента для подбора персонала. От тысячи резюме к топ‑10 за минуты Опыт разработчика как экономика внимания Автономность как точка невозврата: кто будет субъектом в цифровом будущем Обучение ИИ в «диких» условиях: как рутинные действия превращаются в датасеты Как измерить LLM для задач кибербеза: обзор открытых бенчмарков Где хранить код? Сравнение GitHub, GitLab и Bitbucket Математика объясняет, почему нормальное распределение встречается повсюду Почему ваш FinOps не работает: 12 тезисов от практиков Как подписать проектную документацию УКЭП с использованием бесплатных лицензий Pilot Адаптивное администрирование Sigla Vision Я грузил уран в бочки, а потом 20 лет строил ИТ в атомной отрасли Чем позвонить с Эвереста? История и обзор спутниковой связи. Часть 2 Как языковая модель помогает контролировать качество инструктажей по охране труда в металлургии Как не передать на desktop свой IP в РКН Анатомия SAP Privileges: как устроено управление правами в macOS MoneyDev: Сказка про три главных слова Обновлённый токенизатор видео K-VAE 2.0 от Сбера Как сделать диспетчеризацию дома на 1284 квартиры почти бесплатно Как мы разогнали железную дорогу Мы дали агентам рутину. Теперь надо решить — что делать с освободившимся временем Токсичный контент, промпт-хакинг и защита ИИ — всё о Guardrails для LLM Умный город начинается с точного взгляда: как «Фалькон Тех» меняет пространство к лучшему Навайбкодил приложение для анализа графов Почему Дюну так интересно читать? Упрощаем работу с рутиной или как стать Гендальфом Белым Деконструкция Go: CPU, RAM и что там происходит. Go Assembler база. Часть 1.1 Какие профессии исчезнут из-за ИИ, а какие появятся? И что с этим делать Как мы построили IT-отдел, где хочется расти: архитектурные встречи, прозрачные метрики и книжные подарки Rufler: Делаем из Claude Code автономный рой через один YAML-конфиг Sing-box и белый список приложений Как построить надёжный обмен сообщениями в микросервисах: лучшие практики для enterprise OpenAI строит MLM-пирамиду, а McKinsey и Accenture помогают ей в этом Дом, который не построил Фишер (Часть 2) «Сверхзвуковой математик» против «Вдумчивого логиста»: битва алгоритмов 3D-упаковки Мультимодальные модели – грубый и дорогой инструмент Разговоры ничего не стоят. Код тоже Проверки физических лиц: с кого начнет ФНС Топ-10 бесплатных нейросетей для создания видео в 2026 году Первые слои кода: как наши решения сегодня определяют архитектуру ИИ на десятилетия Разработка нового статического анализатора: PVS-Studio JavaScript Поиск уязвимостей ПО: базовый минимум или роскошный максимум Почему оценка персонала не работает как инструмент управления Как мы разработали ИИ-ассистента и сократили рутину продуктовой команды на 50% Как я ушел из найма, нажарил косточек и продал на маркетплейсах на 168 млн в год Когда 1С:ERP уже внедрена, а нормального производственного плана всё ещё нет Как я сделал Claude мультимодальным, подключив к нему Qwen Omni Как приглашение на вакансию мечты превращается в атаку Infrastructure as Code: философия и лучшие практики IaC Тестируем Yandex Code Assistant на задаче, в которой нужно хранить секреты nxs-universal-chart v3.0: новое поколение универсального Helm-чарта Callback Injection: Техника, которая отправила Microsoft Defender в глухой нокаут «Все идеи на стол»: митап как способ вывести проект из тупика Сегодня я узнал нечто новое о GPU благодаря багу в своей игре Как заставить LLM ̶ ̶г̶а̶л̶л̶ю̶ ̶ эволюционировать Карта событий как фундамент аналитики: практический кейс для E-commerce Что выбрать для AI: x86, ARM или RISC-V? Дайджест железа за март Роль соматических мутаций в развитии аутоиммунных заболеваний: путь к избирательной терапии Mythos от Anthropic — тревожный сигнал для всех, а не только для банков Guardrails для LLM на Java: как приручить промпт‑инъекции и токсичные ответы Green-VLA: как мы собрали VLA-модель для реального антропоморфного робота и не потеряли обобщение Финансовая гонка вооружений: почему умные люди добровольно в ней участвуют Эра ИИ-агентов наступила: выбираем лучшего цифрового сотрудника # Практический опыт внедрения WinCC Redundancy на производственном предприятии Сделал MVP за 3 дня, а потом неделю прикручивал оплату. Оно того стоило? Физика против Маска: почему Starship V3 может оказаться ещё одной катастрофой Нефть Венесуэлы: крупнейшие запасы в мире, но не крупнейшая нефтяная держава JPA 4. Переосмысление Hibernate Почему зеркальная фотокамера Nikon D5 десятилетней давности идеально подошла для миссии «Артемида-2» Проект «Уровень-Спутник» или как мы сделали платформу для гидрологов «Замедлиться, чтобы ускориться»: почему ИИ повышает цену ошибок в требованиях и архитектуре Как с нуля поднять трафик IT-компании на 1657% при бюджете 55 тыс. и выжить Pixel-perfect Downsampling — идеальная отрисовка 50 миллионов точек без потерь
Простой процессор основной полосы частот для радиочастотных приёмопередатчиков
Pisikak · 2026-04-23 · via Все публикации подряд на Хабре

Простой процессор основной полосы частот для радиочастотных приёмопередатчиков

Уровень сложностиПростой

Время на прочтение14 мин

Охват и читатели630

Кейс

Перевод

Сегодня беспроводные системы распространены повсюду, и количество беспроводных устройств и сервисов продолжает расти. Разработка полноценной радиочастотной системы — это комплексная задача, требующая междисциплинарного подхода, при этом наиболее важной её частью является аналоговый радиочастотный интерфейс. Однако наличие интегрированных радиочастотных приёмопередатчиков, таких как AD9361, значительно упрощает решение радиочастотных задач в подобных проектах. Эти приёмопередатчики обеспечивают цифровой интерфейс для цепочки аналоговых радиосигналов и позволяют легко интегрировать их с ASIC или FPGA для обработки в основной полосе частот. Процессор основной полосы частот (BBP) позволяет обрабатывать пользовательские данные в цифровой среде между конечным приложением и приемопередающим устройством. Конструкцию процессора основной полосы частот также легко спроектировать с помощью инструментов системного моделирования, таких как Simulink. Однако начинающему пользователю может быть трудно понять и дополнить эту часть головоломки системы связи. Эта статья представляет собой скромную попытку спроектировать и реализовать простой радиочастотный процессор основной полосы частот для системы беспроводной связи. Проект реализован на платформе AD-FMCOMMS2-EBZ и Xilinx® ZC706 с использованием эталонной конструкции FPGA AD9361.

В первом разделе этой статьи подробно описаны общие принципы проектирования процессора основной полосы частот. Этот раздел представляет собой в основном теоретическое введение в тему. Во втором разделе рассматривается фактическая аппаратная реализация процессора основной полосы частот на базе эталонной платы FPGA AD9361 от Analog Devices. Отмечается, что основная цель разработки — максимально упростить конструкцию и продемонстрировать быструю передачу данных по беспроводной связи в лабораторных условиях. Использование радиочастотного спектра сопряжено с соблюдением нормативных требований и другими последствиями.

Base Design

Типичная радиочастотная система показана на рисунке 1, кроме систем прямой радиосвязи. На рисунке 1 показан только один канал передачи данных, обратное направление которого является зеркальным отражением этого канала передачи данных. Рассматриваемый процессор основной полосы частот, представленный в этой статье, позволяет обрабатывать данные таким образом, что они передаются по радиоканалу между двумя системами радиосвязи. Требования к базовой конструкции обсуждаются ниже.

Рисунок 1. Блок-схема радиочастотной системы.

Рисунок 1. Блок-схема радиочастотной системы.

Данные повторяются для обоих ортогональных сигналов I и Q

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

Данные передаются и принимаются последовательно (по битам)

Интерфейсом RF front-end для BBP в большинстве случаев являются ЦАП и АЦП. Это цифровые интерфейсы аналогового сигнала. Таким образом, невозможно просто отправить данные на вход ЦАП и ожидать того же на выходе АЦП. Данные передаются последовательно, преобразуя однобитовые данные в ЦАП с полным разрешением. Аналогично, данные принимаются последовательно, но преобразуются с полным разрешением АЦП. Это обеспечивает достаточную избыточность. Если бы это были 16-разрядные преобразователи, приёмник принял бы решение о 1 или 0 из возможного набора данных 65536. Это само по себе значительно упрощает расшифровку.

Сигналы ввода-вывода ортогональны друг другу

Интерфейсное устройство RF (например, AD9361) является приёмопередатчиком ввода-вывода. Эти устройства работают наилучшим образом, если на вход поступают ортогональные сигналы. Они обычно имеют внутреннее согласование I/Q и коррекцию по двум каналам передачи данных, чтобы компенсировать любые различия между ними. Принято считать, что реальный (I) сигнал представляет собой косинусоидальную функцию, а воображаемый (Q) сигнал — синусоидальную функцию.

Схема модуляции — BPSK

Можно использовать все широко известные методы амплитудной, частотной или фазовой модуляции сигналов. Относительно проще обнаруживать разности фаз. Поскольку данные передаются последовательно, естественным выбором является двоичная фазовая манипуляция (BPSK).

Битовый интервал составляет восемь отсчётов

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

Данные не содержат постоянной составляющей

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

Данные зашифрованы

Пользовательские данные могут быть произвольными — это может быть длинная последовательность из 1 или 0 секунд. Данные необходимо скремблировать, чтобы обеспечить синхронизацию и восстановление фазы в приёмнике для более эффективного отслеживания сигнала.

Данные передаются пакетами

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

Пакеты проверяются с помощью CRC

Пакеты проходят циклическую проверку на избыточность (CRC), так что получателю разрешается отбросить пакет в случае несоответствия и запросить его повторную отправку.

Коррекция времени и фазы производится во время каждой преамбулы

Заголовок пакета содержит преамбулу, позволяющую выделить его из принятого потока данных. Эта преамбула также используется получателем для сброса информации о времени и фазе сигналов для демодуляции пакетных данных.

Встроенные показатели производительности

Приёмник также поддерживает статистические счётчики, такие как количество принятых, отброшенных или исправленных пакетов. Эти счётчики используются для измерения и мониторинга показателей производительности, включая частоту ошибок в битах и эффективную скорость передачи данных.

Таким образом, данные передаются и принимаются последовательно в виде пакетов. Пакеты содержат преамбулу и CRC. Данные подвергаются BPSK-модуляции и демодуляции на основе промежуточных ортогональных сигналов перед приемопередающим устройством. Частота промежуточного сигнала и, следовательно, скорость передачи данных в битах составляет одну восьмую от частоты дискретизации. Модуль процессора основной полосы частот с описанными выше конструктивными особенностями показан на рисунках 2 и 3.

Рис. 2. Функциональная блок-схема передачи BBP

Рис. 2. Функциональная блок-схема передачи BBP

Рис. 3. Функциональная блок-схема приёма BBP.

Рис. 3. Функциональная блок-схема приёма BBP.

Передатчик считывает байты данных (ширина символа) и преобразует их в пакеты с заголовком или преамбулой. В конце пакета добавляется CRC. Затем данные пакета скремблируются и сериализуются. Затем однобитовые данные фазово модулируются функцией косинуса (I) и синуса (Q) перед подключением к приёмопередатчику.

В направлении приёма автономный модуль восстанавливает и отслеживает временные интервалы и относительную фазу модулированного сигнала. Эта информация используется для восстановления последовательных данных из поступающих отсчётов АЦП. Затем они объединяются в пакеты и дешифруются. В конце пакета сравнивается CRC, и при обнаружении несоответствия пакет отбрасывается. Если CRC совпадает, данные передаются конечному пользователю.

Реализация

Конструкция BBP реализована и протестирована на аппаратном уровне. Аппаратное обеспечение представляет собой комбинацию двух тестовых плат: тестовой платы Xilinx ZC706 с ПЛИС-устройством Zynq и тестовой платы AD-FMCOMMS3-EBZ с трансивером AD9361. ADI предоставляет полный эталонный дизайн, поддерживающий это аппаратное обеспечение. Этот дизайн с открытым исходным кодом доступен в свободном доступе, полностью поддерживается и обновляется в основных версиях программного обеспечения. Подробную информацию об оборудовании можно найти по следующим URL-адресам:

ZC706

AD-FMCOMMS3-EBZ

Zynq SOC

AD9361

ADI GitHub Repository

ZC706 and AD-FMCOMMS3-EBZ HDL Reference Design

AXI AD9361 IP

Эталонный дизайн ADI представляет собой встроенную систему, поддерживающую платформу Linux®. Она состоит из различных периферийных устройств на базе процессоров ARM®. Устройство AD9361 подключается к периферийному устройству axi_AD9361 IP. Он передаёт необработанные данные выборки между радиочастотным устройством и системной памятью.

Периферийные устройства инициализируются и управляются с помощью драйверов ядра Linux. BBP реализован как другое периферийное устройство с IP-адресом, которое взаимодействует с axi_AD9361. По историческим причинам IP-адрес BBP называется axi_xcomm2ip. Приложение user space в Linux используется для управления, отправки и получения данных между системами.

В эталонном проекте ADI IP-интерфейс axi_AD9361 подключается к модулю распаковки (util_upack) в направлении передачи и модулю упаковки (util_cpack) в направлении приёма. В направлении передачи данные BBP вставляются между модулем распаковки и ядром AD9361. Чтобы это не повлияло на путь к данным по умолчанию, BBP поддерживает дополнительный мультиплексор путей к данным для выбора либо распакованного источника данных, либо источника данных BBP. BBP позволяет использовать путь к данным эталонного проекта по умолчанию и выбирает источник данных BBP только при включении. В направлении приёма BBP просто подключается к ядру AD9361. Путь к исходным проектным данным остаётся неизменным. Это позволяет frame work беспрепятственно загружать и настраивать систему. После настройки системы BBP включается, чтобы разрешить передачу данных, переопределяя путь передачи данных по умолчанию. Структурная схема BBP в том виде, в каком она реализована в эталонном проекте ADI, показана на рисунке 4.

Рисунок 4. Блок-схема BBP IP.

Рисунок 4. Блок-схема BBP IP.

При проектировании, инициализации и передаче данных, описанных в этой статье, используется пара таких устройств. Для настройки требуется пара мониторов HDMI®, клавиатура и мышь, а также антенны. Системы полностью асинхронны по отношению друг к другу, но требуют одинаковых настроек. Данные передаются на разных несущих в каждом направлении. Несущая частота передачи устройства 1 и несущая частота приёма устройства 2 одинаковы, но различаются в другом направлении. Однако при использовании одного устройства в режиме обратной связи несущие передачи и приёма должны иметь одинаковую частоту. В HDL-дизайне BBP используются библиотечные модули ADI.

Управляющий (микропроцессорный) интерфейс

Интерфейс AXI-Lite используется процессором для управления и мониторинга BBP. Этот интерфейсный модуль просто выводится с помощью модуля up_axi из общей библиотеки ADI (hdl/library/common/up_axi.v). Этот модуль преобразует интерфейс AXI-Lite в простую память, такую как шина чтения и записи. Внутренние регистры и память добавляются так же, как и в любой другой ADI IP. Схема регистров подробно представлена в таблице 1.

Таблица 1. Карта регистров BBP

Address

Register Name

Type

Fields

Name

Description

Default

0x000

XCOMM2IP_VERSION

RO

31:0

VERSION

The IP version.

0x40063

0x008

XCOMM2IP_SCRATCH

RW

31:0

SCRATCH

Scratch register

0x0

0x800

XCOMM2IP_TX_RESET

RW

0

TX_RESET

Если установлено значение 0x1, передача сбрасывается. Для нормальной работы этот бит должен быть установлен в 0x0.

0x1

0x804

XCOMM2IP_TX_ENABLE

RW

0

TX_ENABLE

Если установлено значение 0x0, путь передачи данных не изменяется, и данные UNPACK передаются на ЦАП. Если установлено значение 0x1, данные BBP передаются на ЦАП.

0x0

0x808

XCOMM2IP_TX_REQ

RW

0

TX_REQ

Если задано программно, инициирует передачу пакета в направлении передачи данных. Этот бит автоматически сбрасывается аппаратным обеспечением после завершения передачи.

0x0

0x80C-0x87C

XCOMM2IP_TX_PKT_DATA_3-XCOMM2IP_TX_PKT_DATA_31

W

7:0

TX_PKT_DATA_3-TX_PKT_DATA_31

Данные пакета, байты с 3-го по 31-й. Аппаратное обеспечение использует первые три байта для заголовка, а последний байт — для контрольной суммы.

W

0xC00

XCOMM2IP_RX_RESET

RW

0

RX_RESET

Если установлено значение 0x1, приём сбрасывается. Для нормальной работы этот бит должен быть установлен в значение 0x0.

0x1

0xC08

XCOMM2IP_RX_REQ

RW

0

RX_REQ

Если этот бит установлен аппаратно, это означает, что получен пакет данных, который необходимо прочитать программно. Программное обеспечение должно сбросить этот бит после прочтения данных пакета. Все последующие пакеты будут отбрасываться до тех пор, пока этот бит не будет сброшен программно.

0x0

0xC0C-0xC7C

XCOMM2IP_RX_PKT_DATA_3-XCOMM2IP_RX_PKT_DATA_31

W

7:0

RX_PKT_DATA_3-RX_PKT_DATA_31

Данные пакета, байты с 3-го по 31-й. Аппаратное обеспечение использует первые три байта для заголовка, а последний байт — для контрольной суммы.

W

Порты модуля up_axi и их сопоставления с портами описаны ниже.

up_rstn: сброс интерфейса AXI (асинхронный активный низкий уровень), подключённый к s_axi_aresetn.

up_clk: тактовый сигнал интерфейса AXI, подключённый к s_axi_aclk.

up_axi_*: сигналы интерфейса AXI, подключённые к эквивалентным портам s_axi_*.

up_wreq, up_waddr, up_wdata, up_wack: внутренний интерфейс записи, сигнал up_wreq используется для указания запроса на запись вместе с адресом и данными. Запрос должен быть подтверждён через порт up_wack.

Простая запись в регистр осуществляется следующим образом.

always @(negedge up_rstn or posedge up_clk) begin
  if (up_rstn == 0) begin
    up_wack <= ‘d0;
    up_reg0 <= UP_REG0_RESET_VALUE;
  end else begin
    up_wack <= up_wreq_s;
    if ((up_wreq_s == 1’b1) && (up_waddr == UP_ REG0_ADDRESS)) begin
      up_reg0 <= up_wdata[UP_REG0_WIDTH-1:0];
    end
  end
end

Модуль выполняет промежуточную трансляцию адресов. Интерфейс AXI использует байтовые адреса, но внутренняя шина использует адреса DWORD. В результате модуль up_axi отбрасывает два младших бита адреса AXI для генерации внутреннего адреса DWORD.

up_rreq, up_raddr, up_rdata, up_rack: внутренний интерфейс чтения, сигнал up_rreq, используется для указания запроса на чтение вместе с адресом. Запрос должен быть подтверждён через порт up_rack вместе со считанными данными.

Тот же самый регистр, который был реализован для чтения выше, показан ниже.

always @(negedge up_rstn or posedge up_clk) begin
  if (up_rstn == 0) begin
    up_rack <= ‘d0;
    up_rdata <= ‘d0;
  end else begin
    up_rack <= up_rreq_s;
    if ((up_rreq_s == 1’b1) && (up_raddr == UP_ REG0_ADDRESS)) begin
      up_rdata <= up_reg0;
    end else begin
      up_rdata <= 32‘d0;
    end
  end
end

Такое же преобразование адресов применяется и для чтения. Данные чтения передаются только по запросу и в противном случае обнуляются. Это связано с тем, что модуль up_axi передаёт отдельные данные чтения из различных адресных блоков в элемент OR. Таким образом, для блоков, которые не выбраны, необходимо обнулить значение считываемых данных.

У BBP есть три адресных пространства, перечисленных в таблице сопоставления регистров выше. Общее регистровое пространство преобразуется в 0x000, передача (DAC) преобразуется в 0x800 (0x200), а приём (ADC) преобразуется в 0xC00 (0x300). Предполагается, что программное обеспечение (приложение Linux user space) будет записывать передаваемые пакетные данные в буфер и считывать полученные пакетные данные из другого буфера. Размер пакета выбран равным 32 байтам с 3-байтовой преамбулой и 1-байтовым CRC.

Интерфейс данных

Интерфейсное ядро AD9361 состоит из двух пар 16-битных данных ввода-вывода для двух каналов в направлении приёма и передачи. Ядро работает с той же частотой, что и цифровой интерфейс AD9361. В режиме 2R2T это значение равно 4-кратной частоте дискретизации. В режиме 1R1T это значение равно 2-кратной частоте дискретизации. Эффективная скорость передачи данных определяется действительным сигналом. Таким образом, в режиме 2R2T значение valid устанавливается раз в четыре такта. В режиме 1R1T значение valid подтверждается каждые два такта. BBP разработан для поддержки режимов 2R2T и 1R1T. Он использует единый канал передачи и приёма. Внутренняя логика настроена на работу с частотой дискретизации как в режиме 2R2T, так и в режиме 1R1T. Затем BBP передаёт данные интерфейсному ядру на своей тактовой частоте. Это сделано намеренно, чтобы продемонстрировать преобразование тактовой частоты в BBP. Во многих случаях пользователь может захотеть запустить логику BBP с частотой дискретизации независимо от скорости интерфейса приёмопередатчика.

Внутренние тактовые сигналы на частоте дискретизации генерируются с использованием примитивов Xilinx BUFR и BUFG. BUFR — это делитель, а BUFG - буфер тактовых сигналов с высокой степенью разветвления. Для этой цели также можно использовать MMCM. Тактовый сигнал генерируются следующим образом.

parameter XCOMM2IP_1T1R_OR_2T2R_N = 0; localparam XCOMM2IP_SCLK_DIVIDE = (XCOMM2IP_1T1R_OR_2T2R_N == 1) ? “2” : “4”;

BUFR #(.BUFR_DIVIDE(XCOMM2IP_SCLK_DIVIDE)) i_bufr (
    .CLR (1’b0),
    .CE (1’b1),
    .I (clk),
    .O (s_clk_s));


BUFG i_bufg (
    .I (s_clk_s),
    .O (s_clk));

Использование BUFR и BUFG обеспечивает синхронизацию тактовых импульсов по частоте благодаря достоверности фазы. Максимальная фазовая неопределённость составляет один период тактовых импульсов интерфейса. Это легко компенсируется четырёхступенчатой матрицей регистров с сигналом синхронизации. Однако в конструкции используются двухпортовые модули оперативной памяти для реализации передачи данных. Это сделано намерено в качестве примера использования, отражающего общие требования к обработке сигналов. Элементы двухпортовой оперативной памяти выводятся с использованием библиотечных модулей памяти ADI (ad_mem).

Интерфейс передачи

При передаче данных процессор записывает их в буфер (см. таблицу соответствия регистров выше). Затем он запрашивает у аппаратного обеспечения отправку этого пакета. BBP непрерывно отправляет пакеты на устройство. В начале обработки пакета он проверяет наличие запросов. Если ожидающих обработки запросов нет, он отправляет пакет в режиме ожидания. Если запрос ожидает обработки, пакет считывается и отправляется.

Логика передачи работает с разрядностью 8 бит, используя свободно работающий счётчик битов. Адрес чтения из буфера обновляется, когда счётчик битов показывает 0x0. Поскольку запрос от процессора может поступить в любой момент во время передачи пакета, он фиксируется сразу же и сбрасывается в начале передачи пакета. В начале передачи пакета, если есть ожидающий обработки запрос, он подтверждается через интерфейс процессора. Запрос используется для выбора между буферными и неактивными данными.

Рисунок 5. Путь передачи данных.

Рисунок 5. Путь передачи данных.

Первым двум байтам данных пакета присваивается значение 0xfff0. Третий байт используется для обозначения незанятого пакета (0xc5) или пакета данных (0xa6). Байт CRC вставляется в качестве последнего байта пакета. Многочлен CRC равен x8 + x2 + x + 1. Все байты, кроме заголовка, зашифрованы. Многочлен скремблирования такой же, как у SONET/SDH (x7 + x6 + 1).

Для генерации модулированной несущей используется таблица поиска значений косинуса и синуса. Интервал между битами равен полному циклу (от 0 до 2π) сигнала, состоящего из восьми отсчётов. Битовые данные используются для инвертирования сигнала. Затем данные записываются в небольшой буфер и считываются в зависимости от сигнала подтверждения от интерфейсного ядра AD9361 с использованием тактового сигнала интерфейса.

Интерфейс приёма

При приёме данные I/Q проверяются на наличие шаблона заголовка 0xfff0. Это уникальный шаблон, который встречается только один раз при передаче пакета. Можно отправлять пакетные данные таким образом, чтобы на выходе скремблера повторялся этот шаблон. Такое нежелательно и предотвращается программным обеспечением. Последовательность синфазных данных, состоящая из 12 последовательных битовых интервалов, используется для сброса и отслеживания синхронизации и фазы приёмника модулем восстановления синхронизации. Таким образом, он сбрасывает таймеры и устанавливает значение фазы на 0x1. Первая инверсия после этой последовательности считается за 0x0. После этого модуль восстановления синхронизации сохраняет своё состояние на протяжении всей передачи пакета.

Модуль восстановления данных усредняет сигнал и определяет текущую фазу сигнала. Затем он сравнивает её с относительной фазой, отслеживаемой модулем восстановления синхронизации. В случае конфликта решение принимается на основе предыдущих изменений сигнала. Это связано с тем, что конфликты обычно возникают из-за смены фазы.

Рисунок 6. Путь получения данных.

Рисунок 6. Путь получения данных.

Затем демодулированные битовые данные объединяются в байты и расшифровываются. Данные записываются в буфер передачи, если он пуст. В конце пакета проверяется контрольная сумма. Если она совпадает, и буфер передачи заполнен, интерфейс процессора получает уведомление. Предполагается, что программное обеспечение отслеживает этот запрос и, если такая возможность предусмотрена, очищает буфер, считывая его содержимое. После этого запрос должен быть отменён, чтобы можно было передавать следующие пакеты.

Инструкции по сборке и загрузке

В этой статье излагается теория и особенности реализации простого радиочастотного процессора основной полосы частот. Обсуждается практическая реализация этой конструкции на аппаратных средствах ZC706 и AD-FMCOMMS3-EBZ. Полные файлы дизайна для быстрой демонстрации и инструкции по сборке представлены на странице https://wiki.analog.com/resources/fpga/docs/hdl/xcomm2ip. В wiki также подробно описаны дизайн HDL, программное обеспечение, настройка RF, производительность и анализ.

Об авторах

Rejeesh Kutty

Реджиш Кутти (Rejeesh Kutty) — инженер по HDL в группе поддержки клиентских решений Analog Devices, он присоединился к компании в 2011 году. Он получил степень магистра в области электронной инженерии в Индийском институте науки, Индия.