УДК 621.3
ПРОЕКТИРОВАНИЕ МИКРОПРОЦЕССОРНЫХ ЯДЕР С КОНВЕЙЕРНОЙ АРХИТЕКТУРОЙ ДЛЯ РЕАЛИЗАЦИИ В БАЗИСЕ ПЛИС ФИРМЫ ALTERA
А.В. Строгонов, С.И. Давыдов
В статье рассматривается проектирование микропроцессорного ядра с конвейерной архитектурой на языке VHDL для реализации в базисе программируемых логических интегральных схем (ПЛИС) с использованием САПР Quartus II фирмы Altera
Ключевые слова: микропроцессор, система команд, язык описания аппаратных средств
В работах [1,2] с использованием системы команд из работы [3] показаны примеры проектирования микропроцессорных ядер для реализации в базисе ПЛИС фирмы Altera, как с использованием мегафункций асинхронного ОЗУ/ПЗУ САПР ПЛИС Quartus II, так и с использованием асинхронного ПЗУ на языке VHDL. Общим недостатком работ [1,2] является отсутствие управляющего автомата.
Воспользуемся системой команд синхронного процессора, рассмотренного в работе [3] и спроектируем микропроцессорное ядро с использованием конвейерной архитектуры, что позволяет повысить быстродействие системы. Обычно для выполнения каждой команды требуется осуществить некоторое количество однотипных операций. Каждую из этих операций сопоставляют одной ступени конвейера.
Например, типовой конвейер
микропроцессора содержит четыре стадии: получение и декодирование инструкции; адресация и выборка операнда из ОЗУ; выполнение арифметических операций; сохранение результата операции.
Каждый этап команды рассматривается как каскад конвейера. Таким образом, можно организовать наложение команд, при котором новая команда будет начинать выполняться в первый момент каждого такта.
Благодаря использованию внутреннего параллелизма потока команд конвейерная обработка позволяет существенно снизить в среднем время выполнения одной команды. Пропускная способность машины с конвейерной обработкой определяется числом команд, пропущенных через конвейер за единицу времени.
Для реализации процессора необходима память, в которой будут храниться команды микропроцессора (память программ) и инструкции для управляющего автомата. Проектируемая память имеет асинхронный сигнал сброса reset, состоит из двух массивов памяти емкостью 4096 бит. Тестовая схема ПЗУ представлена на рис.1. Ниже приведен код языка VHDL асинхронной памяти (пример 1). ПЗУ разделено на 2 области и обладает двумя адресными шинами addr_cmd[15..0] и addr_avt[15..0]. По шине avt_out[15..0] передаются инструкции управляющего автомата, а по шине сmd_out[15..0] передаются команды микропроцессора.
Разработаем для проектируемого
микропроцессорного ядра управляющий автомат, на девять состояний (рис.2). Использование управляющего автомата удовлетворяет
современной концепции синхронного кодирования при реализации цифровых устройств в базисе ПЛИС.
Рис.1. Тестовая схема асинхронного ПЗУ в графическом редакторе САПР ПЛИС Риаііш II
Строгонов Андрей Владимирович - ВГТУ, д-р техн. наук, профессор, E-mail: [email protected] Давыдов Сергей Игоревич - ВГТУ, студент, тел. (4732)437695
Пример 1. Фрагмент кода языка VHDL блока асинхронной памяти PROCESS (reset, clk)
-- local variables VARIABLE b : INTEGER;
VARIABLE c : INTEGER;
BEGIN
IF reset = '1' THEN NULL;
ELSIF clk'EVENT AND clk= '1' THEN IF clk_enable= '1' THEN FOR b IN 128 TO 255 LOOP data(b) <= data_next(b);
END LOOP;
FOR c IN 0 TO 127 LOOP data(c) <= data_next(c);
END LOOP;
END IF;
END IF;
END PROCESS;
PROCESS (addr_cmd)
-- local variables
VARIABLE data_temp : T_UFIX_16_256; BEGIN
FOR b IN 128 TO 255 LOOP
data_temp(b) := to_unsigned(0, 16); END LOOP;
:= to_unsigned(0, 16);
data_temp(128)
data_temp(129)
data_temp(130)
data_temp(131)
data_temp(132)
data_temp(133)
data_temp(134)
data_temp(135)
data_temp(136)
data_temp(137)
data_temp(138)
data_temp(139)
= to_unsigned(1165, 16) = to_unsigned(1358, 16) = to_unsigned(1540, 16) = to_unsigned(1541, 16) = to_unsigned(1542, 16) = to_unsigned(1543, 16) = to_unsigned(1544, 16) = to_unsigned(1545, 16) = to_unsigned(1539, 16) = to_unsigned(1552, 16) = to_unsigned(1553, 16)
cmd_out <=
std_logic_vector(data_temp(to_integer(unsigned(addr_
cmd))));
END PROCESS;
PROCESS (addr_avt)
-- local variables
VARIABLE data_temp : T_UFIX_16_256;
BEGIN FOR c IN 0 TO 255 LOOP data_temp(c) := to_unsigned(0, 16);
END LOOP;
data_temp(0) := "0000000000000000"; data_temp(1) := "1000000000000000"; data_temp(2) := "1000001000000000"; data_temp(3) := "1000010000000000"; data_temp(4) := "1000011000000000"; data_temp(5) := "1000100000000000"; data_temp(6) := "1000101000000000"; data_temp(7) := "0001000000000000"; data_temp(8) := "0010000000000000"; data_temp(9) := "0011000000000000"; data_temp(10) := "0100000000000000"; data_temp(11) := "1001000000000000"; avt_out<=std_logic_vector(data_temp(to_integer (unsigned(addr_avt))));
END PROCESS;
В начальном состоянии автомата INST по шине instr[15..0] происходит загрузка инструкции для управляющего автомата из ПЗУ в регистр инструкций, в котором выделяются разряды [15..12] для декодирования движений по веткам автомата и разряды [11..9] для декодирования логико-арифметических операций (шины
instr[15..12] и instr[11..9]).
Следующее состояние, в которое переходит автомат по переднему фронту синхроимпульса clk
- ReadInst. В состоянии ReadInst происходит чтение полученной инструкции и выбор следующего состояния автомата.
Рис.2. Блок-схема управляющего автомата микропроцессорного ядра на 9 состояний
С приходом фронта синхроимпульса автомат перейдет в одну из возможных веток (всего возможны 4 ветки), например, в состояние MovA если на шине instr_15_12 = “0000” (ветка с состояниями MovA, MovB, XCHG для выполнения регистровых операций), в состояние ALU если “1000” (в этом состоянии выполняются логикоарифметические операции), в состояние RegA если “1001” (ветка с состояниями RegA, RegB) или в состояние JUMP, если любое другое значение. В зависимости от значения instr_15_12 после состояния JUMP автомат может “перепрыгнуть” в другое состояние (возможные переходы показаны пунктирными линиями).
В состоянии MovA происходит непосредственная загрузка в регистр A операнда,
заданного младшим байтом команды. Следующим состоянием, в котором произойдет загрузка операнда в регистр B будет MovB. В состоянии XCHG произойдет обмен местами значений в регистрах A и B. После этого автомат возвращается в состояние INST и читает следующую инструкуцию instr из памяти. В состоянии ALU код на шине instr_11_9 выбирает логикоарифметическую операцию, которая будет выполнена в АЛУ. В состояниях RegA и RegB происходит загрузка данных в регистры с входного порта. Автомат имеет вход асинхронного сброса rst, который устанавливает автомат в начальное состояние INST. На рис.3 показана тестовая схема управляющего автомата.
І oontroi
if; W і clk ip[15..Ü] rst num_state [3. .0] instr J 5_12 [3. .0] instr_en instr_11_9[2..D] feiiTPMT > ¡PÍÍ5..D] L . . .
; rst і - 1 : instr 15 12[3..0] I l^T ; ' : instr 11 9[2..0] і ' INPUT j '
Рис.3. Тестовая схема управляющего автомата в графическом редакторе САПР ПЛИС Оиаііш II
Блок имеет вход синхронизации clk и асинхронного сброса rst. В блок поступают две
инструкции по шинам: instr_ 15_ 12 [3. .0] и
instr_11_9[2..0]. На выходе автомата ip[15..0] формируется адрес команды хранящийся в ПЗУ. Высокий уровень сигнала instr_en разрешает получение новой инструкции из ПЗУ для управляющего автомата, и увеличивает
содержимое счетчика на единицу. Сигнал
num_state[3..0] показывает номер состояния, в котором находится управляющий автомат. VHDL описание проектируемого автомата с
использованием двухпроцессорного шаблона показано ниже (пример 2):
Пример 2. Фрагмент кода языка VHDL управляющего автомата
ARCHITECTURE behave OF Control IS -- Definition of the state names TYPE state_type IS (Inst, ReadInst, MovA, MovB, XCHG, ALU, JUMP, RegA, RegB);
SIGNAL state, next_state : state_type;
Signal control_signal: std_logic_vector(15 downto 0);
BEGIN
-- State process
PROCESS(clk, rst)
BEGIN
IF rst = '1' THEN state <= Inst;
ELSIF clk'event and clk='1' THEN state <= next_state;
END IF;
END PROCESS;
-- Logic Process PROCESS(state)
BEGIN CASE state IS --Instruction WHEN Inst =>
control_signal <= "ОООООООО1ООООООО"; num_state <= "ОООО"; instr_en <= '1'; next_state <= ReadInst;
--Read Instruction WHEN ReadInst =>
control_signal <= "ОООООООО1ООООООО"; num_state <= "ООО1"; instr_en <= 'О';
IF instr_15_12 = "ОООО" THEN next_state <=MovA: ELSIF instr_15_12 = "1ООО" THEN next_state
<=ALU;
ELSIF instr_15_12 = "1ОО1" THEN next_state<=RegA;
ELSE next_state <= JUMP;
END IF;
--MovA
WHEN MovA =>
control_signal <= "ОООООООО1ОООООО1"; next_state <= MovB; num_state <= "ОО1О"; instr_en <= 'О';
--MovB
WHEN MovB =>
control_signal <= "ОООООООО1ООООО1О"; next_state <= XCHG; num_state <= "ОО11"; instr_en <= 'О';
-- XCHG WHEN XCHG => next_state <= Inst; num_state <= "0100"; instr_en <= '0';
control_signal <= "0000000010001001"; -- ALU
WHEN ALU => instr_en <= '0';
ELSIF instr_11_9 = "011" THEN control_signal <= "0000000010000110"; next_state <= INST;
ELSIF instr_11_9= "100" THEN control_signal <= "0000000010000111"; next_state <= INST;
ELSIF instr_11_9 = "101" THEN control_signal <= "0000000010001000"; next_state <= INST;
END IF;
--RegA
WHEN RegA => next_state <= RegB; num_state <= "0110"; instr_en <= '0';
control_signal <= "0000000010001010"; --RegB
WHEN RegB =>
j alu
next_state <= INST; num_state <= "0111"; instr_en <= '0';
control_signal <= "0000000010001011"; --JUMP
WHEN JUMP =>
control_signal <= "0000000010000000";
instr_en <= '0';
num state <= "1000";
num state <= "0101"; IF instr_15_12 = "0001 " THEN next_state <= MovA;
IF instr_11_9 = "000" THEN ELSIF instr_15_ 12 = "0010" THEN next_state <=
control_signal <= "0000000010000011"; MovB;
next state <= INST; ELSIF instr 15 12 = "0011" THEN next_state <=
ELSIF instr_11_9 = "001" THEN ALU;
control_signal <= "0000000010000100"; ELSIF instr 15 12 = "0100" THEN next_state <=
next_state <= INST; XCHG;
ELSIF instr_11_9 = "010" THEN ELSIF instr_15_ 12 = "0110" THEN next_state <=
control_signal <= "0000000010000101"; RegA;
next_state <= INST; ELSIF instr_15_ 12 = "0111" THEN next_state <=
RegB;
ELSE next_state <= Inst;
END IF;
END case;
END process; ip <= control_signal;
END behave;
Разработано синхронное АЛУ, выполняющее различные логико-арифметические операции над операндами, значения которых сохраняются в регистрах-защелках А и В. На рис.4 показана тестовая схема АЛУ. Устройство содержит вход синхронизации clk, вход асинхронного сброса res; шину команд cmd[15..0], для передачи команды из ПЗУ в АЛУ.
_______________l=> W і
;з[7..р]__________і----; щт і,
............
cmd[15..0] dataap.Li]
elk d3tab[7..D]
a[7..D] enab
b[7..D]
Рис.4. Тестовая схема АЛУ в графическом редакторе САПР ПЛИС Quartus II
В этом блоке выполняются следующие команды: Mov A,xx; Mov B,xx; XCHG A,B; ADD
A,B; SUB A,B; AND A,B; OR A,B; XOR A,B; DEC A; Reg A; Reg B (пример 3).
Пример3. Фрагмент кода языка VHDL блока АЛУ
signal regA,regB,indata: std_logic_vector(7 downto 0); BEGIN
PROCESS (clk,res)
BEGIN
regA<=a;
regB<=b;
indata<=input;
if (RES = '1') then
regA <="00000000"; regB <="00000000"; elsif (clk'event and clk='1') then case conv_integer(cmd) is when 1024 to 1279 => regA<=cmd(7 downto 0); enaa<='1'; enab<='0';
when 1280 to 1535 => regB<=cmd(7 downto 0); enab<='1'; enaa<='0';
when 1537=>regA<=regB; enaa<='1'; enab<='0'; when 1538=>regB<=regA; enaa<='0'; enab<='1'; when 1539=>regA<=regB; regB<=regA; enaa<='1'; enab<='1';
when 1540=>regA<=regA+regB; enaa<='1'; enab<='0':
when l54l=>regA<=regA-regB; enaa<='l'; enab<='0';
when l542=>regA<=regA and regB;
enaa<='l'; enab<='0';
when l543=>regA<=regA or regB;
enaa<='l'; enab<=W;
when l544=>regA<=regA xor regB;
enaa<='l'; enab<='0';
when l545=>regA<=regA-l;enaa<='l'; єшЬ<='О'; when l546=>regA<=indata; enaa<='l'; enab<='0'; when l547=>regB<=indata; enaa<='0'; enab<='l'; when others=> dataa<=regA; datab<=regB; єшя<='О'; enab<='0'; end case; end if;
dataa<=regA; datab<=regB; end process;
Для выделения из шины инструкций шб1г[15..0] шины 1пб1г_ 15_ 12[3..0] и 1пб1г_ 11 _9[2..0] необходим регистр инструкций. Проектируемый регистр содержит сигнал синхронизации с1к, сброса с1г, сигнал разрешения записи ШБ1г_еп, и вход загрузки инструкции шб1г[15..0]. Когда сигнал ШБй^еп = ‘1’, то на выход шб1г_15_12 передаются старшие четыре разряда шины шб1г[15..0] (с 15 по 12), а на выход 1ш1г_11_9 с 11 по 9 разряды шины шб1г[15..0]. В качестве регистров общего назначения используем восьмиразрядный регистр -защелку.
На рис.5 показана схема микропроцессорного ядра на основе выше разработанных блоков.
Рис.5. Схема микропроцессорного ядра в графическом редакторе САПР ПЛИС ОиаЛиБ II
Особенностью схемы является использование управляющего автомата и наличие двух блоков памяти: для хранения команд и для хранения инструкций управляющего автомата. В первом состоянии управляющего автомата происходит чтение инструкции для него из ПЗУ (instr[15..0]) и выделение из нее полей - instr_15_12[3..0] и instr_11_9[2..0]. Адрес этой инструкции для автомата формирует счетчик (шина pc[15..0]), прибавляющий 1 к предыдущему адресу, когда автомат выполнит цикл команд и вернется в состояние INST. Автомат для каждого своего состояния вырабатывает адрес нужной команды хранящейся в ПЗУ программ (шина ip[15..0]) с помощью сигнала control_signal. Эта команда по шине команд cmd_out[15..0] передается в АЛУ, где выполняется требуемая операция, результаты
помещаются в регистры. Схема имеет 2 регистра общего назначения (регистр А и регистр В), данные из которых попадают в АЛУ для выполнения следующей операции. Также в полученной схеме есть возможность загружать операнды в регистры с входного порта input. На рис.6 приведены временные диаграммы работы спроектированного микропроцессорного ядра.
В нулевом состоянии управляющего автомата (INST) происходит запись инструкции в блок выделения полей (блок instreg) и из ПЗУ программ извлекается команда NOP c кодом 0, при которой нет операций. С приходом переднего фронта синхросигнала clk автомат переключается в состояние ReadInst, в котором читается полученная инструкция и выбирается следующее состояние.
Name
Valu... 0 ps
Dps 160.0 ns 320.0 ns 480.0 ns 640.0 ns 800.0 ns
reset
elk
(±1 num_state S a
Ш b Ш ip
0 PC
Г+1 input Ш cmd 0 instr Ш instr_11_9 Ш instr_15_12 enaa enab
0 1
B 0 U 0
и 0 и 0
U 128 U 0 U 200 Н 0000 В ООО... В ООО В 0000 в 0 В О
1
; 1 ; 2 X 3 ¡K X и X 1 * b * и X і X b 0 X 1 b X 0 X 1 ; b X и X 1
41 X 78 * і К 78 X 2 ! 1 4
0 * 78 X 41
і 28) 2 2 * 3 і * 1 37 * 28 * 2 ! X із I 2 X 2 X 1 32 X 1 2E X 1 2Î ! 3 К 2 ! X 1 28 і 34 X 2 ! * 2 !
:i X 1 X 2 X 3 H 4 5
200
рш I 0000 £ )4S[ r; 054E ШТ) ¡ШГ) 000 Г ("сієш 3 000 müüfrôeüs oooc f OOOO ОЄОЄ □ООН If 0ÜSÔ f DEBT; Г OOOO oooc
000000000000000 X оооооооооооооос X 1000001 000000000 X 100001000000000 * 1000011 00000000 t 10U01 oooooc
000 X 001 X 0 11 X 011 X
oooc X ¡100
1 I I I 1 I I I 1 I 1
I I
Рис.6. Временные диаграммы работы микропроцессорного ядра в векторном редакторе САПР ПЛИС ОиаПиБ II
Во втором состоянии выполняется команда Mov A,xx, которая загружает в регистр А значение, заданное младшим байтом команды. Из ПЗУ программ была получена команда 48D (1165) и в регистр А было загружено число 8D или 141 в десятичной системе. Согласно схеме на рис.2 следующее состояние, которое принимает автомат
- состояние номер 3 (MovB). В этом состоянии выполняется команда Mov B,xx. Команда загружает в регистр В значение, заданное младшим байтом команды. Тестирование команды пересылки Mov B,xx показано на рис.6. Из ПЗУ была получена команда 54Е и в регистр В было загружено число 4Е или 78 в десятичной системе. Согласно схеме на рис.2 следующее состояние автомата - XCHG. Из ПЗУ была извлечена команда 603 и регистры А и В обменялись значениями. При этом на шинах instr_15_12 = “0000” и instr_11_9 = “000”.
Код команды ADD - 604 (1540). При этом на шинах instr_15_12 = “1000” а instr_11_9 = “000”. Значения регистров А и В были сложены, и результат помещен в регистр А. Команда SUB A,B выполнила вычитание значений в регистрах А и В, результат помещен в регистр А (код команды -605). Команда AND A,B, выполняющая операцию побитного логического И значений в регистрах А и
В, также показана на рис.6. Команда логическое И с
Воронежский государственный технический университет
кодом 606 работает верно. Результат команды был помещен в регистр А. Команда логическое ИЛИ с кодом 607, выполняет операцию побитное логическое ИЛИ (команда ОЯ А,В). Результат выполнения команды помещен в регистр А. Команда ХОЯ А,В выполняет побитное логическое исключающее ИЛИ значений в регистрах А и В. Результат помещен в регистр А (код 608).
Проект микропроцессора с синхронным ПЗУ на языке УИБЬ может быть успешно размещен в ПЛИС АРЕХ20КЕ (ЕР20К160ЕВ356-1), при этом общее число задействованных ресурсов составляет 70 %, с рабочей тактовой частотой до 33 МГ ц.
Литература
1. Строгонов А.В., Буслов А.И., Золотухина О.А., Цыбин С.А. Проектирование
микропроцессорных ядер для реализации в базисе ПЛИС // Вестник ВГТУ, 2009, N3, с.46 - 51.
2. Проектирование учебного процессора для
реализации в базисе ПЛИС с использованием системы МаИаЬ^шиИпк / Компоненты и
технологии, 2009, N5, с.10 - 14.
3. Тарасов И. Проектирование конфигурируемых процессоров на базе ПЛИС. Часть II // Компоненты и технологии, 2006, N3.
DESIGNING OF MICROPROCESSOR NUCLEUS WITH CONVEYOR ARCHITECTURE FOR
REALIZATION IN FPGA ALTERA
A.V. Strogonov, S.I. Davydov
Designing of microprocessor nucleus with conveyor architecture in language VHDL for realization in FPGA with use CAD Quartus II Altera is considered
Key words: microprocessor, system of the commands, hardware description language