Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

ВиМТ (курсовая)

.pdf
Скачиваний:
2
Добавлен:
30.01.2019
Размер:
584.26 Кб
Скачать

ena: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