Подключение АЦП к ПЛИС. Особенности, сложности, реализация


    Всем привет! В данной статье речь пойдет о подключении микросхем АЦП к кристаллам ПЛИС. Будут рассмотрены основные особенности соединения узлов схем, представлены современные АЦП и их характеристики. В статье будут даны практические советы по быстрому и правильному подключению АЦП к ПЛИС с минимальными временными затратами. Кроме того, речь пойдет о принципах подключения тех или иных АЦП, будет рассмотрен входной буфер ПЛИС и его базовые компоненты – триггеры, узлы задержки IODELAY, сериализаторы ISERDES и т.д. Более детально с примерами программного кода на языке VHDL будет проведен обзор основных элементов, требуемых для качественного приёма данных от АЦП. Это входной буфер, узел упаковки данных для одноканальных и многоканальных систем, модуль синхронизации и передачи данных на базе FIFO, узел программирования АЦП по интерфейсу SPI, узел синтеза частоты данных – MMCM/PLL. Также в статье будет представлен обзор законченных устройств (в стандарте FMC) от ведущих зарубежных и отечественных производителей аналоговых и цифровых схем. В конце статьи вы найдете ссылку на исходные коды универсального узла приёмника данных от многоканальных схем АЦП. Код простой и гибкий в конфигурировании, он представлен на языке VHDL и заточен на микросхемы ПЛИС Xilinx 7 серии и выше, но может быть применен и в других кристаллах ПЛИС.

    План статьи


    • АЦП (общий обзор, назначение, элементная база)
    • Примеры законченных АЦП модулей различных фирм производителей
    • Подключение АЦП к ПЛИС. Выбор ПЛИС. Количество контактов, объем логических ресурсов, интерфейс передачи данных

      • Входной буфер ПЛИС. Состав, основные узлы. Назначение
      • Упаковщик данных для одноканальных и многоканальных схем
      • Узел синхронизации данных (FIFO)
      • Управление АЦП по SPI интерфейсу (пример)
      • Внутренняя шина. Подключение ПЛИС к удаленному устройству

    • Исходные коды приёмника данных АЦП
    • Список литературы

    Аналого-цифровые преобразователи


    АЦП применяются для широкого класса задач радиотехники – в любых устройствах, где требуется преобразовать аналоговый сигнал в цифровую форму. Они могут использоваться в аудио- и видео-системах, применяются в задачах гидроакустики и гидросвязи (низкая частота дискретизации, высокая разрядность данных), в устройствах преобразования радиочастотного диапазона (схемы DDC/DUC), в радиолокации и радионавигации (высокие частоты дискретизации, средняя разрядность данных). АЦП применяются в цифровых вольтметрах и мультиметрах, в платах видеовхода компьютеров, видеокамерах, системах распознавания речи и звуковых устройствах. Быстрые АЦП используются в осциллографах и спектроанализаторах, применяются в лабораторном оборудовании и медицинской технике. Очень часто АЦП используется в задачах сбора и обработки данных на высоких скоростях.

    Как видно, микросхемы АЦП – неотъемлемая часть аналого-цифровых устройств. В современном мире очень непросто найти устройство, в котором бы отсутствовали АЦП. Классический вид АЦП представлен на следующем рисунке.


    Это упрощенная схема, взятая из даташита на микросхему AD9684. Она содержит два дифференциальных аналоговых входа VINA и VINB, вход тактовой частоты CLK, управление по интерфейсу SPI, выходную шину в параллельной форме D0-D13, точки напряжения питания различных узлов микросхемы, блок синхронизации SYNC и другие управляющие сигналы.

    Очевидно, что микросхемы АЦП характеризуется набором определенных параметров, от которых зависит конечный выбор пользователя и который определяет область применения АЦП. По цифровой части – это скорость передачи данных (эффективная тактовая частота), которая может находиться в диапазоне от нескольких десятков кГц до нескольких ГГц. Разрядность данных на выходе АЦП – в современных устройствах от 8 до 32 бит данных. Со стороны аналоговых характеристик – это отношение сигнал-шум (SNR) и динамический диапазон, свободный от паразитных составляющих (SFDR), выражаемые, как правило, в децибелах (типовые уровни SNR лежат в пределах 70-80 дБ, а уровни SFDR в районе 90 дБс). Немаловажными параметрами при выборе АЦП являются – рассеиваемая мощность (Вт), количество каналов в одном корпусе, интерфейс обмена с цифровым узлом и, разумеется, стоимость компонента.

    Рассмотрим современные быстродействующие АЦП и их характеристики на примере таблицы, взятой с известного сайта Analog Devices – гиганта в области производства всевозможных микросхем АЦП и ЦАП. В таблицу для удобства сведены самые важные характеристики микросхем, они разделены по типу интерфейса обмена с цифровым устройством и выстроены по скорости передачи информации (тактовой частоте) от большего значения к меньшему.


    В таблице представлены 4 топовые микросхемы, передающие данные в параллельной форме по стандарту LVDS. Разрядность данных 14-16, каналов 1-2, максимальная частота дискретизации 500МГц. Средние значения SNR и SFDR – 70 dBFS и 90 dBc, соответственно. Для некоторых микросхем с последовательной шиной передачи данных (Serial) характеристики практически схожие. Для современных микросхем АЦП, которые используют интерфейс передачи JESD204B и подключаются к ПЛИС через гигабитные линии, тактовые частоты значительно выше, но аналоговые характеристики несколько хуже (по меньшей мере из-за того, что разрядность цифровых данных ниже – 12 и 14 бит). В данной статье не будет рассматриваться подключение АЦП к кристаллам FPGA через гигабитные линии. Я остановлюсь на простом и хорошо изученном варианте подключения микросхем – последовательная и параллельная шина с интерфейсами передачи данных типа LVTTL, LVDS, LVCMOS, LVPECL. В частности, интересен способ передачи данных по LVDS шине, который отличается простотой трассировки печатных плат, дешевизной исполнения, низким уровнем помех и рассеиваемой мощности, а также высокой скоростью передачи данных. Для приема данных по последовательной шине в ПЛИС используются сериалайзеры / десериалайзеры. Для параллельной шины все намного проще и данные принимаются как есть.

    В ходе работы по сопряжению аналоговых и цифровых устройств мне приходилось осваивать следующие микросхемы АЦП. Это уже устаревшие, но всё еще используемые – AD9224, AD6644ST-65, AD9244, LCT2207, ADS5474, AD9432BST-105, AD7475BR, микросхемы современного уровня – AD9430BSV, ADS54RF, AD9467, ADC12D1800, AD9680 и другие. Поскольку область моей работы лишь частично связана с аналоговой схемотехникой, я вряд ли расскажу вам о способах улучшениях характеристик законченных аналого-цифровых модулей. Также я не смогу дать советы по качественному построению аналоговых трактов и методике выбора тех или иных компонентов схемы для достижения наилучших аналоговых показателей (SNR, SFDR). Но на вопросы подключения АЦП к кристаллам FPGA и дальнейшей обработки данных я постараюсь ответить в рамках данной статьи.

    Примеры модулей АЦП


    На следующих рисунках будут представлены современные примеры законченных и качественных модулей аналого-цифрового преобразования данных от российских и зарубежных производителей. Все они имеют один или несколько аналоговых входов подключения и разъем-переходник FMC (FPGA Mezzanine Card) для подключения к несущей плате, на которой устанавливается обработчик данных (как правило, это FPGA). FMC – это один из основных стандартов для подключение изделий по модульной архитектуре. На мезонинный модуль (mezzanine board) зачастую устанавливается аналоговая часть, а на несущий модуль (carier board) устанавливается центральное устройство, осуществляющее обработку данных – это одна или несколько ПЛИС и/или сигнальные процессоры. Из зарубежных производителей устройств следует выделить две лидирующие фирмы-производителя – это 4dsp и hitechglobal. Из отечественных производителей гугл в первых строках поиска выдает ЗАО «Скан инжиниринг Телеком», ЗАО «Инструментальные системы» и другие. Автор статьи не несет ответственности за представленные модули и не использует статью в целях рекламы продукта той или иной фирмы.

    HTG-ADC16. Обладает следующими характеристиками (взяты с официального сайта):


    • 16-Bit Resolution, Dual-Chanel, 1-GSPS ADC
    • Noise Floor: –159 dBFS/Hz
    • Spectral Performance (fIN = 170 MHz at –1 dBFS):

      • SNR: 70 dBFS
      • SFDR: 86 dBc
      • SFDR: 96 dBc (Except HD2, HD3, and Interleaving Tones)

    • Spectral Performance (fIN = 350 MHz at –1 dBFS):

      • SNR: 67.5 dBFS
      • NSD: –154.5 dBFS/Hz
      • SFDR: 75 dBc
      • SFDR: 85 dBc (Except HD2, HD3, and Interleaving Tones)

    • Channel Isolation: 100 dBc at fIN = 170 MHz
    • Input Full-Scale: 1.9 VPP
    • Input Bandwidth (3 dB): 700 MHz
    • On-Chip Dither
    • Integrated Wideband DDC Block
    • JESD204B Interface with Subclass 1 Support:

      • 2 Lanes per ADC at 10.0 Gbps
      • 4 Lanes per ADC at 5.0 Gbps
      • Support for Multi-Chip Synchronization

    • Power Dissipation: 1.35 W/ch at 1 GSPS

    FMC104: 4-Channel 250 MSPS @ 14-bit. Характеристики (некоторые удалены за избыточностью информации):


    • Four Channel 14-bit 250 MSPS A/D conversion
    • Available as air cooled and conduction cooled
    • VITA 57.1-2010 compliant
    • Based on TI ADS62P49
    • LVDS or 1.8V LVCMOS output operation
    • Single ended AC- or DC-coupled analog input
    • Flexible clock tree enables
    • LPC (low-pin count) compatible

    Особенность модуля – четыре канала АЦП, напряжение питания 1.8В (используются HP-банки FPGA Xilinx).

    FMC120: 4-Channel 250 MSPS @ 14-bit. Характеристики:


    • Quad — A/D — D/A Channel Operation

      • Quad Channels 16-bit 1.00 GSPS A/D
      • Quad Channels 16-bit 1.25 GSPS D/A
      • Simultaneous sampling on all channels up to 1 GSPS

    • VITA 57.1-2010 compliant
    • Conduction Cooled – Standard Option
    • Single ended DC or AC-coupled analog input.
    • Clock Source, Sampling Frequency, and Calibration through an SPI communication bus
    • HPC – High Pin Count Connector
    • 2Kbit EEPROM (24LC02B) accessible from the Host via I2C bus
    • JTAG – CPLD device is included in the JTAG chain accessible from the FMC connection

    FMC140: 4-channel 16-bit 370MSPS A/D. Обладает следующими характеристиками:


    • Four-channel, 16-bit A/D up to 370 MSPS
    • VITA 57.1-2010 compliant
    • JESD204B serial interface
    • AC or DC-coupled analog signals
    • Clock source, sampling frequency, and calibration through SPI communication busses
    • Flexible clock tree enables
    • Power-down modes to switch off unused functions for system power savings
    • HPC — High Pin Count connector

    Особенность модуля – 4 высокоскоростных канала АЦП, разрядность данных 16 бит, обмен по интерфейсу JESB204B.

    Модуль SFM-4A1000. Характеристики:


    • Четыре канала АЦП: 14 бит 1000 МГц
    • Широкополосный трасформаторный вход с полосой до 2 ГГц
    • Интерфейс с несущим модулем JESD204B
    • Поддержка встроенных в АЦП функций цифровой децимации и АРУ
    • Высокостабильный опорный генератор, вход внешнего опорного тактирования
    • Программное управление настройками АЦП и схемой тактирования
    • Форм-фактор FMC одиночной ширины с воздушным или кондуктивным охлаждением

    Особенность модуля – отечественная разработка, 4 высокоскоростных канала АЦП, полоса 2ГГц, обмен по интерфейсу JESB204B.

    Модуль FMC212x4GDA. Характеристики:


    • Два канала АЦП 12 бит
    • Частота преобразования: от 1 до 4 GSPS
    • Аналоговая входная полоса: от 5 до 2000 МГц
    • Входное сопротивление: 50 Ом
    • DDC, встроенный в АЦП
    • Максимальная ширина полосы DDC: 800 МГц
    • Коэффициент децимации DDC: от 4 до 32
    • Четыре канала ЦАП 16 бит 2,8 GSPS
    • Интерполяция: х2, х4, х8
    • Частотный диапазон выходных сигналов ЦАП: от 0,5 до 400 МГц
    • Максимальная амплитуда выходного сигнала: ±0,5 В
    • Выходное сопротивление: 50 Ом
    • Синтезатор тактовых частот АЦП и ЦАП с низким фазовым шумом
    • ANSI/VITA 57.1 FMC модуль 69x76,5 мм

    Особенность модуля – 2 высокоскоростных канала АЦП, полоса сигнала до 2ГГц, обмен по интерфейсу JESB204B, встроенные микросхемы DDC, 4 канала ЦАП.

    Модуль FMC816x250M. Характеристики:


    • ANSI/VITA 57.1 FMC модуль двойной ширины 139x76.5мм
    • 8 АЦП 16 бит
    • Частота преобразования: от 50 МГц до 250 МГц
    • Аналоговая входная полоса 0,1…250МГц
    • Шкалы преобразования: ±0,8В; ±0,65В
    • Входное сопротивление: 50 Ом
    • Внутреннее/внешнее тактирование
    • Перестраиваемый тактовый генератор 10…250МГц

    Особенность модуля – 8 каналов АЦП, сдвоенный модуль.

    Как видно, многие из модулей аналого-цифрового преобразования в стандарте FMC похожи и обладают практически идентичными характеристиками, которые определяются установленными микросхемами АЦП и ЦАП. Окончательный выбор того или иного модуля определяется задачей, которую требуется решить конечному пользователю.

    Подключение АЦП к ПЛИС


    Перейдем к основному разделу статьи – подключение микросхем АЦП к кристаллам ПЛИС. Рассмотрим подключение АЦП по параллельной и последовательной шине, с интерфейсами передачи данных – LVTTL, LVCMOS, LVDS. В статье не будет рассмотрено подключение АЦП по интерфейсу JESD204B, поскольку это материал отдельной темы, который займет не одну полноценную статью. Кроме того, JESD204B существенно отличается в реализации от «классических» вариантов подключения микросхем АЦП и требует более детального рассмотрения.

    Как известно, банки (группы пинов) ввода/вывода ПЛИС могут конфигурироваться на различное напряжение питания, границы которого определяются производителем кристаллов. В современных ПЛИС типа Xilinx диапазон подаваемых напряжений зависит от типа банка. Существует два основных типа банка (Xilinx) – HP (высокопроизводительные) и HR (банки с большим выбором стандартов и питания). Например, в микросхемах 7 серии Xilinx диапазон напряжений для банков HR – от 1.2 до 3.3В, а для банков HP – от 1.2 до 1.8В. Помимо этого, пины банков могут программироваться на широкий диапазон стандартных интерфейсов передачи данных, но конечный выбор стандарта определяется двумя правилами: напряжение питания банка ПЛИС и способ подключения удаленного устройства и ПЛИС. С другой стороны, немаловажным фактором выбора напряжения питания банка ПЛИС является семейство кристаллов. Так, для Kintex-7 возможно использовать стандарт LVDS 25 и питать банк напряжением 2.5В, а для многих микросхем ПЛИС Virtex-7 стандарт подключения исключительно LVDS 18, и банк запитывается напряжением 1.8В. В связи с этим, возникает проблема сопряжения некоторых аналоговых модулей и несущих плат с разными семействами ПЛИС. Поэтому при покупке у стороннего производителя модуля АЦП и/или несущей платы нужно убедиться, что они совместимы по стандарту и напряжению питания. Как правило, интерфейс передачи данных прописывается в файле ограничений (UCF или XDC), а не в исходных кодах проекта, что обеспечивает гибкость конфигурации и повторное использование файлов исходных кодов в других проектах.

    Структурная схема файла верхнего уровня проекта (а также внутренних блоков, используемых для приёма данных от микросхем АЦП по стандарту LVTTL / LVCMOS / LVDS) представлена на следующем рисунке.


    Она включает следующие элементы:

    • Входной приемник
    • Упаковщик данных
    • Синхронизатор потока данных (FIFO)
    • Блок управления микросхемами АЦП

    Помимо этих узлов, на верхнем уровне используется модуль синтеза частоты на основе MMCM – стандартный ресурс ПЛИС. Также для управления задержками в узлах IODELAY применяется компонент IDELAYCTRL.

    Основные параметры файла верхнего уровня, от которых зависит конфигурация схемы в ПЛИС:

    • NCHAN — количество независимых каналов АЦП,
    • DATA_WIDTH — разрядность данных АЦП,
    • FIFO_ADDR — глубина FIFO: DEPTH = 2**ADDR,
    • DATA_RATE — режим приёма данных: SDR / DDR,
    • PACK_OUT — ширина выходной шины упаковщика (системная шина),
    • CLK_SEL — выбор основного источника тактовой частоты для многоканальной схемы,
    • USE_MMCM — использование узла MMCM вместо BUFR для деления частоты CLKDIV на SERDES,
    • DIFF_TERM — использование дифференциальных входных сигналов (TRUE/FALSE),
    • IOSTANDARD — стандарт напряжения для LVDS линий,
    • DATA_IOBDELAY_TYPE — режим работы узла задержки IODELAY,
    • DATA_IOBDELAY_VALUE — значение задержки по умолчанию,
    • DIFF_CLOCK — использование дифференциального тактового сигнала на входе (TRUE/FALSE),
    • OVR_PRES — использование линий переполнения АЦП (overflow),
    • STR_PRES — использование линий сигнала внешнего старта АЦП (start),
    • RESYNC_OUT — включение механизма первичной пересинхронизации данных на входном буфере (YES/NO).

    И некоторые другие параметры.

    Часть код файла верхнего уровня приёмника АЦП выглядит примерно следующим образом:

    xFIFO: CTRL_FIFO_CONFIG 
      generic map (
        DATA_WIDTH => PACK_OUT,
        ADDR_WIDTH => FIFO_ADDR
      )
      port map (
        reset   => reset,       
        wr_clk  => clk_pack,	
        rd_clk  => sys_clk,
        data_i  => do_pack,
        data_o  => do_fifo,
        rd_en   => cs_fifo,
        wr_en   => dv_pack,	
        empty   => ef_fifo,
        full    => ff_fifo
    );
    

    Здесь подключается узел FIFO для синхронизации данных с системной шиной устройства. Программирование задержек для IODELAY в многоканальной и многоразрядной схеме буфера выглядит следующим образом:

    ---- Data delays ----
    x_dat_dd <= x_dat_do(conv_integer(unsigned(dl_chan))) when rising_edge(dl_clk);	
    x_dat_in(conv_integer(unsigned(dl_chan)))(conv_integer(unsigned(dl_muxs)))  <= dl_dat_in when rising_edge(dl_clk);		
    x_dat_ce(conv_integer(unsigned(dl_chan)))(conv_integer(unsigned(dl_muxs)))  <= dl_dat_ce when rising_edge(dl_clk);	
    x_dat_ld(conv_integer(unsigned(dl_chan)))(conv_integer(unsigned(dl_muxs)))  <= dl_dat_ld when rising_edge(dl_clk);
    

    Где dl_chan — выбранный канал АЦП, dl_muxs — выбранный разряд АЦП. Это сделано для независимого программирования каждого бита данных.

    Рассмотрим каждый узел детально.

    Замечание: для подключения ПЛИС и ЦАП (цифро-аналоговых преобразователей) ситуация зеркальна. Необходимо сделать все тоже самое, но в обратном порядке. В рамках данной статьи подключение ПЛИС к ЦАП не рассматривается.

    Входной приемник


    Содержит первичные элементы подключения между внешними сигналами печатной платы и логикой ПЛИС. Это буфер IPAD от контакта ПЛИС к логике входного буфера IOBUF. В зависимости от интерфейса передачи данных буфер может быть дифференциальный – IBUFDS и однополярный – IBUF. Для многих буферов возможна жесткая привязка к требуемому стандарту, либо возможна установка типа выходного сигнала через атрибуты. Например, для IBUFDS с помощью атрибута IOSTANDARD можно заранее в исходных кодах определить и задать стандарт «LVDS_25».

    Следом за буфером устанавливается узел регулирования задержки прохождения сигнала IODELAY для выравнивания фронтов параллельной шины данных и первичного согласования многоканальных узлов подключения АЦП к ПЛИС. IODELAY – программируемый ресурс ПЛИС, величина задержки может быть фиксирована и определяться установкой по умолчанию, либо программироваться в диапазоне от 0 до 31 условных величин времени (цифра определяется даташитом на микросхему ПЛИС). Программирование осуществляется примитивным образом с помощью нескольких сигналов. Останавливаться на детальном разборе алгоритма программирования не будем, за дополнительной информацией можно обратиться к документу из списка литературы в конце статьи. Для узлов IODELAY необходимо подключать специальный узел контроля задержек IDELAYCTRL, который в режиме реального времени калибрует задержки для каждого тактового региона ПЛИС. Для устранения влияния температуры кристалла, напряжения питания и загруженности ПЛИС, узел IDELAYCTRL тактируется независимым сигналом REFCLK. Этот тактовый сигнал обеспечивает равную величину задержки (TAP) во всех узлах IODELAY каждого тактового региона ПЛИС. Если в каждом тактовом регионе необходимы свои величины подстройки – в кристалле ПЛИС инициализируются несколько узлов IDELAYCTRL. Тактовый сигнал REFCLK может подаваться с внешнего генератора, установленного вне ПЛИС, либо может быть получен путем синтеза частоты в узле MMCM кристалла ПЛИС.


    Следом за узлом задержки IODELAY возможна установка FD триггера, если режим передачи данных DATA_RATE = «SDR». Этот триггер опционально помещается во входной буфер и тактируется частотой АЦП, сопровождающей данные с аналогового модуля. В режиме DATA_RATE = «DDR» триггер заменяется на усложненный вариант IDDR, который имеет один вход данных и два выхода. С выхода возможна выдача данных в нескольких режимах, но на практике я использовал только один – это «SAME_EDGE_PIPELINED», при котором данные с выхода Q1 и Q2 выдаются по одному и тому же фронту тактового сигнала.


    Ну и наконец, самый интересный вариант – это подключение узла IODELAY к модулю десериализации данных ISERDES. Узел сериалайзера – сложный элемент входного буфера ПЛИС, он содержит следующие опции:

    • DATA_RATE – определяет режим выходных данных (SDR/DDR),
    • DATA_WIDTH – определяет разрядность шины данных на выходе узла (от 1 до 8),
    • INTERFACE_TYPE – тип интерфейса передачи данных. Для подключения микросхем АЦП используется режим «NETWORKING».
    • SERDES_MODE – режим подключения ISERDES в случае использования нескольких сериалайзеров для приема данных от одного контакта ПЛИС.

    Тактирование узла осуществляется несколькими сигналами – это сигнал на высокой частоте принимаемых данных CLK и сигнал CLKDIV, деленный на число, определяемое параметром DATA_WIDTH. Деление может происходить вне ПЛИС, но на практике используются синтезаторы частоты в самом кристалле ПЛИС, которые носят название MMCM. Таким образом, на вход узла ISERDES поступает последовательный сигнал на частоте CLK, а на выходе узла ISERDES получается параллельный поток данных на сниженной частоте CLKDIV = CLK / DATA_WIDTH. Тактовую частоту можно поделить с помощью регионального буфера BUFR, значение коэффициента деления BUFR_DIVIDE = 1-8, или на узле синтезатора частоты MMCM, программируемого в широком диапазоне.


    Для устранения эффекта совпадения фронта тактовой частоты и данных не всегда хватает узлов IODELAY и подстройки частоты в MMCM. Зачастую приходится искать альтернативные пути решения этой проблемы. К счастью, это решение было найдено моим коллегой, о чем он недавно рассказал в своей статье (Полезные свойства джиттера).

    Все перечисленные выше узлы (за исключением MMCM) входят в состав входного буфера ПЛИС и не занимают логических ресурсов кристалла. С выхода FD / IDDR / ISERDES данные поступают уже на логические элементы – это триггер или FIFO небольшого размера для первичной пересинхронизации данных на частоту, полученную после прохождения частоты дискретизации АЦП в узле MMCM. В некоторых случаях пересинхронизация не используется, а данные синхронизируются напрямую частотой дискретизации АЦП. На следующем рисунке приведена временная диаграмма обработки последовательных данных с микросхемы АЦП на устройстве ISERDES. Показана входная тактовая частота, последовательная форма входных данных и преобразованные данные в параллельный код.


    Таким образом, в зависимости от конфигурации, во входном буфере возможно три пути прохождения сигнала, как показано на рисунке:


    A) режим SDR — данные принимаются по параллельной шине, для каждого бита данных используется свой буфер ПЛИС,
    B) режим DDR — данные принимаются по параллельной шине, данные тактируются удвоенной частотой.
    C) режим SERDES — данные принимаются по последовательной шине

    Упаковщик данных


    Этот узел используется в одноканальных и многоканальных схемах приема данных от АЦП. Основное его назначение – упаковать данные в удобный формат внутренней шины, используемый внутри ПЛИС. Разрядность внутренней шины определяется разработчиком или корпоративным стандартом. Типовые значения разрядности на выходе упаковщика – 32, 64, 128, 256, 512 бит данных. В некоторых случаях упаковщик не может быть сконфигурирован. Это зависит от количества входных каналов, разрядности входной и выходной шины данных упаковщика. Например, для четырехканального источника с разрядностью входных данных = 16 бит невозможно организовать перепаковщик с выходной шиной разрядностью менее WOUT = WIN * NCHAN = 16 * 4 = 64 бит. Для одноканального источника данных с той же разрядностью на входе и выходе данные будут последовательно упакованы пачками по 16 бит в разрядную сетки 64 бита. То есть первый отсчет АЦП займет битовое поле [15:0], второй отсчет – [31:16], третий – [47:32], а четвертый – [63:48]. Далее отсчеты циклически будут занимать битовые поля от младшего к старшему в выходной сетке данных. Другой пример. Используется 2 канала данных, разрядности на входе и выходе остаются те же самые – 16 и 64 бит соответственно. Если система сбора данных на удаленном устройстве включает только один канал, то упаковка происходит, как показано в примере выше, причем неважно, какой из каналов включен. Если система сбора включает оба канала, то данные упаковываются попарно от младшей части разрядной сетки к старшей. Первый отсчет первого канала займет позицию [15:0], первый отсчет второго канала займет позицию [31:16], второй отсчет первого канала – [47:32], второй отсчет второго канала – [63:48]. Как показала практика, это самый удобный вариант упаковки данных при многоканальной обработке, в случае отключения тех или иных каналов передачи. Замечание: количество каналов должно быть кратно степени двойки – 1, 2, 4, 8 и т.д. Может показаться, что этот узел – сложный в реализации и понимании, но после нескольких применений в своих проектах вы найдете для себя, что ничего сложного и необычного здесь нет.

    На следующем рисунке приведены временные диаграммы работы узла упаковщика данных в режиме: NCHAN = 1, WIN = 8, WOUT = 32.


    Красными линиями показан процесс упаковки данных на выходную шину, которая сопровождается сигналом разрешения DVAL = 1 после приёма 4 отсчетов данных.

    Синхронизатор потока данных


    Этот узел строится на базе примитивной схемы FIFO и имеет одно важное и простое назначение – преобразование потока данных с частоты дискретизации CLK_ADC на частоту обработки или частоту работы внутренней шины устройства SYS_CLK (системная тактовая частота). Для простоты можно создать узел FIFO в Xilinx Core Generator, но в идеале лучше написать свой модуль, который будет гибок в конфигурации на произвольную ширину шины (FIFO_WIDTH) и глубину памяти (FIFO_DEPTH). На следующем рисунке приведены временные диаграммы работы узла FIFO, показаны входные и выходные данные, а также флаги пустого (empty) и полного (full) FIFO. Следует отметить, что для нормальной работы FIFO АЦП флаг заполненности FULL должен быть всегда равен 0, что говорит о правильности принятия данных от АЦП и отсутствии переполнения. Если флаг FULL = 1, то скорость приема данных удаленным обработчиком недостаточна, либо скорость работы АЦП слишком велика для выбранной системы.


    На следующем рисунке изображено схематическое представление узла FIFO в среде Plan Ahead.


    Видно, что FIFO строится на базе двухпортовой памяти. На шины адреса памяти отправляются данные в коде Грея — на схеме это два узла для чтения и записи. Это позволяет снизить битовую ошибку на высоких частотах, т.к. соседние значения в коде Грея отличаются всего лишь одной битовой позицией. Логика флагов FIFO определяется значениями в модулях счетчика Грея, а для увеличения тактовой частоты узла на выходе используются регистры.

    Внутренняя шина


    Возникает вопрос — а куда дальше идут собранные и упакованные данные? Ответ прост: с помощью интерфейсов PCI / PCIe, USB, Ethernet, SRIO, SATA данные достигают конечной цели, где проходят последующую обработку и где осуществляется сбор всей информации. До этого звена внутри ПЛИС может находиться узел цифровой обработки сигналов (DSP), например — DDC, DUC, FFT / IFFT и т. д. Кроме того, данные могут буферизироваться на внешней памяти большого объема, типа DDR3 / DDR4. Это частый приём, который применяется для обработки большого потока информации на высоких скоростях. В данном случае внешняя память имитирует FIFO большого размера. Для соединения ПЛИС с внешней памятью применяются специальные контроллеры, которые, как правило, доступны и открыты для использования. В случае Xilinx они находятся в IP Core Generator.

    Помимо прочего, разработчику необходимо создать собственный конечный автомат управления всеми ресурсами приёмника АЦП: это конфигурация задержек в IODELAY, программирование синтезатора частоты MMCM, передача команд по SPI на АЦП и ЦАП модули, управление началом и концом сбора данных с АЦП, управление количеством активных каналов, использование внешней памяти DDR и многое другое. У всех это своя уникальная архитектура, но базовые принципы остаются одинаковыми. На фирме, в которой я работаю, используются узлы управления под названием "тетрады". Подробно о них рассказывал мой коллега здесь.

    Управление модулем АЦП


    Как правило, управление аналоговым модулем осуществляется через SPI-подобные интерфейсы. Реализовать SPI-интерфейс под силу любому студенту старшего курса, в программе которого есть изучение программируемой логики и ПЛИС. Заострять внимание на узле SPI я не буду. В конце статьи в качестве примера приведен исходный код управления удаленной микросхемой HI-6131, которая обрабатывает сообщения в формате MIL-STD-1553. Код не параметризируемый и заточен конкретно на выбранную микросхему. Для разминки вы можете написать свой узел SPI, который будет конфигурироваться на разные параметры. Временная диаграмма управления по SPI-интерфейсу имеет следующий вид:


    Исходный код


    Исходный код всех компонентов и узлов представлен на языке VHDL и предназначен для микросхем FPGA Xilinx 7 серии (и выше). Исходные коды открыты для использования и доступны по ссылке на гитхабе — см. здесь. Все компоненты по возможности сделаны гибкими в конфигурации и не требуют существенного вмешательства в исходный код (за исключением узла SPI — простите, было лень). К сожалению, невозможно подстроиться под все существующие решения, но данный пример успешно отработал для всех аналоговых модулей, с которыми я работал.

    Например, операции чтения и записи в FIFO, а также подключение узлов преобразования двоичного кода в код Грея выглядит следующим образом:

    FIFO R/W
    ---- Read data ----
    pr_rd: process(rd_clk) begin
      if (rising_edge(rd_clk)) then
        if (rd_en = '1' and xempty = '0') then
          data_o <= Mem(conv_integer(pNextWordToRead));
        end if;
      end if;
    end process;
            
    ---- Write data ----
    pr_wr: process (wr_clk) begin
      if (rising_edge(wr_clk)) then
        if (wr_en = '1' and xfull = '0') then
          Mem(conv_integer(pNextWordToWrite)) <= data_i;
        end if;
      end if;
    end process;
    
    ---- Gray counters ----
    xGray_WR : rtl_gray_count
      generic map ( COUNTER_WIDTH => ADDR_WIDTH )
      port map (
        cnt => pNextWordToWrite,
        ena => NextWriteAddressEn,
        rst => reset,
        clk => wr_clk
      );
       
    xGray_RD : rtl_gray_count
      generic map ( COUNTER_WIDTH => ADDR_WIDTH )	
      port map (
        cnt => pNextWordToRead,
        ena => NextReadAddressEn,
        rst => reset,
        clk => rd_clk
      );
    


    Список литературы


    • 7 Series FPGAs Overview (DS180) (xilinx.com)
    • Xilinx 7 Series Libraries Guide for Schematic Designs (xilinx.com)
    • 7 Series FPGAs SelectIO Resources User Guide (UG471) (xilinx.com)
    • 7 Series FPGAs Clocking Resources User Guide (UG472) (xilinx.com)
    • Serial LVDS High-Speed ADC Interface (xilinx.com)
    • Analog for Xilinx ® FPGAs Selection Guide (ti.com)
    • HSC-ADC-FPGA High Speed Deserialization (analog.com)
    • Interfacing Analog to Digital Converters to FPGAs (latticesemi.com)
    и т.д.

    Продолжение следует...
    Share post

    Similar posts

    Comments 19

      +3
      Полезная статья, пишите еще ;)
      Небольшие замечания.
      HR — это банки не с большим числом пинов, а с большим диапазоном поддерживаемых напряжений.
      Не вполне корректно говорить что в случае ISERDES данные принимаются по последовательной шине — шина вполне может быть параллельной, а ISERDES лишь обеспечивает больший коэффициент десериализации данных, что может быть полезно для большой частоты.
      И провокационный вопрос — не нашел в статье ничего про выравнивание данных, принимаемых от нескольких АЦП. А задача может быть не самой тривиальной за счет небольшой неопределенности в фазах входных клоков.
        0
        Спасибо за замечания, поправлюсь! :)
        Про ISERDES согласен, но на практике практически не встречал таких микросхем АЦП. В обратную сторону, т.е. ЦАП — сплошь и рядом такое, а с АЦП либо параллельная шина LVDS, вписывающаяся в частоту обработки ПЛИС, либо сразу JESD204B.

        Все верно. На этот вопрос в рамках статьи я решил не отвечать, но в списке литературы сделал отсылку к документу, с которого можно начинать копать. :)

        Самое примитивное решение — запитать все АЦП одним источником тактовой частоты и попытаться использовать один клок АЦП на глобальном буфере, а не N штук на региональных. Для многоканальных АЦП с частотами дискретизации до 500МГц это спасало.
          0
          «запитать все АЦП одним источником тактовой частоты» не всегда работает, потому как:
          1. PLL на которой происходит умножение частоты для АЦП или самого сериалайзера может умножать частоту со случайной фазой на выходе(20 вариантов фазы при умножении частоты на 20), и соответственно задержка при формировании serial данных.
          2. Немного различающаяся длина линий связи, может привести к сдвигу на несколько serial отсчетов(bit clock)
          3. Обратная первому варианту картина, восстановление параллельных данных в FPGA со «случайной» фазой низкочастотного клока. Данные с разных каналов могут восстановиться с разницей в задержке в 1 такт.

            0
            Тактировать многоканальные системы АЦП нужно только от опорного низкоджиттерного генератора в виде отдельной микросхемы типа Si571, пропустив его выходной клок через клоковый низкоджиттерный размножитель, соответствующий числу каналов АЦП. Только в таком варианте мы получим когерентную систему на приемной стороне ПЛИС. Но опять таки есть нюанс, данная система будет корректно работать: 1 в случае точного выравнивания линий данных и клоков каналов АЦП на PCB. 2 если сами АЦП не имеют интегрированного делителя частоты с неизвестной задержкой, т.е. Если эти условия выполняются, то входные данные можно принять в ПЛИС на глобальной частоте от одного из каналов, в этом случае получим полную синфазность между каналами.
              0
              Все верно. Мы на своих аналоговых модулях используем генераторы Si570/571, после которых ставится разветвитель. Для 8/16-канальных схем это успешно работает и система запитывается одним когерентным источником тактовой. А в системах, где используется делитель внутри АЦП — все нетривиально, необходимо извращаться уже непосредственно в ПЛИС. К счастью, с такими микросхемами АЦП практически не работаем.
        0
        Очень интересная статья!
        Есть вопросы: тактирование АЦП от встроенных DCM (MMCM) при частотах 40 — 200 МГц не смертельно?
        И есть ли особенности использования АЦП-ПЛИС при оцифровки периодических(преимущественно) сигналов и редких высокоскоростных импульсов (сигнал детекторов нейтронов, альфа-частицы, гамма и т.д.)?
          0
          Да, для частот 40-200МГц можно тактироваться внутренним MMCM. Но нужно понимать, что для MMCM тоже нужен источник частоты, пусть и не привязанный к аналоговому модулю. Я с такими устройствами работал. Но практика показывает, что чем проще способ тактирования данных, тем лучше. То есть это способ без использования MMCM. До узла пересинхронизации FIFO частота идет напрямую с аналогового модуля, проходит BUFG/BUFIO и в таком виде тактирует синхронные элементы схемы.

          С высокоскоростными импульсами такого типа не сталкивался, но мне думается, что здесь необходимо иметь высокую разрешающую способность, то есть хорошие аналоговые характеристики узлов АЦП, а со стороны цифровой части — наличие накопителя данных большого объема, в который помещается принимаемый сигнал. А вообще для цифрового устройства совсем нет разницы, какой формы сигнал обрабатывать, если аналоговое устройство способно этот сигнал обнаружить и задетектировать.
            0
            Тактировать АЦП от FPGA категорически не рекомендуется, если вы хотите получить качественный сигнал — слишком велики всякие наводки и джиттер. Да, для килогерцовых частот можно закрыть на это глаза, но для частот в десятки, а тем более сотни мегагерц ничего хорошего не выйдет. Лучше подаватьна АЦП внешний клок, порождаемый на специально предназначенных для этого компонентах (малошумящий генератор, клоковые буферы/мультиплексоры и т.п.). Параллельно его же можно завести на FPGA (на всякий случай).
              0
              Согласен во всём. Недавно проверял проект, где нужно было тактировать АЦП сигналом, прошедшим именно MMCM. На входе MMCM — 60МГц, на выходе 120МГц. И эта частота идет на АЦП. Хорошего мало, но работает, благо каналов всего АЦП всего два.
            0
            Я не совсем понимаю смысл аналоговой задержки на каждой линии. Внутри кристалла разбежки будут по приему не больше 100 пс (если больше, то где-то ошиблись с банками при разводке платы), на плате разбежки тоже будут, но очень маленькие (линии же выравнены). +скорее всего с АЦП приходит фреймовый клок. У альтеры в PLL есть режим LVDS, когда выходной фреймовый клок сдвигается относительно входного на дельту задержки данных, а битовый клок фронтом встает на середину данных (как на картинке АЦП) и SERDES работает «почти» правильно.
            С JESD204B гораздо меньше мороки в этом плане, но схемотехника плат сложнее.
              0
              Смысл такой, что если АЦП работает в широком диапазоне частот дискретизации (от 10МГц до 500МГц, например), то на некоторых участках значения тактовой частоты начинаются искажения сигнала данных (совпадают фронты, к примеру). Для этого на помощь приходят IODELAY группы и именно они позволяют работать в широком диапазоне тактовых частот.

              Да, в JESD204B все иначе, но там и другие особенности, начиная от интерфейса передачи, заканчивая схемой подключения в ПЛИС и способами синхронизации и управления сигналом запуска многоканальных схем. Если тема JESD204B будет интересна, мог бы написать об этом в следующей статье.
                0
                Внутри ПЛИС задержка на тактовых линиях от PIN до BUFG может составлять от десятков Пс до единиц Нс, в зависимости от удаления PINа от глобальных буферов. Задержка на BUFR и BUFIO естественно минимальна, но тогда мы ограничены тактовым регионом, и засинхронизировать одним BUFR все каналы АЦП, разведенные в другой клок регион, не получится. По этому для получения синфазных многоканальных систем АЦП на базе ПЛИС, проще использовать один глобальный клок от одного из каналов, компенсировав его задержку PIN-BUFG с помощью IODELAY.
                  0
                  тогда мы ограничены тактовым регионом

                  Не совсем так, у Xilinx BUFR работает на текущий и на 2 прилегающих тактовых региона. Этого должно на многое хватить. Проще всего использовать, как раз, связку BUFIO-BUFR, когда это возможно. Самое главное потом перейти с домена BUFR в домен BUFG, потому что в общем случае они получаются асинхронными.
                    0
                    В зависимости от семейства, у xilinx Virtex 5 если я не ошибаюсь нет переходов к соседним клок регионам. Эта возможность появилась с Virtex 6. И на сколько я помню, соединить можно только один прилегающий. Но даже если есть возможность соединить один и два прилегающих, то для канальности АЦП 4 и более, этот вариант не всегда подходит. Я в своей практике не наблюдал, чтобы схемотехнически к примеру 4 канала АЦП были разведены на 4 неразрывных клок региона.

                    При переходе с BUFR на BUFG начинается самое интересное. С использовании данной архитектуры в моей практике, зачастую наблюдается расфазировка каналов друг, относительно друга. Самое интересное, что прием данных непосредственно с индивидуального канала АЦП проходит корректно во всем диапазоне, и мало того довольно продолжительное время каналы могут работать синфазно, но при нагреве кристалла ПЛИС или других факторов, фаза все таки смещается, что в большинстве задач не допустимо.
                0
                Спасибо за статью! Давно хочу приобщиться к SDR Radio. Но фирменные платы ПЛИС и модулей АЦП/ЦАП к ним для многих недоступны по цене. Развести и собрать самому плату с АЦП — тоже трудно. Микросхему нужно правильно «обвзязать», запитать. На ebay/ali не так много плат. И как только одна из них упала ниже моего личного психологического уровня (ниже 1500 рублей), то я ее сразу заказал. И уже получил.

                High-speed AD9708 AD9280 AD / DA Module FPGA Development Board Black Gold
                image

                Там всего 8 бит. Но для начала, считаю, что не плохо.
                  0
                  Интересная плата. И её для начала будет достаточно, освоить базовые вещи — самое то. К сожалению, микросхемы АЦП и ЦАП не управляются программно, так что с этим здесь не поиграться. а как показывает опыт — сложнее научиться управлять схемой и правильно менять параметры модуля в динамическом режиме, чем, например, обеспечить одинаковую фазу для многоканальных систем (о чем писалось выше в комментариях).
                    0
                    А схема для неё есть или обсуждение некитайскоязычное? Китаец только кратенькое описание прислал, хорошо хоть с распиновкой.
                      0
                      У меня только распиновка. В режиме ЦАП я ее уже попробовал, все работает.
                      Скрытый текст
                        0
                        Да я тоже саму на себя уже проверил, правда на 10 Ms/s всего. Хотелось сходу увидеть где какое сопротивление висит и какая защита есть, чтоб не дорожки высматривать.

                  Only users with full accounts can post comments. Log in, please.