[Из песочницы] Интерфейс ADM – что такое «Тетрада»
Базовый вариант интерфейса ADM на основе ПЛИС Altera получил название «Интерфейс ADM. Классическая реализация». Его особенностью является наличие в ПЛИС блока из шестнадцати регистров. Часть регистров обслуживала FIFO, часть регистров отводилась на обслуживание субмодуля. С ростом сложности изделий шестнадцати регистров стало недостаточно для организации управления. Ситуация осложняется тем, что на многих базовых модулях к ПЛИС подключены только пять или шесть адресных линий, на большее просто не хватает ножек. В такой ситуации логичным решением является организация косвенной адресации, но при этом требуется оставить быстрый доступ к регистрам FIFO. В результате появилась новая реализация, которая получила название «Интерфейс АDM. Прогрессивная реализация».
Логическая реализация
Основным элементом является тетрада. Тетрада это логический объект, который имеет четыре прямо адресуемых регистра и 1024 косвенно адресуемых регистра.
Логическая организация тетрады представлена на рисунке:
Прямые регистры:
- 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
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
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.
В заключение хотелось бы отметить что тетрады оказались очень удобными для модульного построения прошивок ПЛИС и модульного построения программного обеспечения. Концепция тетрад активно используется более 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 как на ваших примерах).