Разработка модели ПЛИС типа ППВМ с одноуровневой структурой межсоединений в системе визуально-имитационного моделирования MATLAB/Simulink

№ 12’2011
PDF версия

Успехи в области создания академических ПЛИС и программных инструментов оказали существенное влияние на развитие архитектур индустриальных ПЛИС.

В академических ПЛИС для обеспечения программируемой коммутации существует две технологии соединений: multi-driver и single-driver. В настоящее время преимущество отдается технологии single-driver, так как ее использование позволяет получать существенный выигрыш по сравнению с технологией multi-driver как по быстродействию, так и по площади кристалла.

На рис. 1 показаны основные функциональные блоки ПЛИС — логический блок (ЛБ), два соединительных блока C1 и C2, маршрутизатор (S) — с одноуровневой структурой межсоединений и принцип коммутации пар разнонаправленных межсоединений по технологии single-driver. Соединительные блоки подключают входы/выходы логического блока к горизонтальному и вертикальному трассировочному каналу. Маршрутизатор осуществляет коммутацию сигналов (межсоединений) в трассировочных каналах. Также показан наиболее распространенный способ коммутации сигналов с помощью мультиплексоров и принцип сегментации межсоединений. Подобный принцип сегментации single, Double, HEX-3, HEX-6 используется в ПЛИС серии Virtex II компании Xilinx, которые классифицируются как ПЛИС с одноуровневой структурой межсоединений. Межсоединение, по которому сигнал распространяется только в одну сторону, получило название «однонаправленное».

 а) Основные функциональные блоки ПЛИС  б) коммутация двух пар разнонаправленных межсоединений в) принцип коммутации;  г) принцип сегментации межсоединений

Рис. 1. а) Основные функциональные блоки ПЛИС с одноуровневой структурой межсоединений; б) коммутация двух пар разнонаправленных межсоединений в горизонтальном и вертикальном направлениях; в) принцип коммутации разнонаправленных межсоединений с использованием мультиплексоров; г) принцип сегментации межсоединений (через один ЛБ, через два ЛБ, через три ЛБ, через шесть ЛБ)

В качестве учебных целей разработаем модель ПЛИС типа ППВМ с одноуровневой структурой межсоединений и с использованием технологии соединений single-driver в системе MATLAB/Simulink и покажем, как можно в автоматическом режиме получить код высокоуровневого языка описания аппаратных средств (VHDL). Полученный код может быть использован для разработки функциональной модели проектируемой ПЛИС, например в САПР Quartus II. Более подробно об архитектуре академических ПЛИС можно узнать в работах [13].

Модель ПЛИС реализована в формате с фиксированной запятой (точкой), с использованием fi-объектов системы MATLAB/Simulink. Simulink — графическая среда визуально-имитационного моделирования аналоговых и дискретных систем, которая предоставляет пользователю графический интерфейс для конструирования моделей из стандартных функциональных блоков. Simulink работает с линейными, нелинейными, непрерывными, дискретными и многомерными системами. Система MATLAB/Simulink содержит встроенный генератор кода языка описания аппаратных средств HDL (Simulink HDL Coder). Simulink HDL Coder — программный продукт для генерации VHDL-кода без привязки к конкретной архитектуре ПЛИС и платформе по Simulink-моделям. Используем следующий формат для представления десятичных чисел:

a = fi (v, s, w, f),

где v — десятичное число; s — знак (0 (false) для чисел без знака и 1 (true) — для чисел со знаком); w — размер слова в битах (целая часть числа); f — дробная часть числа в битах. Примеры использования формата с фиксированной точкой при проектировании КИХ-фильтров можно найти в работе [4].

Формат a = fi (v, s, w, f, fimath) позволяет задать режим округления (Roundmode): floor — округление вниз; реакцию на переполнение (OverflowMode): wrap — перенос. При выходе значения v из допустимого диапазона «лишние» старшие разряды игнорируются. При выполнении операций умножения (‘ProductMode’) и сложения (‘SumMode’), для повышения точности вычислений (precision) используется машинное слово шириной в 32 бита.

% HDL specific fimath
hdl_fm = fimath(ѕ
‘RoundMode’, ‘floor’, ѕ
‘OverflowMode’, ‘wrap’, ѕ
‘ProductMode’, ‘FullPrecision’, ‘ProductWordLength’, 32, ѕ
‘SumMode’, ‘FullPrecision’, ‘SumWordLength’, 32, ѕ
‘CastBeforeSum’, true);

