Проектирование микропроцессорных ядер для реализации в базисе ПЛИС

УДК 621.3

ПРОЕКТИРОВАНИЕ МИКРОПРОЦЕССОРНЫХ ЯДЕР ДЛЯ РЕАЛИЗАЦИИ

В БАЗИСЕ ПЛИС

А.В. Строгонов, А.И. Буслов, О.А. Золотухина, С.А. Цыбин

В статье рассматривается проектирование микропроцессорного ядра с использованием высокоуровневого языка описания аппаратных средств

• Ключевые слова: микропроцессор, система команд, управляющий автомат

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

[1]. Программные заготовки можно легко подстраивать к условиям нового проекта, обладают высоким быстродействием и они независимы от технологии. Их реализация в ПЛИС (например, 8разрядное микропроцессорное ядро PicoBlaze для реализации в базисе ПЛИС семейств Spartan и Virtex

[2]) позволяет ускорить процесс разработки микропроцессорных систем. Наиболее важными потребительскими свойствами вычислительных заготовок процессоров являются: повторяемость, быстродействие, аппаратурные затраты.

Путем несложной перенастройки “мягкой” заготовки можно получить ряд модификаций микроконтроллера с различным сочетанием объема памяти, периферийных устройств, источников прерывания и т.п. Такой процессор можно реализовать в ПЛИС различных фирм. Описание модели на языке VHDL позволяет не только сделать ее перенастраиваемой и независимой от технологии, но и выполнять ее моделирование и синтез на симуляторах и средствах синтеза различных фирм.

В работах [3-6] рассматривается проектирование процессоров для реализации в базе ПЛИС с использованием языков аппаратурных средств VHDL [3,4] и AHDL [6]. Интересный вариант построения RISC-процессора на языке VHDL описан в работе [1]. Проект процессора ориентирован на реализацию в ПЛИС Virtex-E фирмы Xilinx. Процессор имеет структуру с распределенным управлением, развитую систему команд и в отличие от работ [3-6] используется в качестве основы ультрабыстрого процессора 80С51.

Строгонов Андрей Владимирович - ВГТУ, д-р техн. наук, профессор, andreis@hotmail.ru

Буслов Артем Иванович - ВГТУ, магистрант, тел. 89155822767 Золотухина Ольга Анатольевна - ВГТУ, аспирант, тел. 89056591379

Цыбин Сергей Александрович - ОАО «Конструкторско-Технологический Центр “Электроника”», генеральный директор, тел. (4732) 43-76-95

Воспользуемся системой команд

гипотетического синхронного процессора,

реализованного с помощью конечного автомата, с

циклом работы в два такта [3]. При разработке системы команд процессора, автор работы [3] использовал слабое кодирование. В табл.1 представлена система команд процессора с синхронной архитектурой [3]. Процессор основан на использовании раздельных шин данных и команд.

Предлагаемый процессор в работе [3], способен работать с синхронным ОЗУ. Это обеспечивается использованием оператора case, который используется в ветви оператора if при детектировании атрибута переднего фронта синхроимпульса clk и позволяет организовать цикл работы в два такта.

В качестве примера, воспользуемся процессором, представленным в работе [3] и реализуем его в ПЛИС фирмы Altera APEX20KE с асинхронным ПЗУ. Реализация синхронного процессора с циклом работы в два такта возможна с использованием более современных семейств ПЛИС фирмы Altera - Stratix и Oyclone.

На рис.1 показана тестовая схема управляющего автомата процессора в графическом редакторе САПР ПЛИС Quartus II, а на рис.2 показано содержимое конфигурационного файла ПЗУ. В описание процессора на языке VHDL добавлен асинхронный сброс регистров А, В и счетчика команд на регистре ip (врезка 1). Как и в работе [3] декодирование переменной-селектора cmd осуществляется с помощью оператора case.

Оператор case, подобно оператору if, задает ветвление алгоритма. В этом операторе вычисляется заданное выражение expression, по его значению выбирается одна из альтернатив choices (constant_value) и исполняются соответствующие последовательные операторы statement. В каждом из наборов альтернатив constant_value можно записать один или большее число последовательных операторов.

Значения в списках разделяются символом “j”. Когда значение выражения встречается в одном из списков значений, выполняется соответствующая последовательность операторов. Если значение выражения не присутствует ни в одном из списков, то выполняется список операторов, соответствующий ветви when others.

