ВиМТ (курсовая)
.pdfena:in std_logic; ctrl:in std_logic; sbst:in std_logic;
data_out:out std_logic_vector(7 downto 0)
);
end reg_sb;
architecture arch of reg_sb 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; process(ctrl,sbst)
begin
if(ctrl='1')then
if(sbst='0')then data_out<=regist;
elsif(sbst='1')then data_out<=not(regist)+"00000001";
elsif(ctrl='0')then data_out<="00000000";
end if; end if;
end process;
end arch;
11
Диаграмма работы блока Reg U:
12
4. Формирование блока арифметико-логического устройства.
Последний из синтезируемых блоков – АЛУ. В нашем случае АЛУ состоит из 8-разрядного сумматора (add8), пары мультиплексоров (ms4e) и три триггера (dff), переноса (fc), для хранения битов флагов нуля (fz) и знака (fzn). Сумматор строится на основе 8-ми разрядного сумматора (add8). На входы сумматора могут поступать данные с выходов регистров соответствующего блока. Для выбора нужных операндов строим два мультиплексора на четыре направления каждый.
Схема 4.1 - Блок ALU
Код для однозарядного сумматора без выхода переноса add1:
library ieee;
use ieee.std_logic_1164.all; entity add1 is
port(a1,b1:in BIT;c1,s1:out BIT); end add1;
architecture struct_1 of add1 is begin
s1<=((a1 and(not b1))or((not a1)and b1)); c1<=a1 and b1;
end struct_1;
Код для однозарядного сумматора, имеющий вход переноса add11:
library ieee;
use ieee.std_logic_1164.all; entity add11 is
port(a2,b2,c1:in BIT;c2,s2:out BIT); end add11;
architecture struct_1 of add11 is begin
s2<=(a2 xor b2)xor c1;
c2<=(a2 and b2)or((a2 xor b2)and c1); end struct_1;
13
Код для 8-зарядного сумматора add8:
library ieee;
use ieee.std_logic_1164.all; entity add8 is
port(a,b:in bit_vector(7 downto 0); s:out bit_vector(7 downto 0); c:out bit);
end add8;
architecture structural of add8 is component add1
port(a1,b1:in BIT;c1,s1:out BIT); end component;
component add11
port(c1,a2,b2:in BIT;c2,s2:out BIT); end component;
signal c_in:bit_vector(6 downto 0); begin
p0:add1
port map(a1=>a(0),b1=>b(0),c1=>c_in(0),s1=>s(0)); p1:add11
port map(c1=>c_in(0),a2=>a(1),b2=>b(1),c2=>c_in(1),s2=>s(1)); p2:add11
port map(c1=>c_in(1),a2=>a(2),b2=>b(2),c2=>c_in(2),s2=>s(2)); p3:add11
port map(c1=>c_in(2),a2=>a(3),b2=>b(3),c2=>c_in(3),s2=>s(3)); p4:add11
port map(c1=>c_in(3),a2=>a(4),b2=>b(4),c2=>c_in(4),s2=>s(4)); p5:add11
port map(c1=>c_in(4),a2=>a(5),b2=>b(5),c2=>c_in(5),s2=>s(5)); p6:add11
port map(c1=>c_in(5),a2=>a(6),b2=>b(6),c2=>c_in(6),s2=>s(6)); p7:add11
port map(c1=>c_in(6),a2=>a(7),b2=>b(7),c2=>c,s2=>s(7)); end structural;
Код для мультиплексора ms4e:
library ieee;
use ieee.std_logic_1164.all; entity ms4e is
port(
adr_i:in std_logic_vector(1 downto 0); k_i:in std_logic_vector(7 downto 0); l_i:in std_logic_vector(7 downto 0); m_i:in std_logic_vector(7 downto 0); n_i:in std_logic_vector(7 downto 0); en:in std_logic;
data_out:out std_logic_vector(7 downto 0)); end ms4e;
architecture BBB of ms4e is begin process(adr_i)
begin
if(en='0')then data_out<="00000000"; elsif(en='1') then
case adr_i is
when "00"=>data_out<=k_i; when "01"=>data_out<=l_i; when "10"=>data_out<=m_i; when "11"=>data_out<=n_i;
end case; end if;
end process;
end;
14
Диаграмма работы блока ALU:
15
5. Реализация процессора.
Теперь необходимо аккуратно собрать созданные ранее блоки в единое целое
– процессор, произвести верификацию полученного проекта и, если нас удовлетворяет отчет симулятора, реализовать полученное устройство в кристалле Cyclone EP1C6T144C8 на лабораторном макете, используя Pin Planner. При этом нам необходимо вывести содержимое регистров R1 и R2 и флагов на имеющуюся в макете индикацию, синхроимпульсы получать с кнопки, а сигнал разрешения подавать с тумблера.
Схема 5.1 - Процессор
Схема 5.2 - Подключение процессора
16
На процессор синхроимпульсы поступают с кнопки. Флаги выводятся на светодиоды, а содержимое регистров – на сегменты индикаторы.
Описание блоков:
▪antiring – антидребезговый триггер.
▪lab51 – процессор.
▪multiplexor – мультиплексор, определяющий, какая информация на какой из сегментов макета будет выведена.
▪decoder – устройство, преобразующее шестнадцатеричное число в код числа сегмент.
Формат вывода: seg[7..0] = {dp, a, b, c, d, e, f, g}.
Описание подключаемых в макете входов и выходов:
▪clk – вход синхронизации.
▪fc – флаг переноса.
▪fzn – флаг знака.
▪fz – флаг нуля.
▪col[3..0] – номер сегмента, на который будет выведено содержимое регистра.
▪seg[7..0] – декодированное содержимое регистра .
Код для антидребезгового триггера antiring:
module antiring( input clock, input r, input s, output reg q
);
parameter LENGTH=20; reg [LENGTH:0] delayr; reg [LENGTH:0] delays; wire delayed_r;
wire delayed_s;
always @(posedge clock or negedge r) begin
if(r==0)
delayr<=0;
else
if(!delayr[LENGTH])
delayr<=delayr+1;
end
17
always @(posedge clock or negedge s) begin
if(s==0)
delays<=0;
else
if(!delays[LENGTH])
delays<=delays+1;
end
assign delayed_r=delayr[LENGTH]?0:1; assign delayed_s=delays[LENGTH]?0:1; always @(posedge clock)
q<=delayed_s&(!delayed_r); endmodule
Код для управляющего выводом мультиплексора multiplexor:
module multiplexor( input clk,
input [(WIDTH-1):0] data0, input [(WIDTH-1):0] data1, input [(WIDTH-1):0] data2, input [(WIDTH-1):0] data3,
output [3:0]columns,
output [(WIDTH-1):0] outputdata
);
parameter WIDTH=15; parameter DIVISOR=15;
reg [(DIVISOR-1):0] counter; wire [1:0] select;
assign select=counter[(DIVISOR-1):(DIVISOR-2)];
always @(posedge clk) counter<=counter+1;
assign outputdata=(select[0])?(select[1]?data3:data1):(select[1]?data2:data0); assign columns=(1<<select);
endmodule
Код преобразующего шестнадцатеричное число в код устройства decoder:
module decoder(
input [3:0] indata, input dp,
output [8:0] outdata
);
reg [7:0] routdata;
always @(indata) |
|
case (indata) |
|
// |
PKFEDCBA |
4'h0: routdata=8'b00111111; 4'h1: routdata=8'b00000110; 4'h2: routdata=8'b11011011; 4'h3: routdata=8'b10001111; 4'h4: routdata=8'b11100110; 4'h5: routdata=8'b11101101; 4'h6: routdata=8'b11111101; 4'h7: routdata=8'b00000111; 4'h8: routdata=8'b11111111;
18
4'h9: routdata=8'b11101111; 4'ha: routdata=8'b11110111; 4'hb: routdata=8'b11111100; 4'hc: routdata=8'b00111001; 4'hd: routdata=8'b11011110; 4'he: routdata=8'b01111001; 4'hf: routdata=8'b01110001;
endcase
assign outdata={dp,routdata};
endmodule
Выводы:
Микропроцессор был смоделирован успешно, все команды выполняются верно.
В процессе моделирования были получены навыки программирования таких составных частей микропроцессора, как устройство управления (Control Unit), в состав которого входят блок памяти инструкций (Instruction Unit) и блок дешифрации команд (Decoder Unit), и исполнительное устройство (Execution Unit), в состав которого входят блок регистров (Register Unit) и арифметико-логическое устройство (Arithmetic and Logic Unit).
19