Массив ПЛИС разобьем на «плитки». «Плитка» — минимальная структурная единица. В плитку (верхняя левая в массиве плиток) включают ЛБ, два соединительных блока, маршрутизатор (рис. 2). На рис. 3 показан принцип коммутации межсоединений в разрабатываемой модели. L2-маршрутизатор обеспечивает длину сегмента межсоединения в два ЛБ.

 «Плитка» ПЛИС типа ППВМ с одноуровневой структурой межсоединений

Рис. 2. «Плитка» ПЛИС типа ППВМ с одноуровневой структурой межсоединений

 L2-маршрутизатор, коммутирующий две пары разнонаправленных межсоединений в горизонтальном и вертикальном направлениях

Рис. 3. L2-маршрутизатор, коммутирующий две пары разнонаправленных межсоединений в горизонтальном и вертикальном направлениях, обеспечивая длину сегмента в два логических блока (длинная линия L = 2)

По четырем сторонам маршрутизатора располагаются многовходовые мультиплексоры, в которых сегментируется только лишь одна из двух пар разнонаправленных межсоединений в горизонтальных и вертикальных направлениях. Несегментируемая пара разнонаправленных межсоединений перекручивается «косичкой» с сегментируемой парой за пределами плитки (рис. 3).

Тестирование плитки на выполнение булевой функции 4И-НЕ в системе MATLAB/Simulink показано на рис. 4. На рис. 5 представлен нижний уровень иерархии. Для конфигурирования плитки необходимо 40 бит памяти. Конфигурационная карта памяти одной плитки ПЛИС показана в таблице 1. В таблице 2 приведен тест на выполнение булевой функции 4И-НЕ. На адресные входы мультиплексора 16 в 1 (LUT-таблица) подается комбинация из четырех логических единиц 1111, а на информационные входы подключаются 16 ячеек памяти с содержимым, отражающим принцип работы логического элемента 4И-НЕ (таблица истинности), при этом на выходе логического блока ожидаем «лог. 0». Остальные 24 ячейки памяти необходимы для программируемой коммутации.

 «Плитка» в системе MATLAB/Simulink. Верхний уровень иерархии

Рис. 4. «Плитка» в системе MATLAB/Simulink. Верхний уровень иерархии

 Нижний уровень иерархии «плитки»

Рис. 5. Нижний уровень иерархии «плитки». Массив конфигурационной памяти (40 бит), логический блок с соединительными блоками, маршрутизатор

Таблица 1. Конфигурационная карта памяти одной плитки ПЛИС

Функциональный блок Конфигурационные биты
(ячейки памяти)
Примечание
Логический блок
LUT-таблица SR1–SR4; SR5–SR8; SR9–SR12; SR13–SR16 In_0, In_1, In_2_l, In_3_t
Выходной мультиплексор 2 в 1 SR17 SR17 = 1 — регистерный выход; SR17 = 0 — комбинаторный выход
Соединительный блок С2
Crossbar (подключает выход ЛБ и МС L_1, R_0, L_3, R_2 к трассировочному каналу или ко входам In_3_lut_t, In_3_lut_b ЛБ)
Демультиплексор 1 в 4 (SR_demux) SR18-19 Выход ЛБ подключается к одному из МС R_1, L_0, R_3, L_2
SR_En_demux SR20 Разрешение подключения выхода ЛБ к одному из МС R_1, L_0, R_3, L_2
Мультиплексоры
Мультиплексор 4 в 1 (верхний) SR21–22 (SR_mux_t) Подключает одно из МС L_1, R_0, L_3, R_2 ко входу In_3_t ЛБ
Мультиплексор 4 в 1 (нижний) SR23–24 (SR_mux_b) Подключает одно из МС L_1, R_0, L_3, R_2 ко входу In_3_b ЛБ
Маршрутизатор, S-блок
Мультиплексор 5 в 1 (левый) SR29, 30, 31 Подключает одно из МС R_2, B_0, B_1, T_2, B_3 к МС L_2
Мультиплексор 5 в 1 (нижний) SR32, 33, 34 Подключает одно из МС T_2, L_1, L_0, L_3 к МС B_2
Мультиплексор 5 в 1 (правый) SR35, 36, 37 Подключает одно из МС L_3, B_0, B_1, T_2, B_3 к МС R_3
Мультиплексор 5 в 1 (верхний) SR38, 39, 40 Подключает одно из МС B_3, L_1, L_0, L_3, R_2 к МС Т_3
Соединительный блок С1
Мультиплексор 4 в 1 (левый) SR25–26 Подключает одно из МС T_0, B_1, T_2, B_3 ко входу in_2_lut_L
Мультиплексор 4 в 1 (правый) SR27–28 Подключает одно из МС T_0, B_1, T_2, B_3 ко входу in_2_lut_R