Синтаксис оператора case:

CASE_____expression IS

WHEN_______constant_value =>

__statement;

__statement;

WHEN __constant_value =>

___statement;

___statement;

WHEN OTHERS =>

___statement;

___statement;

END CASE;

Оператор conv_integer(cmd) переводит вектор в десятичное число отдельных кодов. При каждом допустимом значении кода команды, происходят различные действия, которые состоят в назначении регистрам новых значений в соответствии с описанием команд. Счетчик команд (регистр) не обновляется автоматически, поэтому в каждом варианте кода команды, присваивание счетчику нового значения, указывается явно [3]. Процессор ограничивается двумя регистрами общего назначения (A и В). Процессор имеет указатель инструкций ip и регистр r, для хранения адреса, с которого произошел вызов подпрограммы, поддерживает минимальный набор команд: команда пересылки “регистр - регистр”; команды непосредственной загрузки; команда безусловного перехода к новому адресу; команды перехода по условию; набор арифметико-логических операций

[3]. На врезке 1 показан управляющий автомат на языке VHDL.

Наиболее сложными являются команды передачи управления JMP и JMPZ, и команда обращения к подпрограммам CALL и команда возврата из подпрограмм RET. Временные диаграммы на рис.3 демонстрируют принцип работы управляющего автомата с асинхронным ПЗУ при отработке команд CALL (0305H) и RET (0600H). При нормальной последовательности работы процессора отрабатываются регистровые команды. Последовательно загружаются регистры А и В. В регистр А загружается число 1D (1H), а в регистр В, число 17D (11H). По команде 0305H происходит запись содержимого счетчика команд ip в регистр r (2D) и загрузка в счетчик команд числа 5D. Таким образом, процессор начнет выполнять подпрограмму, хранящуюся в ПЗУ с адреса 5H. По указанному адресу извлекается регистровая команда 0403H. Происходит загрузка в регистр A числа 3H, командой 0404Р загрузка числа 4H. Следующей командой с кодом 0604Н произойдет сложение содержимого регистров с сохранением результата в регистре А (число 21D). Далее будут отработаны команды 0406Н и 0407Н. По команде возврата из подпрограммы 600Н произойдет изменение содержимого счетчика с 10D на 2D+1D, т.е. на 3D.

-%Н-

—

с* ip[7..0) res cmd[l5..0] а[7..0] «7-0] гГ7 -0]

address[7..0] q[10..0]

стар» 01

rf? 01

-jp-jT

bf7 0)

Рис.1. Тестовая схема процессора в графическом редакторе САПР ПЛИС Оиаііш II с использованием

управляющего автомата и асинхронного ПЗУ

Add г +0 i-і *2 +3 -ь4 +£ +7

00 0401 0511 0305 0512 0402 0403 0404 0604

03 0406 0407 0600 0000 0000 0000 OQOQ ооа а

Рис.2. Файл конфигурации ПЗУ для тестирования команды обращения к подпрограммам CALL и возврата RET

Value at Ops

H1

0 ps 20.0 n

40.0 n

60.0 n

100.0 n

120.0 n

140.0 n

150.0 n

180.0 n

200.0 n

220.0 n

240.0 n

elk

0 ip

BO

0 cmd

m

0 a

0 b

SO

Рис.3. Временная диаграмма работы процессора, с использованием управляющего автомата и асинхронного ПЗУ. Отрабатываются регистровые команды и команда вызова подпрограммы с кодом 0305H

и команда возврата из подпрограммы 0600H

Врезка 1. Управляющий автомат на языке VHDL

library ieee;

use ieee.std_logic_1164.all; use ieee.std_logic_arith.all; use ieee.std_logic_unsigned.all;

entity proc is

port (ip: inout std_logic_vector(7 downto 0); cmd: inout std_logic_vector(15 downto 0); clk,res: in std_logic; a: inout std_logic_vector(7 downto 0); b,r: inout std_logic_vector(7 downto 0)); end proc;

architecture a of proc is signal stage: std_logic; begin

process

begin

if (res = '1') then

a <="00000000"; b <="00000000"; ip <="00000000"; elsif clk'event and clk='1' then case stage is when '0'=> stage<='1'; when others=> stage<='0'; case conv_integer(cmd) is when 0=> ip <= ip+1; when 256 to 511 =>ip<=cmd(7 downto 0); when 512 to 767 =>if conv_integer(a)=0

