Сегодня беспроводные системы распространены повсюду, и количество беспроводных устройств и сервисов продолжает расти. Разработка полноценной радиочастотной системы — это комплексная задача, требующая междисциплинарного подхода, при этом наиболее важной её частью является аналоговый радиочастотный интерфейс. Однако наличие интегрированных радиочастотных приёмопередатчиков, таких как 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 году. Он получил степень магистра в области электронной инженерии в Индийском институте науки, Индия.

Комментарии (7)