Разработка и функционально-временное моделирование средствами САПР QUARTUS II блока регистров общего назначения и его схемотехнического окружения
МИНОБРНАУКИ
РОССИИ
Федеральное
государственное автономное образовательное учреждение высшего профессионального
образования
«ЮЖНЫЙ
ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»
ИНЖЕНЕРНАЯ
ТЕХНОЛОГИЧЕСКАЯ АКАДЕМИЯ В Г. ТАГАНРОГЕ
(ТРТИ Южного
федерального университета)
Факультет АВТОМАТИКИ
И ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
Кафедра
ВЫЧИСЛИТЕЛЬНОЙ ТЕХНИКИ
ОТЧЕТ
Лабораторная
работа №4
«Разработка
и функционально-временное моделирование средствами САПР QUARTUS II блока
регистров общего назначения и его схемотехнического окружения»
по учебной
дисциплине: «Микропроцессорные системы»
Проверил:
к.т.н., доцент, Пьявченко Алексей
Олегович
Выполнил:
студент гр.
А-41,
Фетисов А.В.
Таганрог,
2014 г.
Цель работы:
Изучение основ построения с применением VHDL и
методики отладки в САПР Quartus II регистровых запоминающих устройств общего
назначения, обладающих требуемыми параметрами и входящих в состав
вычислительных блоков микропроцессоров.
Постановка задачи.
В соответствии с вариантом
задания разработать в базисе ПЛИС Altera VHDL-описание модели регистрового
запоминающего устройства общего назначения, обладающего требуемыми параметрами.
Устройство входит в состав проектируемого в рамках цикла лабораторных работ
вычислительного блока микропроцессора. При разработке компонентов и всего РЗУ в
целом допускается смешанное VHDL-описание проекта, т.е. как структурное, так и
поведенческое описание.
Результаты разработки проекта
РЗУ на VHDL оформить в виде библиотечного компонента (пакета).
В качестве исходных данных
студенту перед проектированием задаются:
Ø n - число разрядов
регистра общего назначения из состава РЗУ;
Ø М - количество
n-разрядных регистровых ячеек общего назначения (РОН), составляющих РЗУ;
Ø Pin - число входных
информационных шин (портов) РЗУ, используемых для записи данных в его
внутренние n-разрядные ячейки;
Ø SHin - число
установленных по входам РЗУ параллельных многоразрядных сдвигателей (не превышает
числа входных портов);
Ø n1 - количество
сдвигателей в схеме на входах или выходах блока РОН;
Ø n2 - число
разрядов, на которые сдвигатель может сдвинуть двоичный код, установленный на
его входе. Причем в общем случае n2 может принимать числовое значение от 0 до n
(разрядность информационной шины порта РЗУ);
Ø Us - направление
сдвига, если последний разрешен, определяемое как R/L/U
(вправо/влево/универсально (или влево/ или вправо));
Ø Ts - тип сдвига
A/Ma/L.1/L.0/C/CC (арифметический (A), модифицированный арифметический (Ma),
логический с установкой 1 (L.1) или 0 (L.0) в освобождающиеся разряды,
циклический (С), циклический через признак С (CC));
Ø Pout - число
выходных информационных шин (портов) РЗУ, используемых для считывания данных из
его внутренних n-разрядных ячеек;
Ø SHout - число
установленных по выходам РЗУ параллельных многоразрядных сдвигателей (не
превышает числа входных портов);
Ø OEZ - наличие
буферов с Z-состоянием по выходу.
Задание.
VHDL код РОН 32 на 8:
--РОН 6 регистров ieee; ieee.std_logic_1164.all;
ieee.std_logic_arith.all; ieee.std_logic_signed.all;
entity RonParam is (: natural := 7
);( AI: in std_logic_vector (nR downto 0); --
входная данных шина A: in std_logic_vector (nR downto 0); -- входная данных
шина B_AI: in std_logic_vector (4 downto 0); -- адрес записи А_BI: in
std_logic_vector (4 downto 0); -- адрес записи В_AO: in std_logic_vector (4
downto 0); -- адрес чтения А_BO: in std_logic_vector (4 downto 0); -- адрес
чтения В_AI: in std_ulogic; -- разрешение записи А_BI: in std_ulogic; --
разрешение записи В_AO,EN_BO: in std_ulogic; -- разрешение чтения,RST: in
std_ulogic;: out std_logic_vector (nR downto 0); -- выходная шина А: out
std_logic_vector (nR downto 0) -- выходная шина В
); RonParam; RON of RonParam is TOutReg is array
(0 to 31) of std_logic_vector(nR downto 0); WR_RgB: std_logic_vector(31 downto
0); -- выбор регистра для записи по ВWR_RgA: std_logic_vector(31 downto 0); --
выбор регистра для записи по АDRg:TOutReg; -- регистр для считывания данных
-Выбор регистра для записи в РОН по шине BI :
process (ADR_BI, WR_BI)WR_BI = '1' thenADR_BI (4 downto 0) is "00000"
=> WR_RgB <= X"00000001";"00001" => WR_RgB <=
X"00000002";"00010" => WR_RgB <= X"00000004";"00011"
=> WR_RgB <= X"00000008";"00100" => WR_RgB <=
X"00000010";"00101" => WR_RgB <=
X"00000020";"00110" => WR_RgB <=
X"00000040";"00111" => WR_RgB <=
X"00000080";"01000" => WR_RgB <=
X"00000100";"01001" => WR_RgB <=
X"00000200";"01010" => WR_RgB <= X"00000400";"01011"
=> WR_RgB <= X"00000800";"01100" => WR_RgB <=
X"00001000";"01101" => WR_RgB <=
X"00002000";"01110" => WR_RgB <=
X"00004000";"01111" => WR_RgB <=
X"00008000";"10000" => WR_RgB <=
X"00010000";"10001" => WR_RgB <=
X"00020000";"10010" => WR_RgB <=
X"00040000";"10011" => WR_RgB <=
X"00080000";"10100" => WR_RgB <=
X"00100000";"10101" => WR_RgB <=
X"00200000";"10110" => WR_RgB <= X"00400000";"10111"
=> WR_RgB <= X"00800000";"11000" => WR_RgB <=
X"01000000";"11001" => WR_RgB <=
X"02000000";"11010" => WR_RgB <=
X"04000000";"11011" => WR_RgB <=
X"08000000";"11100" => WR_RgB <=
X"10000000";"11101" => WR_RgB <=
X"20000000";"11110" => WR_RgB <=
X"40000000";"11111" => WR_RgB <=
X"80000000";others => WR_RgB <= (others => '0'); -- иначе
0case;WR_RgB <= (others => '0'); -- иначе 0if;process DCB;
- Реализация блока регистров общего назначения и
- организация записи в выбранную ячейку :
process (CLK,BI,AI,RST) RST='1' then j in 0 to 31 loop
(j)<=(others=>'0'); loop;
-Изменим текущие значения регистров CLK='1' and
CLK'event then j in 0 to 31 loop -- Запись по AI более приоритетная
(WR_RgA(j)='1') then DRg(j)<=AI; (WR_RgB(j)='1') then DRg(j)<=BI; if;
loop; if; process;
- выбор источника и подключение его к шине АО
_AO: process (EN_AO,ADR_AO,DRg)EN_AO = '1' thenADR_AO (4 downto 0)
is"00000" => AO <= DRg(0);"00001" => AO <=
DRg(1);"00010" => AO <= DRg(2);"00011" => AO <=
DRg(3);"00100" => AO <= DRg(4);"00101" => AO <=
DRg(5);"00110" => AO <= DRg(6);"00111" => AO <=
DRg(7);"01000" => AO <= DRg(8);"01001" => AO <=
DRg(9);"01010" => AO <= DRg(10);"01011" => AO
<= DRg(11);"01100" => AO <= DRg(12);"01101" =>
AO <= DRg(13);"01110" => AO <= DRg(14);"01111"
=> AO <= DRg(15);"10000" => AO <=
DRg(16);"10001" => AO <= DRg(17);"10010" => AO
<= DRg(18);"10011" => AO <= DRg(19);"10100" =>
AO <= DRg(20);"10101" => AO <= DRg(21);"10110"
=> AO <= DRg(22);"10111" => AO <=
DRg(23);"11000" => AO <= DRg(24);"11001" => AO
<= DRg(25);"11010" => AO <= DRg(26);"11011" =>
AO <= DRg(27);"11100" => AO <= DRg(28);"11101"
=> AO <= DRg(29);"11110" => AO <=
DRg(30);"11111" => AO <= DRg(31); others => AO <= (others
=> '0'); case;AO <= (others => '0'); if;process RD_AO;
- выбор источника и подключение его к шине ВО
_BO: process (EN_BO,ADR_BO,DRg)EN_BO = '1' thenADR_BO (4 downto 0)
is"00000" => BO <= DRg(0);"00001" => BO <=
DRg(1);"00010" => BO <= DRg(2);"00011" => BO <=
DRg(3);"00100" => BO <= DRg(4);"00101" => BO <=
DRg(5);"00110" => BO <= DRg(6);"00111" => BO <=
DRg(7);"01000" => BO <= DRg(8);"01001" => BO <=
DRg(9);"01010" => BO <= DRg(10);"01011" => BO
<= DRg(11);"01100" => BO <= DRg(12);"01101" =>
BO <= DRg(13);"01110" => BO <= DRg(14);"01111"
=> BO <= DRg(15);"10000" => BO <=
DRg(16);"10001" => BO <= DRg(17);"10010" => BO
<= DRg(18);"10011" => BO <= DRg(19);"10100" =>
BO <= DRg(20);"10101" => BO <= DRg(21);"10110"
=> BO <= DRg(22);"10111" => BO <=
DRg(23);"11000" => BO <= DRg(24);"11001" => BO
<= DRg(25);"11010" => BO <= DRg(26);"11011" =>
BO <= DRg(27);"11100" => BO <= DRg(28);"11101"
=> BO <= DRg(29);"11110" => BO <=
DRg(30);"11111" => BO <= DRg(31); others => BO <= (others
=> '0'); case;BO <= (others => '0');if;process RD_BO;RON;
Получившийся параметрический блок
РОН 32 на 8:
Результат функционирования РОН:
Схема входного арифметического
универсального циклического сдвигателя на 4 разрядов:
библиотека запоминающее устройство микропроцессор
VHDL
код входного свдигателя:
library
ieee;
use
ieee.std_logic_1164.all;ieee.std_logic_arith.all;
ieee.std_logic_signed.all;Shift_OUT is(FI: in std_logic_vector (8 downto 6);:
in std_logic_vector (1 downto 0);: in std_logic_vector (7 downto 0);: in
std_logic_vector (2 downto 0);: out std_logic_vector (7 downto 0)
);Shift_OUT;SHIFT of Shift_OUT is:
process(FI, MI, DI, NI) MF : std_logic_vector (4 downto 0);BUF :
std_logic_vector (7 downto 0);
begin:= MI & FI;
- сдвиг вправоMF = "01101"
thenNI is"001" => BUF := DI(0) & DI(7 downto
1);"010" => BUF := DI(1 downto 0) & DI(7 downto
2);"011" => BUF := DI(2 downto 0) & DI(7 downto
3);"100" => BUF := DI(3 downto 0) & DI(7 downto 4);others
=> BUF := DI; case;
- сдвиг влевоMF = "01111"
thenNI is"001" => BUF := DI(6 downto 0) &
DI(7);"010" => BUF := DI(5 downto 0) & DI(7 downto
6);"011" => BUF := DI(4 downto 0) & DI(7 downto
5);"100" => BUF := DI(3 downto 0) & DI(7 downto 4);others
=> BUF := DI; case;:= DI;if;<= BUF;process;SHIFT; library
ieee;ieee.std_logic_1164.all;ieee.std_logic_arith.all;
ieee.std_logic_signed.all;Shift_OUT is(FI: in std_logic_vector (8 downto 6);:
in std_logic_vector (1 downto 0);: in std_logic_vector (7 downto 0);: in
std_logic_vector (2 downto 0);: out std_logic_vector (7 downto 0)
begin:= MI & FI;
- сдвиг вправоMF = "01101"
thenNI is"001" => BUF := DI(0) & DI(7 downto
1);"010" => BUF := DI(1 downto 0) & DI(7 downto
2);"011" => BUF := DI(2 downto 0) & DI(7 downto
3);"100" => BUF := DI(3 downto 0) & DI(7 downto 4);others
=> BUF := DI; case;
- сдвиг влевоMF = "01111"
thenNI is"001" => BUF := DI(6 downto 0) &
DI(7);"010" => BUF := DI(5 downto 0) & DI(7 downto
6);"011" => BUF := DI(4 downto 0) & DI(7 downto
5);"100" => BUF := DI(3 downto 0) & DI(7 downto 4);others
=> BUF := DI; case;:= DI;if;<= BUF;process;SHIFT;
Схема РЗУ:
VHDL код
РЗУ:
-- Copyright (C) 1991-2010 Altera
Corporation
- Your use of Altera Corporation's
design tools, logic functions
- and other software and tools, and
its AMPP partner logic
- functions, and any output files
from any of the foregoing
- (including device programming or
simulation files), and any
- associated documentation or
information are expressly subject
- to the terms and conditions of the
Altera Program License
- Subscription Agreement, Altera
MegaCore Function License
- Agreement, or other applicable
license agreement, including,
- without limitation, that your use
is for the sole purpose of
- programming logic devices
manufactured by Altera and sold by
- Altera or its authorized
distributors. Please refer to the
- applicable agreement for further
details.
- PROGRAM"Quartus II"
- CREATED"Tue May 20 15:35:09
2014"ieee;ieee.std_logic_1164.all; work;rzu IS
(: IN STD_LOGIC;: IN STD_LOGIC;_AI :
IN STD_LOGIC;_BI : IN STD_LOGIC;_AO : IN STD_LOGIC;_BO : IN STD_LOGIC;_AI : IN
STD_LOGIC_VECTOR(4 DOWNTO 0);_AO : IN STD_LOGIC_VECTOR(4 DOWNTO 0);_BI : IN
STD_LOGIC_VECTOR(4 DOWNTO 0);_BO : IN STD_LOGIC_VECTOR(4 DOWNTO 0);: IN
STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: IN
STD_LOGIC_VECTOR(8 DOWNTO 6);: IN STD_LOGIC_VECTOR(1 DOWNTO 0);: IN
STD_LOGIC_VECTOR(2 DOWNTO 0);: OUT STD_LOGIC_VECTOR(7 DOWNTO 0);: OUT
STD_LOGIC_VECTOR(7 DOWNTO 0)
);rzu;bdf_type OF rzu IS ronparam(nR
: INTEGER
);(WR_AI : IN STD_LOGIC;_BI : IN
STD_LOGIC;_AO : IN STD_LOGIC;_BO : IN STD_LOGIC;: IN STD_LOGIC;: IN
STD_LOGIC;_AI : IN STD_LOGIC_VECTOR(4 DOWNTO 0);_AO : IN STD_LOGIC_VECTOR(4
DOWNTO 0);_BI : IN STD_LOGIC_VECTOR(4 DOWNTO 0);_BO : IN STD_LOGIC_VECTOR(4
DOWNTO 0);: IN STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC_VECTOR(7 DOWNTO 0);:
OUT STD_LOGIC_VECTOR(7 DOWNTO 0);: OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);COMPONENT;shift_out(DI : IN
STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC_VECTOR(8 DOWNTO 6);: IN
STD_LOGIC_VECTOR(1 DOWNTO 0);: IN STD_LOGIC_VECTOR(2 DOWNTO 0);: OUT
STD_LOGIC_VECTOR(7 DOWNTO 0)
);COMPONENT;shift_out_a(DI : IN
STD_LOGIC_VECTOR(7 DOWNTO 0);: IN STD_LOGIC_VECTOR(8 DOWNTO 6);: IN
STD_LOGIC_VECTOR(1 DOWNTO 0);: IN STD_LOGIC_VECTOR(2 DOWNTO 0);: OUT
STD_LOGIC_VECTOR(7 DOWNTO 0)
);COMPONENT;: STD_LOGIC_VECTOR(7
DOWNTO 0);: STD_LOGIC_VECTOR(7 DOWNTO 0);v_inst : ronparamMAP(nR => 7
)MAP(WR_AI => WR_AI,_BI =>
WR_BI,_AO => EN_AO,_BO => EN_BO,=> CLK,=> RST,_AI => ADR_AI,_AO
=> ADR_AO,_BI => ADR_BI,_BO => ADR_BO,=> AI,=> BI,=>
Aout,=> Bout);v_inst1 : shift_outMAP(DI => Bout,=> I,=> M,=>
N,=> BO);v_inst2 : shift_out_aMAP(DI => Aout,=> I,=> M,=>
N,=> AO); bdf_type;
Вывод
В ходе выполнения данной лабораторной работы, я
с применением VHDL и методики отладки в САПР Quartus II сумел построить
параметрический блок РОН, входной и выходной сдвигатели. Затем собрал РЗУ
используя написанные библиотеки (РОН, сдвигатели).