then ip<=cmd(7 downto 0); else ip<=ip+1; end if;

when 768 to 1023 =>r<=ip; ip<=cmd(7 downto 0); when 1024 to 1279 => a<=cmd(7 downto 0); ip<=ip+1;

when 1280 to 1535 => b<=cmd(7 downto 0); ip<=ip+1;

when 1536 =>ip<=r+1; when 1537=>a<=b; ip<=ip+1; when 1538=>b<=a; ip<=ip+1; when 1539=>a<=b;b<=a; ip<=ip+1; when 1540=>a<=a+b; ip<=ip+1; when 1541=>a<=a-b; ip<=ip+1; when 1542=>a<=a and b; ip<=ip+1; when 1543=>a<=a or b; ip<=ip+1; when 1544=>a<=a xor b; ip<=ip+1; when 1545=>a<=a-1; ip<=ip+1; when others=>ip<=ip+1; end case; end case; end if; end process; end a;

Таблица 1

Система команд процессора с синхронной _____________архитектурой [3]__________________

Код Мнемоника Описание

операции

1 2 3

0 NOP Нет операции

01xxH JMP Безусловный переход по адресу, заданному младшим байтом команды

02xxH JMPZ Переход по адресу, заданному младшим байтом команды, если содержимое регистра А равно нулю

03xxH CALL Вызов подпрограммы по адресу, заданному младшим байтом команды

04xxH MOV A,xx Непосредственная загрузка в регистр А значения, заданного младшим байтом команды

05xxH MOV B,xx Непосредственная загрузка в регистр В значения, заданного младшим байтом команды

0600H RET Возврат из подпрограммы

0601H MOV A,B Загрузка в регистр А значения, содержащегося в регистре В

0602H MOV B,A Загрузка в регистр В значения, содержащегося в регистре А

0603H XCHG A,B Обмен местами значений в регистрах А и В

0604H ADD A,B Сложение значений в регистрах А и В, результат помещается в А

0605H SUB A,B Вычитание значений в регистрах А и В, результат помещается в А

0606H AND A,B Побитное логическое И значений в регистрах А и В, результат помещается в А

0607H OR A,B Побитное логическое ИЛИ значений в регистрах А и В, результат помещается в А

060SH XOR A,B Побитное логическое ИСКЛЮЧАЮЩЕЕ ИЛИ значений в регистрах А и В, результат помещается в А

0609H DEC A Декремент регистра А

Для использования устаревших серий ПЛИС в учебных проектах, предлагается отказаться от цикла работы в два такта. С этой целью регистровые команды 04xxH, 05xxH, 0601H-0609H предлагается реализовать на тактируемом дешифраторе (врезка 2), выполняющим функцию арифметически-

логического устройства (АЛУ), а команды передачи управления JMP, JMPZ и обращения к подпрограммам с кодами 01xxH-03xxH, 0600H на 8ми разрядном суммирующем счетчике адресов памяти команд (врезка 3), тактируемым фронтом синхросигнала (рис.4). Счетчик содержит асинхронный сброс Reset. Активным является сигнал высокого уровня. Во вложенных ветвях оператора if происходит проверка условий и синхронная загрузка счетчика команд.

Оператор if используется для ветвления алгоритма по различным условиям. Наиболее простой синтаксис имеет вид:

IF___expression THEN_____statement;

END IF;

Вначале проверяется булево выражение boolean-expression и если оно имеет значение true, то исполняется последовательный оператор sequential-statement. Возможно, использовать предложение else с другим последовательным оператором sequential-statement, который исполняется, если булево выражение имеет значение false. В САПР Quartus II рекомендуется использовать следующий синтаксис оператора if (шаблон):

IF___expression THEN

___statement;

___statement;

ELSIF_____expression THEN

___statement;

___statement;

ELSE

___statement;

___statement;

END IF;

Счетчик команд ip и регистр r при инициализации системы по сигналу Reset устанавливаются в состояние 0, после чего производит счет адресов памяти программ хранимых в ПЗУ. Регистр r выполняет функцию стека, в который заносится прежнее состояние счетчика команд. Из шины cmd[10..0], для счетчика команд выделяется поле cop[10..8] и поле data[7..0]. Поле cop означает код операции, который используется для идентификации команд JMP, JMPZ и CALL. Для команды RET поле cop не формируется, а задается полный адрес на шине cmd "11000000000", это связано с тем, что 8 младших бит для команд JMP, JMPZ и CALL могут принимать любые значения, а для команды RET только указанный. Поле data содержит 8-разрядный операнд, который загружается в регистр команд.

