- •Задание на моделирование
- •Описания лабораторных работ. Лабораторная работа №1. Формирование памяти инструкций.
- •Задание на работу в лаборатории.
- •Лабораторная работа №2. Формирование устройства управления.
- •Задание на работу в лаборатории.
- •Лабораторная работа № 3. Формирование блока регистров.
- •Задание на работу в лаборатории.
- •Лабораторная работа № 4. Формирование блока арифметико-логического устройства (алу).
- •Задание на работу в лаборатории.
- •Лабораторная работа № 5. Построение простейшего risc-процессора.
- •Задание на работу в лаборатории.
Описания лабораторных работ. Лабораторная работа №1. Формирование памяти инструкций.
Цель работы. Получение представления о формировании потока инструкций в RISC-процессоре. Ознакомление с программированием на VHDL.
Постановка задачи. Необходимо построить схему блока, содержащую память инструкций и программный счетчик. Блок памяти инструкций представлен в виде простейшего КЦУ, к выходу которого подключены два 8-разрядных регистра. Обращение к регистрам возможно при активном уровне «1» на разрешающем входе. На вход КЦУ поступают адреса от программного счетчика. Каждый адрес, таким образом, вызывает определенный программный код, который отображается в выходном буфере. Максимальный объем проектируемой памяти – восемь 16-разрядных ячеек, поэтому строим 4-разрядный счетчик, младший разряд которого формирует тактовую частоту для исполнительного блока, а три старших разряда – адреса на блок памяти. Проектируемая схема изображена на рис.1.1.
Задание на работу в лаборатории.
Открыть свою папку в пакете Quartus II и создать в ней проект для лабораторной работы №1.
Открыть VHDL-файл и записать в него текст прогр.1.1, ставя в соответствие каждому выделенному адресу сформированный код, записанный на лекции. Сохранить файл под именем raminst и установить его приоритет.
Откомпилировать файл программы и проверить с помощью временных диаграмм. На диаграммах установить интервалы: adr_i =20ns (20, 40 и 80 ns). Создать библиотечный модуль файла raminst.vhd.
Открыть файл графического редактора и, основываясь на работе в прошлом семестре, построить в нем синхронный 4-разрядный суммирующий счетчик. Сохранить файл под именем count и установить его приоритет.
Откомпилировать файл и проверить с помощью временных диаграмм. На диаграммах установить интервал sync =20ns. Создать библиотечный модуль файла count.bdf.
Открыть VHDL-файл и записать в него текст прогр.1.2 для 8-разрядного двухбуферного параллельного регистра. Сохранить файл под именем reg8 и установить его приоритет.
Откомпилировать файл и проверить с помощью временных диаграмм. На диаграммах установить интервал clk_i =20ns, ena и ctrl постоянно установить в «1», data_i сформировать произвольно. Создать библиотечный модуль файла reg8.vhd.
Открыть файл графического редактора и объединить в нем модули согласно рис.1.1. Сохранить файл под именем проекта, установить его приоритет.
Откомпилировать файл и проверить с помощью временных диаграмм. На диаграммах установить интервалы: sync =20ns, eninst=400ns. Продемонстрировать диаграммы преподавателю. Создать библиотечный модуль файла.
Отчет должен содержать: схему блока – рис.1.1, схему счетчика, программы для накопителя и регистров; временную диаграмму работы блока.
Прогр.1.1
library ieee;
use ieee.std_logic_1164.all;
entity raminst is
port(
adr_i: in bit_vector(3 downto 1);
data_out: out bit_vector(15 downto 0)
);
end raminst;
architecture BBB of raminst is
begin
p0: process (adr_i)
begin
case adr_i is
when "000"=>data_out<="0100000100010010";
when "001"=>data_out<="0100001000001110";
when "010"=>data_out<="1010011010000000";
when "011"=>data_out<="1000001011000000";
when others=>data_out<="0000000000000000";
end case;
end process;
end ;
Прогр.1.2
library ieee;
use ieee.std_logic_1164.all;
entity reg8 is
port(
data_i: in std_logic_vector(7 downto 0);
clk_i: in std_logic;
ena : in std_logic;
ctrl : in std_logic;
data_out: out std_logic_vector(7 downto 0)
);
end reg8;
architecture arch of reg8 is
signal regist: std_logic_vector(7 downto 0);
begin
process (clk_i)
begin
if(rising_edge(clk_i)) then
if(ena ='1') then
regist <= data_i;
end if;
end if;
end process;
data_out <= regist when ctrl = '1' else "ZZZZZZZZ";
end arch;