Разработка модели ПЛИС типа ППВМ с одноуровневой структурой межсоединений в системе визуально-имитационного моделирования MATLAB/Simulink
Успехи в области создания академических ПЛИС и программных инструментов оказали существенное влияние на развитие архитектур индустриальных ПЛИС.
В академических ПЛИС для обеспечения программируемой коммутации существует две технологии соединений: 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. Более подробно об архитектуре академических ПЛИС можно узнать в работах [1–3].
Модель ПЛИС реализована в формате с фиксированной запятой (точкой), с использованием 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-маршрутизатор обеспечивает длину сегмента межсоединения в два ЛБ.
Рис. 3. L2-маршрутизатор, коммутирующий две пары разнонаправленных межсоединений в горизонтальном и вертикальном направлениях, обеспечивая длину сегмента в два логических блока (длинная линия L = 2)
По четырем сторонам маршрутизатора располагаются многовходовые мультиплексоры, в которых сегментируется только лишь одна из двух пар разнонаправленных межсоединений в горизонтальных и вертикальных направлениях. Несегментируемая пара разнонаправленных межсоединений перекручивается «косичкой» с сегментируемой парой за пределами плитки (рис. 3).
Тестирование плитки на выполнение булевой функции 4И-НЕ в системе MATLAB/Simulink показано на рис. 4. На рис. 5 представлен нижний уровень иерархии. Для конфигурирования плитки необходимо 40 бит памяти. Конфигурационная карта памяти одной плитки ПЛИС показана в таблице 1. В таблице 2 приведен тест на выполнение булевой функции 4И-НЕ. На адресные входы мультиплексора 16 в 1 (LUT-таблица) подается комбинация из четырех логических единиц 1111, а на информационные входы подключаются 16 ячеек памяти с содержимым, отражающим принцип работы логического элемента 4И-НЕ (таблица истинности), при этом на выходе логического блока ожидаем «лог. 0». Остальные 24 ячейки памяти необходимы для программируемой коммутации.
Рис. 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).
На рис. 8 показан логический блок плитки, который состоит из LUT-таблицы (мультиплексора 16 в 1), элемента памяти (триггера) и мультиплексора 2 в 1. На рис. 9 приведен соединительный блок С2, который осуществляет подключение выхода ЛБ к одному из межсоединений горизонтального трассировочного канала и подключение одного из межсоединений канала к третьему входу ЛБ LUT-таблицы (in_3_lut_t или in_3_lut_b). С помощью верхнего и нижнего мультиплексоров выход логического блока может быть подключен обратно на третий вход LUT-таблицы верхнего или нижнего логического блока.
Описание блока 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, используемый в маршрутизаторе.
Рис. 10. Соединительный блок С1. Подключение межсоединения из вертикального трассировочного канала ко второму входу LUT-таблицы (in_2_lut_l или in_2_lut_r)
Пример 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 для разработки архитектуры академической ПЛИС с одноуровневой структурой межсоединений на уровне системы. Разработанная архитектура ПЛИС обеспечивает однотипность трассировочных ресурсов по всей площади кристалла.
Литература
- Строгонов А., Мотылев М., Давыдов С., Быстрицкий А. ПЛИС типа ППВМ с одноуровневой структурой межсоединений // Компоненты и технологии. 2011. № 1.
- Строгонов А., Мотылев М., Давыдов С., Быстрицкий А., Цыбин С. ПЛИС в ПЛИС, или Как спроектировать самому // Компоненты и технологии. 2011. № 4.
- Строгонов А., Мотылев М., Давыдов С., Быстрицкий А., Цыбин С. Проектирование академических ПЛИС типа ППВМ с одноуровневой структурой межсоединений // Компоненты и технологии. 2011. № 6.
- Солонина А. Моделирование цифровой обработки сигналов ЦОС в MATLAB. Ч. 4. Моделирование структур цифровых фильтров c фиксированной точкой программными средствами MATLAB: анализ характеристик КИХ-фильтров // Компоненты и технологии. 2009. № 2.