[Из песочницы] Интерфейс ADM – что такое «Тетрада»

Интерфейс 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 — командные регистры, адреса от 0×000 до 0×0FF
  • Группа 2 — константы, адреса от 0×100 до 0×1FF
  • Группа 3 — непосредственные регистры, адреса от 0×200 до 0×3FF

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

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

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

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

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

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

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

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


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

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

Во всех случаях тактовая частоты шины до 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, ссылку на документ дать не могу.

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

  • 3 сентября 2016 в 21:35

    0

    Данная статься статья именно об этом.
    • 3 сентября 2016 в 21:44

      0

      Спасибо. Исправил.
  • 4 сентября 2016 в 00:34

    0

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

      0

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

    0

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

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

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

    • 4 сентября 2016 в 01:22

      0

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

        0

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

© Habrahabr.ru