Интерфейс ADM это внутренний стандарт компании «Инструментальные Системы». Он определяет правила соединения субмодулей ADM и базовых модулей. Ключевым элементом интерфейса является ПЛИС ADM. Изначально использовались ПЛИС серий FLEX10K и Acex 1K фирмы Altera. В 2003 году начался переход на ПЛИС Xilinx. Используются практически все серии ПЛИС от Spartan 2E до Kintex Ultrascale. Базовым элементом проекта ПЛИС является «тетрада». Данная статья именно об этом.

Базовый вариант интерфейса ADM на основе ПЛИС Altera получил название «Интерфейс ADM. Классическая реализация». Его особенностью является наличие в ПЛИС блока из шестнадцати регистров. Часть регистров обслуживала FIFO, часть регистров отводилась на обслуживание субмодуля. С ростом сложности изделий шестнадцати регистров стало недостаточно для организации управления. Ситуация осложняется тем, что на многих базовых модулях к ПЛИС подключены только пять или шесть адресных линий, на большее просто не хватает ножек. В такой ситуации логичным решением является организация косвенной адресации, но при этом требуется оставить быстрый доступ к регистрам FIFO. В результате появилась новая реализация, которая получила название «Интерфейс АDM. Прогрессивная реализация».

Логическая реализация


Основным элементом является тетрада. Тетрада это логический объект, который имеет четыре прямо адресуемых регистра и 1024 косвенно адресуемых регистра.

Логическая организация тетрады представлена на рисунке:
image

Прямые регистры:

  • STATUS – регистр состояния FIFO, содержит флаги FIFO
  • DATA – регистр данных FIFO
  • IND_ADR – регистр косвенного адреса
  • IND_DATA – регистр косвенных данных

Косвенно адресуемые регистры разделены на три группы.

  • Группа 1 – командные регистры, адреса от 0x000 до 0x0FF
  • Группа 2 – константы, адреса от 0x100 до 0x1FF
  • Группа 3 – непосредственные регистры, адреса от 0x200 до 0x3FF

Главной особенностью командных регистров является то, что они могут изменить свое состояние либо в процессе сброса, либо в процессе записи в регистр. Это позволяет использовать для чтения из регистров теневое ОЗУ. А использование теневого ОЗУ позволяет резко сократить ресурсы ПЛИС для организации обратного чтения из регистров. Из-за теневого ОЗУ пришлось ввести определённую процедуру сброса тетрады, требуется сформировать сигнал сброса и прописать во все командные регистры значение 0.

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

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

В настоящее время для организации теневого ОЗУ всех тетрад используется только один блок памяти ПЛИС. Это позволяет организовать в каждой тетраде 32 командных регистра и 32 константы. В любой момент это количество можно увеличить, но пока этого не потребовалось.

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

Для примера приведён состав тетрад для прошивки модуля FMC107P и субмодуля FM216x250MDA

  • TRD_MAIN — управление общими ресурсами
  • BPI_FLASH — доступ к загрузочной FLASH
  • TRD_DDS9956 — управление синтезатором
  • PIOX_STD — управление цифровым портом
  • TRD_FM216x250MDA_ADC — управление АЦП на субмодуле
  • TRD_DDR3x — управление памятью DDR
  • TRD_FM216x250MDA_DAC — управление ЦАП на субмодуле

Реализация на VHDL


Проект ПЛИС написан на языке VHDL. Для подключения тетрады используются специальные типы данных, что резко уменьшает объём текста. В настоящее время существует три типа подключения. В первую очередь они отличаются шириной шины данных, а во вторую – типом сигналов подключения.

Тип 1 – ширина шины данных 64 бита. Используются с сигнальными процессорами и интерфейсом PCI Express v1.1 x8
Тип 2 – ширина шины данных 128 бит. Используются с интерфейсом PCI Express v2.0 x8
Тип 3 – ширина шины данных 512 бит. Используется с интерфейсом PCI Express v3.0 x16

Во всех случаях тактовая частоты шины до 266 МГц. Если не требуется максимальное быстродействие, то рекомендуется снижать тактовую частоту для облегчения трассировки ПЛИС.

Базовым типом данных является тип bl_cmd

Тип bl_cmd
type bl_cmd is record
	data_we			: std_logic; 	-- 1 - запись в регистр DATA
	cmd_data_we		: std_logic;	-- 1 - запись в регистр CMD_DATA
	status_cs		        : std_logic;	-- 0 - чтение из регистра STATUS
	data_cs			: std_logic;	-- 0 - чтение из регистра DATA
	cmd_data_cs	        : std_logic;	-- 0 - чтение из регистра CMD_DATA
	cmd_adr_we	        : std_logic;  	-- 1 - запись в регистр косвенного адреса
	adr	                        : std_logic_vector( 9 downto 0 ); -- косвенный адрес
	data_oe			: std_logic;	-- 0 - разрешение выхода регистра DATA
	