ПЗУ реализовано с использованием мегафункции LPM_ROM. В табл.2 представлены сведения по общему числу задействованный ресурсов ПЛИС. В обоих случаях проект отображается в ПЛИС APEX20KE. На рис.5 показано тестирование процессора.

X-

X-

cmd[10..0j •

1(7,.0|

ipf7,.0}

-> *Р-0|

<Jata[7.-.0]-

у «л»?..?

Рис.4. Тестовая схема процессора без использования управляющего автомата с асинхронным ПЗУ в графическом редакторе САПР ПЛИС Оиаііш II

Name Value at Ops Dps 20.0 ns 40.0 ns 60.0 ns 80.0 ns 100.0 ns 120.0 ns 140.0 ns 160.0 ns 180.0 ns

S# clear H1 H

!& dk HO I “

m 0 cmd H 401 I 1 ; 51 1 305 At 3 404 6ti № 4&Є 4{ 7 6t D 5 2 і

#  ip HQ0 : ш ft 02 Ql ft 0 Ok 0 5 0 К 0 3 1 щ

© 0 data H01 : 01 1 0 0 ft ote 0 7 0 1 2 • щ

# 0 a HOO ; ob G ft & 15 0 Є 07

© 0 b HOO 0 1  Щ

© 0 г H(ffi 0 I :02

Рис.5. Временные диаграммы работы процессора без использования управляющего автомата

с асинхронным ПЗУ

Врезка 2. Арифметически-логическое устройство процессора LIBRARY ieee; use ieee.std_logic_1164.all; use IEEE.std_logic_arith.all; use IEEE.std_logic_unsigned.all;

ENTITY alu IS PORT

(cmd : IN std_logic_vector (10 downto 0); clk,res : in std_logic;

a,b : inout std_logic_vector (7 downto 0)); END alu;

ARCHITECTURE a OF alu IS

signal regA,regB: std_logic_vector(7 downto 0);

BEGIN

PROCESS

BEGIN

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); when 1280 to 1535 => regB<=cmd(7 downto 0); when 1537=>regA<=regB; when 1538=>regB<=regA; when 1539=>regA<=regB; regB<=regA; when 1540=>regA<=regA+regB; when 1541=>regA<=regA-regB; when 1542=>regA<=regA and regB; when 1543=>regA<=regA or regB; when 1544=>regA<=regA xor regB; when 1545=>regA<=regA-1; when others=> a<=regA; b<=regB; end case; end if; a<=regA; b<=regB;

END PROCESS;

END a;

Врезка 3. Счетчик адресов памяти команд процессора с асинхронным сбросом

LIBRARY ieee;

USE ieee.std_logic_1164.all; use ieee.std_logic_unsigned.all;

use ieee.std_logic_arith.all;

ENTITY counter IS PORT(

Clk : in std_logic; reset : in std_logic;

cmd : in std_logic_vector (10 downto 0); a : inout std_logic_vector (7 downto 0); r : inout std_logic_vector (7 downto 0);

Qa,Qb : out std_logic_vector (7 downto 0));

END counter;

ARCHITECTURE a OF counter IS

SIGNAL pci,data: std_logic_vector (7 downto 0);

SIGNAL regA: std_logic_vector (7 downto 0);

SIGNAL cop: std_logic_vector (2 downto 0);

BEGIN

regA<=a;

cop<=cmd(10 downto 8); data<=cmd(7 downto 0);

-- cmd 11 bit wide -- 11 bit encoding -- JMP: 001 <data>

-- JMPZ: 010 <data>

-- CALL: 011 <data>

-- RET: 110 00000000

process

begin

if (reset = '1') then

pci <=(others=>'0'); r <=(others=>'0'); elsif (clk'event and clk='1') then if

cop="001" then pci<=data; elsif

(cop="010" and conv_integer(regA)=0) then

pci<=data;

elsif

cop="011" then r<=pci; pci<=data; elsif

cmd="11000000000" then pci<=r+1; else pci<=pci+1; end if;

end if; end process;

Qa <= pci;

Qb <=data; a<=regA;

END a;

Таблица 2

Номер проекта ПЛИС Общее число логических элементов Общее число используемых ESB-бит D-триггеров

С использованием EP20K3 0ETC144-1 198/1200 2S16/24576 32

управляющего автомата

Вариант с асинхронным EP20K30ETC144-1 164/1200 2S16/24576 32

ПЗУ

Рассмотрим вариант реализации

проектируемого процессора с использованием асинхронного ОЗУ (рис.6). Для этого воспользуемся мегафункцией ЬРМ_КАМ_Ю. Для того чтобы ОЗУ выполняло функцию ПЗУ, необходимо сигнал разрешения записи we “посадить” на землю, т.к. активным является сигнал высокого уровня, а сигнал разрешения вывода оШепаЪ подключить к питанию. На рис.7 показан файл конфигурации ОЗУ для тестирования команды JMPZ с кодом 0205Н. По

команде 0205H осуществляется переход по адресу, заданному младшим байтом команды (на адрес в ОЗУ под номером 5, где хранится команда 0403H), если содержимое регистра A равно нулю. Чтобы содержимое регистра А оказалось равным нулю, необходимо воспользоваться регистровыми командами 0405H и 0505H, для загрузки в регистры А и В числа 5, а затем с помощью команды 0605H (SUB A,B) осуществить операцию A-B (рис^).

Рис.6. Тестовая схема процессора без использования управляющего автомата с асинхронным ОЗУ в графическом редакторе САПР ПЛИС Оиаііш II

Aildr +0 +1 +2 +3 +4 +5 +G +7

00 50405 0505 0605 0505 0402 0403 0000 0000

Рис.7. Файл конфигурации ОЗУ для тестирования команды JMPZ

10.0 ns 20.0 ns 30.0 ns 40.0 ns 50.0 ns GO.Ons 70.0 n:

90.0 ns 100.0 ns 110

Рис.8. Временные диаграммы работы процессора с асинхронным ОЗУ. Тестирование команды !МР2

Данный вариант процессора, реализованный в базисе ПЛИС, можно отнести к классу Ы8С-процессоров, у которых все команды выполняются за один такт синхрочастоты. Процессор может быть модифицирован путем наращивания блока регистров, добавлением блока управления

прерываний, блока управления ввода/вывода и других функциональных блоков. Вариант с

асинхронным ПЗУ реализованный в ПЛИС АРЕХ20КЕ ЕР20К30ЕТС144-1 занимает всего лишь 13 % от общего числа логических элементов и способен работать на частоте 60 МГЦ.

Модифицированный вариант оказался на 3 % компактнее по числу задействованных ресурсов ПЛИС и способен работать с морально устаревшими сериями ПЛИС. Однако данная модель может быть вполне пригодной для учебных целей. Недостатком является невозможность поддержки современной концепции синхронного кодирования при разработке микропроцессорных ядер.

Литература

1. Сергиенко А.М. УИБЬ для проектирования

вычислительных устройств. - Киев: ЧП

”Корнейчук”, ООО “ТИД “ДС”, 2003.- 208 с.

2. Зотов В.Ю. Проектирование встраиваемых микропроцессорных систем на основе ПЛИС фирмы Х1ЬШХ. - М.: Горячая линия - Телеком, 2006. -520 с.

3. Тарасов И. Проектирование

конфигурируемых процессоров на базе ПЛИС. Часть I // Компоненты и технологии, 2006, N2.

4. Тарасов И. Проектирование

конфигурируемых процессоров на базе ПЛИС. Часть II // Компоненты и технологии, 2006, N3.

5. Каршенбойм И. Микропроцессор своими руками // Компоненты и технологии, 2002, N6-7.

6. Каршенбойм И. Микропроцессор своими руками - 2. Битовый процессор // Компоненты и технологии, 2003, N7-8.

Воронежский государственный технический университет ОАО «Конструкторско-Технологический Центр “Электроника”»

DESIGNING OF MICROPROCESSOR NUCLEUS FOR REALIZATION IN FIELD-PROGRAMMABLE GATE ARRAYS

A.V. Strogonov, A.I. Buslov, O.A. Zolotuhina, S.A.Tsybin

In clause designing microprocessor nucleus with use hardware description language for realization in basis of field-

programmable gate arrays is considered

Key words: the microprocessor, system of the commands, the managing automatic device