Примечание. МС — межсоединение.

Таблица 2. Тест на выполнение булевой функции 4И-НЕ

Функциональный блок Конфигурационные биты (ячейки памяти) Примечание
Логический блок
LUT-таблица SR1–SR4 = 1; SR5–SR8 = 1;
SR9–SR12 = 1; SR13–SR15 = 1; SR16 = 0
При In_0=1, In_1=1, In_2_l=1, In_3_t=1 на выходе le_out ожидаем лог. 0
Доступ к In_2_l обеспечивается со входа T_2
Доступ к In_3_t обеспечивается со входа L_1
Выходной мультиплексор 2 в 1 SR17 SR17 = 1 — регистерный выход
SR17 = 0 — комбинаторный выход
Соединительный блок С2
Демультиплексор 1 в 4 (SR_demux) SR18–SR19 Выход ЛБ подключаем к межсоединению R_3, при этом L_3 = 0; SR19 = 1; SR18 = 0
SR_En_demux SR20 Разрешение подключения выхода ЛБ к МС R_1, L_0, R_3, L_2 (SR20 = 1)
Мультиплексор 4 в 1 (верхний) SR21–22 (SR_mux_t) Подключает МС L_1 ко входу In_3_t ЛБ (SR22 = 0 и SR21 = 0)
Мультиплексор 4 в 1 (нижний) SR23–24 (SR_mux_b) Подключает МС L_1 ко входу In_3_b ЛБ (SR24 = 0 и SR23 = 0)
Маршрутизатор, S-блок
Мультиплексор 5 в 1 (левый) SR29, 30, 31 Подключает МС R_2 к МС L_2 (SR29, 30, 31 = 0)
Мультиплексор 5 в 1 (нижний) SR32, 33, 34 Подключает МС T_2 к МС B_2 (SR32, 33, 34 = 0)
Мультиплексор 5 в 1 (правый) SR35, 36, 37 Подключает МС L_3 к МС R_3 (SR35, 36, 37 = 0)
Мультиплексор 5 в 1 (верхний) SR38, 39, 40 Подключает МС B_3 к МС Т_3 (SR38, 39, 40 = 0)
Соединительный блок С1
Мультиплексор 4 в 1 (левый) SR25–26 Подключает МС T_2 ко входу in_2_lut_L (SR26 = 1 и SR25 = 0)
Мультиплексор 4 в 1 (правый) SR27–28 Подключает МС T_2 ко входу in_2_lut_R (SR28 = 1 и SR27 = 0)

На рис. 6 показан фрагмент массива конфигурационной памяти плитки. Конфигурационные биты задаются как константы типа double и сохраняются в блоках памяти. Для автоматической генерации кода языка VHDL необходимо осуществить конвертацию типа double в тип ufix (пример 1). На рис. 7 показан логический блок и два соединительных блока C1 и С2. Адресные шины мультиплексоров соединительных блоков и LUT-таблицы организуются с помощью функции объединения битов bitconcat (пример 2).

 Фрагмент массива конфигурационной памяти

Рис. 6. Фрагмент массива конфигурационной памяти

 Логический блок и два соединительных блока C1 и С2

Рис. 7. Логический блок и два соединительных блока C1 и С2

На рис. 8 показан логический блок плитки, который состоит из LUT-таблицы (мультиплексора 16 в 1), элемента памяти (триггера) и мультиплексора 2 в 1. На рис. 9 приведен соединительный блок С2, который осуществляет подключение выхода ЛБ к одному из межсоединений горизонтального трассировочного канала и подключение одного из межсоединений канала к третьему входу ЛБ LUT-таблицы (in_3_lut_t или in_3_lut_b). С помощью верхнего и нижнего мультиплексоров выход логического блока может быть подключен обратно на третий вход LUT-таблицы верхнего или нижнего логического блока.

 Логический блок «плитки»

Рис. 8. Логический блок «плитки» (мультиплексор 16 в 1, элемент памяти, мультиплексор)

 Соединительный блок С2

Рис. 9. Соединительный блок С2

Описание блока Crossbar на языке M-фай-лов демонстрирует пример 3. Блок Crossbar выполняет функцию демультиплексора, выходы которого объединяются с межсоединениями трассировочного канала с использованием функции bitor (ИЛИ) с разрешением по выходу (En). На выходах демультиплексора предварительно устанавливаются нули, сигнал En = 1 разрешает подключение выхода логического блока к трассировочному каналу. Пример 4 демонстрирует автоматически сгенерированный код языка VHDL блока Crossbar, полученный с помощью Simulink HDL Coder.