end record;


Существует отдельный тип для описания сигнала запроса DMA

Тип bl_drq
type bl_drq is record
	en				: std_logic;	-- 1 - разрешение запроса DMA
	req				: std_logic;  	-- 1 - запрос на выполнение цикла DMA
	ack				: std_logic;	-- 1 - выполнение цикла DMA
end record;	


Описание тетрады типа 1 выглядит так:

component trd_user1 is
port ( 
-- GLOBAL
reset		: in std_logic; -- 0 - сброс
clk		: in std_logic;	-- тактовая частота

cmd_data_in	: in std_logic_vector( 15 downto 0 ); -- шина данных для CMD_DATA
cmd		: in bl_cmd; 		-- команда для терады
		
data_out	: out std_logic_vector( 63 downto 0 );	-- выход DATA
cmd_data_out : out std_logic_vector( 15 downto 0 );	-- выход регистров
bx_irq		: out std_logic;  	-- 1 - прерывание от тетрады
bx_drq		: out bl_drq;		-- управление DMA

….  (остальные сигналы не показаны)
end component;

За исключением сигналов тактовой частоты и сброса используется шесть сигналов.
Для тетрады типа 2 число сигналов уменьшилось до двух.

component trd_user2 is
port ( 
-- GLOBAL
reset		: in std_logic; -- 0 - сброс
clk		: in std_logic;	-- тактовая частота

host2trd	: in type_host2trd;	-- данные для тетрады
trd2host	: out type_trd2host	-- данные от тетрады
….  (остальные сигналы не показаны)
end component;

Определения типов
type type_trd2host is record
	status			: std_logic_vector( 15 downto 0 );	--! регистр STATUS
	cmd_data		: std_logic_vector( 15 downto 0 );	--! данные регистров
	data			: std_logic_vector( 127 downto 0 );	--! данные регистра DATA 
	drq				: bl_drq;		--! запрос DMA
	irq				: std_logic;	--! запрос прерывания
	fifo_rstp		: std_logic;	--! 1 - сброс FIFO 
end record;


type type_host2trd is record
	cmd				: bl_cmd;	--! команда для тетрады 
	cmd_data		: std_logic_vector( 15 downto 0 );		-- шина для записи в регистры 
	data			: std_logic_vector( 127 downto 0 );		-- шина 128 разрядов для записи в регистр DATA 
end record;


С ростом объёма ПЛИС увеличиваются трудности при размещении компонентов тетрад внутри ПЛИС. Это связано с высокой тактовой частотой и большой длиной соединений.

При этом высокая тактовая частота нужна только для передачи данных. Для обращения к регистрам достаточно 100 МГц. Типы подключения 1 и 2 используют только один сигнал тактовой частоты. Для типа 3 используется две тактовые частоты и дополнительный компонент repack. Компонент repack установлен между тетрадой и узлом подключения к шине. Он имеет параметр STAGE, который определяет количество дополнительных триггеров в шине данных. Кроме того, возможна реализация нескольких модификаций для подключения тетрад типа 1 и 2. На рисунке представлена конфигурация в которой через компонент REPACK_128 подключена тетрада типа 2 и через компонент REPACK_512 подключена тетрада типа 3, при этом используется параметр STAGE=4 который позволяет установить тетраду в любом месте ПЛИС Virtex 7.

image
В заключение хотелось бы отметить что тетрады оказались очень удобными для модульного построения прошивок ПЛИС и модульного построения программного обеспечения. Концепция тетрад активно используется более 12 лет. Тетрады пережили рост ПЛИС и изменение серий от Spartan 2E до Virtex 7 и внедряются в серию Ultrascale. Скорость ввода поднялась от 200 Мбайт/с до 11 Гбайт/с. Поддержано большое количество субмодулей. Произошёл переход от внутрифирменного стандарта ADM к международному стандарту FMC.

Более подробное описание тетрад приведено в документе: «DCR0340 – Интерфейс ADM. Прогрессивная реализация». В соответствии с правилами Habrahabr, ссылку на документ дать не могу.
Поделиться с друзьями
-->

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


  1. zeezdev
    03.09.2016 21:35

    Данная статься статья именно об этом.


    1. dsmv2014
      03.09.2016 21:44

      Спасибо. Исправил.


  1. nerudo
    04.09.2016 00:34

    А не было нюансов с синтезом структур разными компиляторами? Все-таки спектр весьма широк, от максплюса 15-летней давности, как я понимаю, и до вивады.


    1. dsmv2014
      04.09.2016 01:11

      Максплюс не используется. Тетрады появились в процессе перехода на Xilinx. ISE и Vivado работаютс нормально, хотя нюансы всегда есть.


  1. old_bear
    04.09.2016 01:14

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

    Можно заменить мультиплексор последовательным выводом. Если у вас PCIe, то ± несколько десятков байт от остальных прочитанных регистров роли не сыграют.

    P.S. Я правильно понял, что вся эта идея с тетрадами появилась как метод обхода ограничения на разрядность адреса? Если да, то возможно имеет смысл это как-то отразить в заголовке статьи или в первом абзаце. Иначе возникает некоторое недоумение о цели статьи как таковой.


    1. dsmv2014
      04.09.2016 01:22

      Кроме PCI Express есть ещё ряд модулей с параллельными шинами. Теневое ОЗУ кардинально решило проблему.


      1. old_bear
        04.09.2016 02:27

        С ОЗУ понятно — нет смысла держать в рассыпухе те регистры, у которых значения меняются только при явной записи. Но я про ваши «непосредственные» регистры речь веду.
        Чтобы избежать ограничения на частоту, можно заменить мультиплексирование на защёлкивание в цепочку сдвиговых регистров (на FF-ах) с последующим последовательным сдвигом в выходную шину. Этот метод заодно решит вопрос разных частот для внутренностей и вывода, а также с высокой вероятностью избавит от необходимости добавлять регистры на шину (за вычетом самого сдвигового регистра, но от только один нужен, а не 2-4 как на ваших примерах).


        1. dsmv2014
          04.09.2016 12:24

          Регистры можно объединить в цепочку, но это усложняет проект. На данный момент проблемы в этом месте нет. Обычно используется около 20 регистров в группе командных и 4-8 регистров в группе непосредственных.


  1. Khort
    04.09.2016 18:34

    Интерфейс ADM — кем то используется, кроме авторов? Что означает аббревиатура ADM?
    И если это популярный интерфейс, то в чем его преимущества перед, скажем, amba axi?


    1. dernuss
      04.09.2016 19:36
      +1

      Приходиться пользоваться.
      Ведь они продают свои модули и ПО к ним. Переписать ПО довольно сложная задача.
      Хотя я не стал пользоваться их проектом и написал всё с нуля для модуля SyncDAC.


      1. dsmv2014
        05.09.2016 11:39

        А если не секрет, что не понравилось в нашем проекте?


        1. dernuss
          05.09.2016 12:11

          Если конкретно по syncdac, то у меня было почти всё написано до получения вашего проекта, так как схема была доступна ранее. К тому же из комплекта поставки ПО не собиралось в msvc, не хватало каких то файлов.
          По другим модулям, я занимался ими мало. Соотвественно добавлял только свой код.
          А вообще не нравится зависимость от барди (или как то так, забыл уже).
          Давно уже не занимаюсь вашими модулями.


    1. dsmv2014
      04.09.2016 20:02
      +1

      Насколько я знаю, больше никто не использует. Хотя однажды меня спрашивали про клон нашего модуля на TigerShack. Кажется его делала фирма из Питера. Название ADM — Analog Digital Module. Преимущества перед axi есть. Во первых он появился до массового распространения axi. Во вторых он гораздо компактней, конечно это следствие того что он не является универсальным.


      1. Khort
        04.09.2016 21:12

        Кажется, я должен извиниться: модули — Вы ведь имели ввиду процессорные модули, не RTL-IP ядра? А ADM — внешний интерфейс, а не для SoC? В таком случае, сравнивать надо не с AXI (это просто не корректно), а с VME — стандартом де-факто для промышленных систем конца прошлого века.
        Спасибо, было любопытно услышать про новый интерфейс.


        1. dsmv2014
          04.09.2016 22:06

          Понятие «Интерфейс ADM» объединяет несколько сущностей:

          1. Форм фактор субмодуля и разъём. Предложен в 1996 году, с некоторыми изменениями существует до сих пор
          2. Структура базового модуля. В первом варианте, который называется «Интерфейс ADM, Классическая реализация» использовалось внешнее FIFO и ПЛИС Altera. Во втором варианте, который называется «Интерфейс ADM. Прогрессивная реализация» используется только ПЛИС Xilinx без внешнего FIFO. Именно во втором варианте используются тетрады.
          3. Структура ПЛИС. Тетрады находятся внутри
          4. Организация ПО. И здесь очень много завязано на тетрады

          Сейчас мы выпускаем модули в форм-факторе FMC, но организация ПЛИС осталась прежней. Там так же используются тетрады.
          Так что сравнивать с AXI можно. В данный момент я занимаюсь тем, что подключаю тетрады к Zynq, как раз через AXI.
          P.S. базовые модули для шины VME у нас тоже есть.


  1. andi123
    05.09.2016 13:59

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


    1. dsmv2014
      05.09.2016 14:53

      У меня есть несколько OpenSource проектов, в частности DS_DMA. Ссылка в на сайт моём профиле. Там можно посмотреть как используются тетрады в реальном проекте. Программы можно посмотреть на GitHub: https://github.com/andorok/DaqTools_Tutorial