На рис. 10 показан соединительный блок С1, который осуществляет подключение межсоединения из вертикального трассировочного канала ко второму входу LUT-таблицы, левому или правому соседнему (in_2_lut_l или in_2_lut_r). Пример 5 демонстрирует M-файл мультиплексора 4 в 1, входящего в состав соединительного блока C1. Подключение сигналов ко второму in_2_lut_l и третьему in_3_lut_t входу LUT-таблицы осуществляется с помощью элемента задержки Unit Delay. На рис. 11 показан маршрутизатор (S-блок) и код языка VHDL мультиплексора 5 в 1, используемый в маршрутизаторе.

Соединительный блок С1

Рис. 10. Соединительный блок С1. Подключение межсоединения из вертикального трассировочного канала ко второму входу LUT-таблицы (in_2_lut_l или in_2_lut_r)

Маршрутизатор трассировочных ресурсов

Рис. 11. Маршрутизатор трассировочных ресурсов

Пример 1. Конвертация типа double в тип ufix для генерации кода языка VHDL:

function out = convert(in)
hdl_fm = fimath(ѕ
‘RoundMode’, ‘floor’, ѕ
‘OverflowMode’, ‘wrap’,…
‘ProductMode’, ‘FullPrecision’, ‘ProductWordLength’, 32, ѕ
‘SumMode’, ‘FullPrecision’, ‘SumWordLength’, 32, ѕ
‘CastBeforeSum’, true);
out = fi(in, 0, 1, 0, hdl_fm)
end

Пример 2. Создание двухразрядной шины:

function out = Concat(H, L)
hdl_fm = fimath(ѕ
‘RoundMode’, ‘floor’, ѕ
‘OverflowMode’, ‘wrap’, ѕ
‘ProductMode’, ‘FullPrecision’, ‘ProductWordLength’, 32, ѕ
‘SumMode’, ‘FullPrecision’, ‘SumWordLength’, 32, ѕ
‘CastBeforeSum’, true);
out = fi(bitconcat(fi(H, 0, 1, 0, hdl_fm), fi(L, 0, 1, 0, hdl_fm)));
end

Пример 3. M-файл блока Crossbar, входящего в состав соединительного блока C2:

function [out1, out2, out3, out4] = crossbar(sel, in, en, L_1, R_0, L_3, R_2)
hdl_fm = fimath(ѕ
‘RoundMode’, ‘floor’, ѕ
‘OverflowMode’, ‘wrap’, ѕ
‘ProductMode’, ‘FullPrecision’, ‘ProductWordLength’, 32, ѕ
‘SumMode’, ‘FullPrecision’, ‘SumWordLength’, 32, ѕ
‘CastBeforeSum’, true);
out1_de = fi(0, 0, 1, 0, hdl_fm);
out2_de = fi(0, 0, 1, 0, hdl_fm);
out3_de = fi(0, 0, 1, 0, hdl_fm);
out4_de = fi(0, 0, 1, 0, hdl_fm);
if (logical(en))
switch (uint8(sel))
case 0,
out1_de = fi(in, 0, 1, 0, hdl_fm);
case 1,
out2_de = fi(in, 0, 1, 0, hdl_fm);
case 2,
out3_de = fi(in, 0, 1, 0, hdl_fm);
case 3,
out4_de = fi(in, 0, 1, 0, hdl_fm);
end
end
out1 = fi(bitor(out1_de,L_1), 0, 1, 0, hdl_fm);
out2 = fi(bitor(out2_de,R_0), 0, 1, 0, hdl_fm);
out3 = fi(bitor(out3_de,L_3), 0, 1, 0, hdl_fm);
out4 = fi(bitor(out4_de,R_2), 0, 1, 0, hdl_fm);
end

Пример 4. Код языка VHDL блока Crossbar, входящего в состав соединительного блока C2:

ENTITY demux IS
PORT (
sel : IN std_logic_vector(1 DOWNTO 0);
in_rsvd : IN std_logic;
en : IN std_logic;
L_1 : IN std_logic;
R_0 : IN std_logic;
L_3 : IN std_logic;
R_2 : IN std_logic;
out1 : OUT std_logic;
out2 : OUT std_logic;
out3 : OUT std_logic;
out4 : OUT std_logic);
END demux;
ARCHITECTURE rtl OF demux IS
BEGIN
demux : PROCESS (sel, in_rsvd, en, L_1, R_0, L_3, R_2)
VARIABLE out1_de : std_logic;
VARIABLE out2_de : std_logic;
VARIABLE out3_de : std_logic;
VARIABLE out4_de : std_logic;
VARIABLE c_uint : std_logic;
VARIABLE b_c_uint : std_logic;
VARIABLE c_c_uint : std_logic;
VARIABLE d_c_uint : std_logic;
BEGIN
out1_de := ‘0’;
out2_de := ‘0’;
out3_de := ‘0’;
out4_de := ‘0’;
IF en /= ‘0’ THEN
CASE sel IS
WHEN “00” =>
out1_de := in_rsvd;
WHEN “01” =>
out2_de := in_rsvd;
WHEN “10” =>
out3_de := in_rsvd;
WHEN “11” =>
out4_de := in_rsvd;
WHEN OTHERS =>
NULL;
END CASE;
END IF;
c_uint := out1_de OR L_1;
out1 <= c_uint;
b_c_uint := out2_de OR R_0;
out2 <= b_c_uint;
c_c_uint := out3_de OR L_3;
out3 <= c_c_uint;
d_c_uint := out4_de OR R_2;
out4 <= d_c_uint;
END PROCESS demux;
END rtl;

Пример 5. M-файл мультиплексора 4 в 1, входящего в состав соединительного блока C1:

function out = mux_4v1(sel, in1, in2, in3, in4)
hdl_fm = fimath(ѕ
‘RoundMode’, ‘floor’, ѕ
‘OverflowMode’, ‘wrap’, ѕ
‘ProductMode’, ‘FullPrecision’, ‘ProductWordLength’, 32, ѕ
‘SumMode’, ‘FullPrecision’, ‘SumWordLength’, 32, ѕ
‘CastBeforeSum’, true);
out = fi(0, 0, 1, 0, hdl_fm);
switch (uint8(sel))
case 0,
out = fi(in1, 0, 1, 0, hdl_fm);
case 1,
out = fi(in2, 0, 1, 0, hdl_fm);
case 2,
out = fi(in3, 0, 1, 0, hdl_fm);
case 3,
out = fi(in4, 0, 1, 0, hdl_fm);
end

Пример 6. Код языка VHDL дешифратора 5 в 1, используемого в маршрутизаторе:

LIBRARY ieee;
USE ieee.std_logic_1164.all;
USE ieee.numeric_std.all;
ENTITY EML1_block IS
PORT (
sel : IN std_logic_vector(2 DOWNTO 0);
in1 : IN std_logic;
in2 : IN std_logic;
in3 : IN std_logic;
in4 : IN std_logic;
in5 : IN std_logic;
out_rsvd : OUT std_logic);
END EML1_block;
ARCHITECTURE rtl OF EML1_block IS
BEGIN
EML1_block : PROCESS (sel, in1, in2, in3, in4, in5)
BEGIN
out_rsvd <= ‘0’;
CASE sel IS
WHEN “000” =>
out_rsvd <= in1;
WHEN “001” =>
out_rsvd <= in2;
WHEN “010” =>
out_rsvd <= in3;
WHEN “011” =>
out_rsvd <= in4;
WHEN “100” =>
out_rsvd <= in5;
WHEN OTHERS =>
NULL;
END CASE;
END PROCESS EML1_block;
END rtl;

Выводы

Продемонстрирована возможность использования системы визуально-имитационного моделирования MATLAB/Simulink с приложением Simulink HDL Coder для разработки архитектуры академической ПЛИС с одноуровневой структурой межсоединений на уровне системы. Разработанная архитектура ПЛИС обеспечивает однотипность трассировочных ресурсов по всей площади кристалла.

Литература

  1. Строгонов А., Мотылев М., Давыдов С., Быстрицкий А. ПЛИС типа ППВМ с одноуровневой структурой межсоединений // Компоненты и технологии. 2011. № 1.
  2. Строгонов А., Мотылев М., Давыдов С., Быстрицкий А., Цыбин С. ПЛИС в ПЛИС, или Как спроектировать самому // Компоненты и технологии. 2011. № 4.
  3. Строгонов А., Мотылев М., Давыдов С., Быстрицкий А., Цыбин С. Проектирование академических ПЛИС типа ППВМ с одноуровневой структурой межсоединений // Компоненты и технологии. 2011. № 6.
  4. Солонина А. Моделирование цифровой обработки сигналов ЦОС в MATLAB. Ч. 4. Моделирование структур цифровых фильтров c фиксированной точкой программными средствами MATLAB: анализ характеристик КИХ-фильтров // Компоненты и технологии. 2009. № 2.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *