Logo Passei Direto
Buscar

Trabalho de ArqComp

User badge image

Enviado por Andressa Siq em

Esta é uma pré-visualização de arquivo. Entre para ver o arquivo original

ALU_16bits.vhd
library ieee;
use ieee.std_logic_1164.all;
entity ALU_16bits is 
 port (EntA,EntB:in std_logic_vector (15 downto 0);
 EntF: in std_logic_vector (1 downto 0);
 saiS:out std_logic_vector (15 downto 0);
 SaiN,SaiZ: out std_logic);
end ALU_16bits;
architecture estrutural of ALU_16bits is
 component ALU_Algoritmica_1bit
 port (EntA,EntB:in std_logic;
 Cin: in std_logic;
 EntF: in std_logic_vector (1 downto 0);
 SaiS:out std_logic;
 Cout: out std_logic);
 end component;
 
 signal S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11,S12,S13,S14,S15,S16: std_logic;
 signal Cout1,Cout2,Cout3,Cout4,Cout5,Cout6,Cout7,Cout8,Cout9,Cout10,Cout11,Cout12,Cout13,Cout14,Cout15,Cout16: std_logic;
begin
 M00:ALU_Algoritmica_1bit port map (EntA(0),EntB(0),'0',EntF,S1,Cout1);
 M01:ALU_Algoritmica_1bit port map (EntA(1),EntB(1),Cout1,EntF,S2,Cout2);
 M02:ALU_Algoritmica_1bit port map (EntA(2),EntB(2),Cout2,EntF,S3,Cout3);
 M03:ALU_Algoritmica_1bit port map (EntA(3),EntB(3),Cout3,EntF,S4,Cout4);
 M04:ALU_Algoritmica_1bit port map (EntA(4),EntB(4),Cout4,EntF,S5,Cout5);
 M05:ALU_Algoritmica_1bit port map (EntA(5),EntB(5),Cout5,EntF,S6,Cout6);
 M06:ALU_Algoritmica_1bit port map (EntA(6),EntB(6),Cout6,EntF,S7,Cout7);
 M07:ALU_Algoritmica_1bit port map (EntA(7),EntB(7),Cout7,EntF,S8,Cout8);
 M08:ALU_Algoritmica_1bit port map (EntA(8),EntB(8),Cout8,EntF,S9,Cout9);
 M09:ALU_Algoritmica_1bit port map (EntA(9),EntB(9),Cout9,EntF,S10,Cout10);
 M10:ALU_Algoritmica_1bit port map (EntA(10),EntB(10),Cout10,EntF,S11,Cout11);
 M11:ALU_Algoritmica_1bit port map (EntA(11),EntB(11),Cout11,EntF,S12,Cout12);
 M12:ALU_Algoritmica_1bit port map (EntA(12),EntB(12),Cout12,EntF,S13,Cout13);
 M13:ALU_Algoritmica_1bit port map (EntA(13),EntB(13),Cout13,EntF,S14,Cout14);
 M14:ALU_Algoritmica_1bit port map (EntA(14),EntB(14),Cout14,EntF,S15,Cout15);
 M15:ALU_Algoritmica_1bit port map (EntA(15),EntB(15),Cout15,EntF,S16,Cout16);
 
 saiS(0) <= S1;
 saiS(1) <= S2;
 saiS(2) <= S3;
 saiS(3) <= S4;
 saiS(4) <= S5;
 saiS(5) <= S6;
 saiS(6) <= S7;
 saiS(7) <= S8;
 saiS(8) <= S9;
 saiS(9) <= S10;
 saiS(10) <= S11;
 saiS(11) <= S12;
 saiS(12) <= S13;
 saiS(13) <= S14;
 saiS(14) <= S15;
 saiS(15) <= S16;
 
 saiN <= S16;
 
 saiZ <= (not(((((((((((((((S16 or S15) or S14) or S13) or S12) or S11) or S10) or S9) or S8) or S7) or S6) or S5) or S4) or S3) or S2) or S1));
 
 end estrutural;
library ieee;
use ieee.std_logic_1164.all;
entity testbenchALU_16 is
end testbenchALU_16;
architecture teste of testbenchALU_16 is
 component ALU_16bits
 port (EntA,EntB:in std_logic_vector (15 downto 0);
 EntF: in std_logic_vector (1 downto 0);
 saiS:out std_logic_vector (15 downto 0);
 SaiN,SaiZ: out std_logic);
 end component;
signal sigA,sigB,sigS:std_logic_vector (15 downto 0);
signal sigF:std_logic_vector (1 downto 0);
signal sigN,sigZ:std_logic;
begin
 comp:ALU_16bits port map (sigA,sigB, sigF,sigS, sigN, sigZ);
 process
 begin
 sigA<="0000000000000000","0000000000000001" after 2 ns;
 sigB<="0000000000000001","0000000000000011" after 4 ns;
 sigF<="00","01" after 6 ns,"11" after 8 ns, "10" after 10 ns;
 wait;
 end process;
end teste;
ALU_algoritmica_1bit.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity ALU_Algoritmica_1bit is
 port(EntA,EntB,Cin:in std_logic;
 EntF: in std_logic_vector (1 downto 0);
 SaiS: out std_logic;
 Cout: out std_logic);
end ALU_Algoritmica_1bit;
architecture ALU_Algo_1bit of ALU_Algoritmica_1bit is
 begin
 process (EntA, EntB, Cin, EntF)
 begin
 --Caso seja a opcao 00 = A+B
 if EntF(1)='0' and EntF(0)='0' then
 if Cin = '0' then
 if EntA = '0' then
 if EntB = '0' then
 SaiS <= '0';
 Cout <= '0';
 else
 SaiS <= '1';
 Cout <= '0';
 end if;
 else
 if EntB = '0' then
 SaiS <= '1';
 Cout <= '0';
 else
 SaiS <= '0';
 Cout <= '1';
 end if;
 end if;
 else
 if EntA = '0' then
 if EntB = '0' then
 SaiS <= '1';
 Cout <= '0';
 else
 SaiS <= '0';
 Cout <= '1';
 end if;
 else
 if EntB = '0' then
 SaiS <= '0';
 Cout <= '1';
 else
 SaiS <= '1';
 Cout <= '1';
 end if;
 end if;
 end if;
 --Caso seja a opcao 01 = AB
 elsif EntF(1) = '0' and EntF(0) = '1' then
 if EntA='1' and EntB='1' then
 SaiS <= '1';
 else
 SaiS <= '0';
 end if;
 --Caso seja a opcao 10 = A
 elsif EntF(1) = '1' and EntF(0) = '0' then
 if EntA = '1' then
 SaiS <= '1';
 else
 SaiS <= '0';
 end if;
 --Caso seja a opcao 11 = NOT(A)
 else
 if EntA = '0' then
 SaiS <= '1';
 else
 SaiS <= '0';
 end if;
 end if;
 end process;
 end ALU_Algo_1bit;
 
library ieee;
use ieee.std_logic_1164.all;
entity testbenchALU_1bit_algoritimica is
end testbenchALU_1bit_algoritimica;
architecture teste of testbenchALU_1bit_algoritimica is
 component ALU_Algoritmica_1bit
 port (EntA,EntB,Cin:in std_logic;
 EntF: in std_logic_vector (1 downto 0);
 SaiS: out std_logic;
 Cout: out std_logic);
 end component;
 
signal sigA,sigB,sigCin,sigS, sigCout: std_logic;
signal sigF: std_logic_vector(1 downto 0);
 
 begin
 comp: ALU_Algoritmica_1bit port map (sigA,sigB, sigCin, sigF, sigS, sigCout);
 process
 begin
 sigA<='0','1' after 2 ns,'0' after 12 ns, '1' after 14 ns;
 sigB<='0','1' after 4 ns, '0' after 12 ns, '1' after 16 ns; 
 sigCin<='0','1' after 12 ns; 
 sigF<="00","01" after 6 ns,"11" after 8 ns, "10" after 10 ns, "00" after 14 ns,
 "01" after 20 ns, "11" after 22 ns,"10" after 24 ns;
 wait;
 end process;
end teste;
ALU_estrutural_1bit.vhd
library ieee;
use ieee.std_logic_1164.all;
entity ALU_estrutural_1bit is
 port(EntA,EntB,Cin:in std_logic;
 EntF: in std_logic_vector (1 downto 0);
 SaiS: out std_logic;
 Cout: out std_logic);
end ALU_estrutural_1bit ;
architecture estrutural of ALU_estrutural_1bit is
 component AND2
 port (E1,E2:in std_logic; S: out std_logic);
 end component;
 component INV
 port (E: in std_logic; S: out std_logic);
 end component;
 --component XOR2
 -- port (E1,E2:in std_logic; S: out std_logic);
 --end component;
 component OR2
 port (E1,E2:in std_logic; S: out std_logic);
 end component;
signal S1,S2,S3,S4,S5,S6,S7,S8,S9,S10: std_logic;
signal S11,S12,S13,S14,S15,S16,S17,S18,S19,S20: std_logic;
begin
 -- calculo dos inversos das entradas de controle - NOT(F0),NOT(F1)
 P1: INV port map (EntF(1),S1);
 P2: INV port map (EntF(0),S2);
 -- combinacoes dos controle - F0,F1,NOT(F0),NOT(F1) 
 P3: AND2 port map (S1,S2,S3);
 P4: AND2 port map (S1,EntF(0),S4);
 P5: AND2 port map (EntF(1),S2,S5);
 P6: AND2 port map (EntF(1),EntF(0),S6);
 --COMBINACAO DAS ENTRADAS - A+B, AB, NOT(A)
 P7: OR2 port map (EntA,EntB,S7); 
 P8: AND2 port map (EntA,EntB,S8);
 P9: INV port map (EntA,S9);
 --COMBINACAO DA ENTRADA A+B + Cin 
 P10: AND2 port map (S7,Cin,S10);
 --Combinacao entre os controle e entradas
 P11: AND2 port map (S3,S10,S11);
 P12: AND2 port map (S4,S8,S12);
 P13: AND2 port map (S5,S9,S13);
P14: AND2 port map (S6,EntA,S14); 
 --COMBINACAO DE TODOS OS RESULTADOS
 P15: OR2 port map (S11,S12,S15);
 P16: OR2 port map (S15,S13,S16);
 P17: OR2 port map (S16,S14,SaiS);
 
 --PARA CALCULO DO cOUT
 P18: OR2 port map (S10,S8,Cout);
END estrutural;
library ieee;
use ieee.std_logic_1164.all;
entity testBenchALU_estrutural_1bit is
end testBenchALU_estrutural_1bit;
architecture teste_estrutural of testBenchALU_estrutural_1bit is
 component ALU_estrutural_1bit
 port (EntA,EntB,Cin:in std_logic;
 EntF: in std_logic_vector (1 downto 0);
 SaiS: out std_logic;
 Cout: out std_logic);
 end component;
 
 signal sigA,sigB,sigCin,sigS, sigCout: std_logic;
 signal sigF: std_logic_vector(1 downto 0);
begin
 comp: ALU_estrutural_1bit port map (sigA,sigB, sigCin, sigF, sigS, sigCout);
 process
 begin
 sigA<='0','1' after 2 ns,'0' after 12 ns, '1' after 14 ns;
 sigB<='0','1' after 4 ns, '0' after 12 ns, '1' after 16 ns; 
 sigCin<='0','1' after 12 ns; 
 sigF<="00","01" after 6 ns,"11" after 8 ns, "10" after 10 ns, "00" after 14 ns,
 "01" after 20 ns, "11" after 22 ns,"10" after 24 ns;
 wait;
 end process;
end teste_estrutural;
 
ALU_fluxo_1bit.vhd
library ieee;
use ieee.std_logic_1164.all;
entity ALU_fluxo_1bit is
 port(EntA,EntB,Cin:in std_logic;
 EntF: in std_logic_vector (1 downto 0);
 SaiS: out std_logic;
 Cout: out std_logic);
end ALU_fluxo_1bit;
architecture fluxo of ALU_fluxo_1bit is
 begin
 
 saiS<= ((not(EntF(1)) and not(EntF(0)) and((EntA xor EntB) xor Cin)) or
 (not(EntF(1)) and EntF(0)and EntA and EntB) or
 (EntF(1) and not(EntF(0)) and EntA) or 
 (EntF(1) and EntF(0) and not(EntA)));
 
 Cout<= (not(EntF(0)) and not(EntF(1)) and ((EntA and EntB) xor (Cin and (EntA xor EntB))));
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity testbenchALU_fluxo_1bit is
end testbenchALU_fluxo_1bit;
architecture teste of testbenchALU_fluxo_1bit is
 component ALU_fluxo_1bit
 port (EntA,EntB,Cin:in std_logic;
 EntF: in std_logic_vector (1 downto 0);
 SaiS: out std_logic;
 Cout: out std_logic);
 end component;
 
signal sigA,sigB,sigCin,sigS,sigCout: std_logic;
signal sigF: std_logic_vector(1 downto 0);
 
 begin
 comp: ALU_fluxo_1bit port map (sigA,sigB, sigCin, sigF, sigS, sigCout);
 
 process
 begin
 sigA<='0','1' after 2 ns,'0' after 12 ns, '1' after 14 ns;
 sigB<='0','1' after 4 ns, '0' after 12 ns, '1' after 16 ns; 
 sigCin<='0','1' after 12 ns; 
 sigF<="00","01" after 6 ns,"11" after 8 ns, "10" after 10 ns, "00" after 14 ns,
 "01" after 20 ns, "11" after 22 ns,"10" after 24 ns;
 wait;
 end process;
end teste;
Componentes.vhd
library ieee;
use ieee.std_logic_1164.all;
entity AND2 is
 port (E1,E2: in std_logic; S: out std_logic);
end AND2;
architecture fluxo of AND2 is
 begin
 S <= E1 AND E2;
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity INV is
 port (E:in std_logic; S: out std_logic);
end INV;
architecture fluxo of INV is
 begin
 S <= not (E);
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity OR2 is
 port (E1,E2: in std_logic; S: out std_logic);
end OR2;
architecture fluxo of OR2 is
 begin
 S <= E1 OR E2;
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity AND5 is
 port (E1,E2,E3,E4,E5: in std_logic; S: out std_logic);
end AND5;
architecture fluxo of AND5 is
 begin
 S <= E1 AND E2 AND E3 AND E4 and E5;
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity OR3 is
 port (E1,E2,E3: in std_logic; S: out std_logic);
end OR3;
architecture fluxo of OR3 is
 begin
 S <= E1 OR E2 or E3;
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity AND3 is
 port (E1,E2,E3: in std_logic; S: out std_logic);
end AND3;
architecture fluxo of AND3 is
 begin
 S <= E1 AND E2 AND E3;
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity OR4 is
 port (E1,E2,E3,E4: in std_logic; S: out std_logic);
end OR4;
architecture fluxo of OR4 is
 begin
 S <= E1 OR E2 or E3 or E4;
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity XOR2 is
 port (E1,E2: in std_logic; S: out std_logic);
end XOR2;
architecture fluxo of XOR2 is
 begin
 S <= E1 XOR E2;
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity NOR2 is
 port (E1,E2: in std_logic; S: out std_logic);
end NOR2;
architecture fluxo of NOR2 is
 begin
 S <= E1 NOR E2;
end fluxo;
Controlador.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_arith.all;
entity controlador_cpu is
	port(n,z,clk: in std_logic;
		amux,mbr,mar,rd,wr,enc: out std_logic;
		ula,sh:out std_logic_vector(1 downto 0);
		a,b,c:out std_logic_vector(3 downto 0)
	);												
end controlador_cpu;
architecture comportamental of controlador_cpu is
	signal cond:std_logic_vector(1 downto 0);
	signal estado_atual,addr:unsigned(7 downto 0);
	begin
combinacao_de_estados: process (estado_atual)
		begin
		case estado_atual is
		 
			--mar:=pc; rd;
			when "00000000" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='1';rd<='1';wr<='0';enc<='0';c<="0000";b<="0000";a<="0000";
				addr <= "00000000";
			
			--pc:=pc+1; rd;
			when "00000001" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='1';c<="0000";b<="0110";a<="0000";
				addr <= "00000000";
			
			--ir:=mbr; if n then goto 28;
			when "00000010" => amux<='1'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0011";b<="0000";a<="0000";
				addr <= "00011100";
			
			--tir:=lshift(ir+ir); if n then goto 19;
			when "00000011" => amux<='0'; cond<="01"; ula<="00";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0011";a<="0011";
				addr <= "00010011";
			
			--tir:=lshift(tir); if n then goto 11;
			when "00000100" => amux<='0'; cond<="01"; ula<="10";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0000";a<="0100";
				addr <= "00001011";
			
			--alu:=tir; if n then goto 9;
			when "00000101" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00001001";
			
			--mar:=ir; rd;
			when "00000110" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='1';rd<='1';wr<='0';enc<='1';c<="0000";b<="0011";a<="0000";
				addr <= "00000000";
			
			--rd;
			when "00000111" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='0';c<="0000";b<="0000";a<="0000";
				addr <= "00000000";
			
			--ac := mbr; goto 0;
			when "00001000" => amux<='1'; cond<="11"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0001";b<="0000";a<="0000";
				addr <= "00000000";
			
			--mar := ir; mbr := ac; wr;
			when "00001001" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='1';
				mar<='1';rd<='0';wr<='1';enc<='0';c<="0000";b<="0011";a<="0001";
				addr <= "00000000";
			
			--wr; goto 0;
			when "00001010" => amux<='0'; cond<="11"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='1';enc<='0';c<="0000";b<="0000";a<="0000";
				addr <= "00000000";
			
			--alu := tir; if n then goto 15;
			when "00001011" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00001111";
			
			--mar:=ir; rd;
			when "00001100" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='1';rd<='1';wr<='0';enc<='0';c<="0000";b<="0011";a<="0000";
				addr <= "00000000";
			
			--rd;
			when "00001101" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='0';c<="0000";b<="0000";a<="0000";
addr <= "00000000";
			
			--ac := mbr + ac; goto 0;
			when "00001110" => amux<='1'; cond<="11"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0001";b<="0001";a<="0000";
				addr <= "00000000";
			
			--mar := ir; rd;
			when "00001111" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='1';rd<='1';wr<='0';enc<='1';c<="0000";b<="0011";a<="0000";
				addr <= "00000000";
			
			--ac := ac + 1; rd;
			when "00010000" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='1';c<="0001";b<="0001";a<="0110";
				addr <= "00000000";
			
			--a := inv (mbr);
			when "00010001" => amux<='1'; cond<="00"; ula<="11";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="0000";a<="0000";
				addr <= "00000000";
			
			--ac := ac + a; goto 0;	
			when "00010010" => amux<='0'; cond<="11"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='1';c<="0001";b<="0001";a<="1010";
				addr <= "00000000";
			
			--tir:=lshift(tir); if n then goto 25;
			when "00010011" => amux<='0'; cond<="01"; ula<="10";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0000";a<="0100";
				addr <= "00011001";
			
			--alu := tir; if n then goto 23;
			when "00010100" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00010111";
			
			--alu := ac; if n then goto 0;
			when "00010101" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0001";
				addr <= "00000000";
			
			--pc := band(ir, amask); goto 0;
			when "00010110" => amux<='0'; cond<="11"; ula<="01";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0000";b<="0011";a<="1000";
				addr <= "00000000";
			
			--alu := ac; if z then goto 22;
			when "00010111" => amux<='0'; cond<="10"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0001";
				addr <= "00010110";
			
			--goto 0;					
			when "00011000" => amux<='0'; cond<="11"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0000";
				addr <= "00000000";
			
			--alu := tir; if n then goto 27;
			when "00011001" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00011011";
			
			--pc := band (ir, amask); goto 0;
			when "00011010" => amux<='0'; cond<="11"; ula<="01";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0000";b<="0011";a<="1000";
				addr <= "00000000";
			
			--ac := band (ir, amask); goto 0;
			when "00011011" => amux<='0'; cond<="11"; ula<="01";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0001";b<="0011";a<="1000";
				addr <= "00000000";
			
			--tir := lshift (ir + ir); if n then goto 40;
			when "00011100" => amux<='0'; cond<="01"; ula<="00";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0011";a<="0011";
				addr <= "00101000";
			
			--tir := lshift (tir); if n then goto 35;
			when "00011101" => amux<='0'; cond<="01"; ula<="10";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0000";a<="0100";
				addr <= "00100011";
			
			--alu := tir; if n then goto 33;
			when "00011110" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00100001";
			
			--a := ir + sp;
			when "00011111" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="0010";a<="0011";
				addr <= "00000111";
			
			--mar := a; rd; goto 7;
			when "00100000" => amux<='1'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0011";b<="0000";a<="0000";
				addr <= "00000111";
			
			--a := ir + sp;
			when "00100001" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="0010";a<="0011";
				addr <= "00000000";
			
			--mar := a; mbr := ac; wr; goto 10;
			when "00100010" => amux<='0'; cond<="11"; ula<="10";sh<="00";mbr<='1';
				mar<='1';rd<='0';wr<='1';enc<='0';c<="0000";b<="1010";a<="0001";
				addr <= "00001010";
			
			--alu := tir; if n then goto 38;
			when "00100011" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00100110";
			
			--a := ir + sp;
			when "00100100" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="0010";a<="0011";
				addr <= "00000000";
			
			--mar := a; rd; goto 13;
			when "00100101" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="0010";a<="0011";
				addr <= "00001101";
			
			--a := ir + sp;
			when "00100110" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="0010";a<="0011";
				addr <= "00000000";
			
			--mar := a; rd; goto 16;
			when "00100111" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="0010";a<="0011";
				addr <= "00001101";
			
			--tir := lshift (tir); if n then goto 46;
			when "00101000" => amux<='0'; cond<="01"; ula<="10";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0000";a<="0100";
				addr <= "00101110";
			
			--alu := tir; if n then goto 44;
			when "00101001" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00101100";
			
			--alu := ac; if n then goto 22;
			when "00101010" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0001";
				addr <= "00010110";
			
			--goto 0;
			when "00101011" => amux<='0'; cond<="11"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0000";
				addr <= "00000000";					
			
			--alu := ac; if z then goto 0;
			when "00101100" => amux<='0'; cond<="10"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0001";
				addr <= "00000000";
			
			--pc := band (ir, amask); goto 0;
			when "00101101" => amux<='0'; cond<="11"; ula<="01";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0000";b<="0011";a<="1000";
				addr <= "00000000";
			
			--tir := lshift (tir); if n then goto 50;
			when "00101110" => amux<='0'; cond<="01"; ula<="10";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0000";a<="0100";
				addr <= "00110010";
			
			--sp := sp + (-1);
			when "00101111" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0010";b<="0111";a<="0010";
				addr <= "00000000";
			
			--mar := sp; mbr := pc; wr;
			when "00110000" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='1';
				mar<='1';rd<='0';wr<='1';enc<='0';c<="0000";b<="0010";a<="0000";
				addr <= "00000000";
			
			--pc := band (ir + amask); wr; goto 0;
			when "00110001" => amux<='0'; cond<="11"; ula<="01";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='1';enc<='1';c<="0000";b<="0011";a<="1000";
				addr <= "00000000";
			
			--tir := lshift (tir); if n then goto 65;
			when "00110010" => amux<='0'; cond<="01"; ula<="10";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0000";a<="0100";
				addr <= "01000001";
			
			--tir := lshift (tir); if n then goto 59;
			when "00110011" => amux<='0'; cond<="01"; ula<="10";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0000";a<="0100";
				addr <= "00111011";
			
			--alu := tir; if n then goto 56;
			when "00110100" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00111000";
			
			--mar := ac; rd;
			when "00110101" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='1';rd<='1';wr<='0';enc<='0';c<="0000";b<="0001";a<="0000";
				addr <= "00000000";					
			
			--sp := sp + (-1); rd;
			when "00110110" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='1';c<="0010";b<="0111";a<="0010";
				addr <= "00000000";
			
			--mar := sp; wr; goto 10";
			when "00110111" => amux<='0'; cond<="11"; ula<="10";sh<="00";mbr<='0';
				mar<='1';rd<='0';wr<='1';enc<='0';c<="0000";b<="0010";a<="0000";
				addr <= "00001010";
			
			--mar := sp; sp := sp + 1; rd;
			when "00111000" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='1';rd<='1';wr<='0';enc<='1';c<="0010";b<="0110";a<="0010";
				addr <= "00000000";
			
			--rd;
			when "00111001" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='0';c<="0000";b<="0000";a<="0000";
				addr <= "00000000";
			
			--mar := ac; wr; goto 10";
			when "00111010" => amux<='0'; cond<="11"; ula<="10";sh<="00";mbr<='0';
				mar<='1';rd<='0';wr<='1';enc<='0';c<="0000";b<="0001";a<="0000";
				addr <= "00001010";
			
			--alu := tir; if n then goto 62;
			when "00111011" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "00111110";
			
			--sp := sp + (-1);
			when "00111100" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0010";b<="0111";a<="0010";
				addr <= "00000000";
			
			--mar := sp; mbr := ac; wr; goto 10";
			when "00111101" => amux<='0'; cond<="11"; ula<="10";sh<="00";mbr<='1';
				mar<='1';rd<='0';wr<='1';enc<='0';c<="0000";b<="0010";a<="0001";
				addr <= "00001010";
			
			--mar := sp; sp := sp + 1; rd;
			when "00111110" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='1';rd<='1';wr<='0';enc<='1';c<="0010";b<="0110";a<="0010";
				addr <= "00000000";
			
			--rd;
			when "00111111" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='0';c<="0000";b<="0000";a<="0000";
				addr <= "00000000";				
			
			--ac := mbr; goto 0;
			when "01000000" => amux<='1'; cond<="11"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0001";b<="0000";a<="0000";
				addr <= "00000000";
			
			--tir := lshift (tir); if n then goto 73;
			when "01000001" => amux<='0'; cond<="01"; ula<="10";sh<="01";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0100";b<="0000";a<="0100";
				addr <= "01001001";
			
			--alu := tir; if n then goto 70;
			when "01000010" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "01000110";
			
			--mar := sp; sp := sp + 1; rd;
			when "01000011" => amux<='0'; cond<="00"; ula<="00";sh<="00";mbr<='0';
				mar<='1';rd<='1';wr<='0';enc<='1';c<="0010";b<="0110";a<="0010";
				addr <= "00000000";
			
			--rd;
			when "01000100" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='1';wr<='0';enc<='0';c<="0000";b<="0000";a<="0000";
				addr <= "00000000";
			
			--pc := mbr; goto 0;
			when "01000101" => amux<='1'; cond<="11"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0001";b<="0000";a<="0000";
				addr <= "00000000";
			
			--a := ac;
			when "01000110" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="0000";a<="0001";
				addr <= "00000000";
			
			--ac := sp;
			when "01000111" => amux<='0'; cond<="00"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0001";b<="0000";a<="0010";
				addr <= "00000000";
			
			--sp := a; goto 0;
			when "01001000" => amux<='0'; cond<="11"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0010";b<="0000";a<="1010";
				addr <= "00000000";
			
			--alu := tir; if n then goto 76;
			when "01001001" => amux<='0'; cond<="01"; ula<="10";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='0';c<="0000";b<="0000";a<="0100";
				addr <= "01001100";					
			--a := band (ir, smask);
			
			when "01001010" => amux<='0'; cond<="00"; ula<="01";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="1001";a<="0011";
				addr <= "00000000";
			
			--sp := sp + a; goto 0;
			when "01001011" => amux<='0'; cond<="11"; ula<="00";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="0010";b<="1010";a<="0010";
				addr <= "00000000";
			
			--a := band (ir, smask);
			when "01001100" => amux<='0'; cond<="00"; ula<="01";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="1001";a<="0011";
				addr <= "00000000";
			
			--a := inv (a);
			when "01001101" => amux<='0'; cond<="00"; ula<="11";sh<="00";mbr<='0';
				mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="1010";a<="0000";
				addr <= "00000000";
			
			--a := a + 1; goto 75;
			when "01001110" => amux<='0'; cond<="11"; ula<="00";sh<="00";mbr<='0';
					mar<='0';rd<='0';wr<='0';enc<='1';c<="1010";b<="1010";a<="0110";
					addr <= "01001011";
			when others =>
		end case;
	end process combinacao_de_estados;
	estado_clock: process (clk)
	begin
		if rising_edge (clk) then
			if ((n='1' and cond(0)='1') or (z='1' and cond(1)='1') or (cond(1)='1' and cond(0)='1')) then
				estado_atual <= addr;
			else
				estado_atual <= estado_atual + 1;
			end if;
		end if;
	end process estado_clock;
end comportamental;
Decodificador4x16.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Decodificador4x16 is
 port(entDec: in std_logic_vector(3 downto 0);
 enDec: in std_logic;
 sDec: out std_logic_vector(15 downto 0));
end Decodificador4x16;
architecture ComportamentoDec of Decodificador4x16 is
 begin
 process (entDec,enDec)
 begin
 sDec <= "0000000000000000";
 if (enDec = '1') then
 case entDec is
 when "0000" => sDec <= "0000000000000001";
 when "0001" => sDec <= "0000000000000010";
 when "0010" => sDec <= "0000000000000100";
 when "0011" => sDec <= "0000000000001000";
 when "0100" => sDec <= "0000000000010000";
 when "0101" => sDec <= "0000000000100000";
 when "0110" => sDec <= "0000000001000000";
 when "0111" => sDec <= "0000000010000000";
 when "1000" => sDec <= "0000000100000000";
 when "1001" => sDec <= "0000001000000000";
 when "1010" => sDec <= "0000010000000000";
 when "1011" => sDec <= "0000100000000000";
 when "1100" => sDec <= "0001000000000000";
 when "1101" => sDec <= "0010000000000000";
 when "1110" => sDec <= "0100000000000000";
 when "1111" => sDec <= "1000000000000000";
 when others => null;
 end case;
 end if;
 end process; 
end ComportamentoDec;
library ieee;
use ieee.std_logic_1164.all;
entity testBenchDecodificador4x16 is
end testBenchDecodificador4x16;
architecture testDecodificador4x16 of testBenchDecodificador4x16 is
 component Decodificador4x16
 port (entDec: in std_logic_vector(3 downto 0);
 enDec: in std_logic;
 sDec: out std_logic_vector(15 downto 0));
 end component;
 
 signal entDec:std_logic_vector (3 downto 0);
 signal enDec:std_logic;
 signal sDec:std_logic_vector(15 downto 0);
 
 begin 
 
 comp:Decodificador4x16 port map (entDec,enDec,sDec);
 
 process
 
 begin
 
 enDec <= '1';
 entDec <= "0000","1111" after 2 ns,"0000" after 4 ns;
 
 wait;
end process;
 
end testDecodificador4x16;
Decodificador4X16_estrutural.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Decodificador4x16_estrutural is
 port(EntDec: in std_logic_vector(3 downto 0); enDec: in std_logic;
 sDec: out std_logic_vector(15 downto 0));
end Decodificador4x16_estrutural;
architecture estrutural of Decodificador4x16_estrutural is
 
 component AND5
 port (E4,E3,E2,E1,E5:in std_logic; S: out std_logic);
 end component;
 
 component INV
 port (E:in std_logic; S: out std_logic);
 end component;
signal S1,S2,S3,S4: std_logic;
begin
 
 P1: INV port map (EntDec(3),S1);
 P2: INV port map (EntDec(2),S2);
 P3: INV port map (EntDec(1),S3);
 P4: INV port map (EntDec(0),S4);
 --ENTRADAS ="0000" => SAIDA = "0000000000000001"
 P5: AND5 port map (S1,S2,S3,S4,enDec,sDec(0));
 --ENTRADAS ="0001"
 P6: AND5 port map (S1,S2,S3,EntDec(0),enDec,sDec(1));
 --ENTRADAS ="0010"
 P7: AND5 port map (S1,S2,EntDec(1),S4,enDec,sDec(2));
 --ENTRADAS ="0011" 
 P8: AND5 port map (S1,S2,EntDec(1),EntDec(0),enDec,sDec(3));
 --ENTRADAS ="0100" 
 P9: AND5 port map (S1,EntDec(2),S3,S4,enDec,sDec(4));
 --ENTRADAS ="0101" 
 P10: AND5 port map (S1,EntDec(2),S3,EntDec(0),enDec,sDec(5));
 --ENTRADAS ="0110"
 P11: AND5 port map (S1,EntDec(2),EntDec(1),S4,enDec,sDec(6));
 --ENTRADAS ="0111"
 P12: AND5 port map (S1,EntDec(2),EntDec(1),EntDec(0),enDec,sDec(7));
 --ENTRADAS ="1000" 
 P13: AND5 port map (EntDec(3),S2,S3,S4,enDec,sDec(8));
 --ENTRADAS ="1001"
 P14: AND5 port map (EntDec(3),S2,S3,EntDec(0),enDec,sDec(9));
 --ENTRADAS ="1010" 
 P15: AND5 port map (EntDec(3),S2,EntDec(1),S4,enDec,sDec(10));
 --ENTRADAS ="1011" 
 P16: AND5 port map (EntDec(3),S2,EntDec(1),EntDec(0),enDec,sDec(11));
 --ENTRADAS ="1100" 
 P17: AND5 port map (EntDec(3),EntDec(2),S3,S4,enDec,sDec(12));
 --ENTRADAS ="1101" 
 P18: AND5 port map (EntDec(3),EntDec(2),S3,EntDec(0),enDec,sDec(13));
 --ENTRADAS ="1110"
 P19: AND5 port map (EntDec(3),EntDec(2),EntDec(1),S4,enDec,sDec(14));
 --ENTRADAS ="1111"
 P20: AND5 port map (EntDec(3),EntDec(2),EntDec(1),EntDec(0),enDec,sDec(15));
END estrutural;
library ieee;
use ieee.std_logic_1164.all;
entity testBenchDecodificador4x16_estrutural is
end testBenchDecodificador4x16_estrutural;
architecture teste_estrutural of testBenchDecodificador4x16_estrutural is
 component Decodificador4x16_estrutural
 port (EntDec: in std_logic_vector(3 downto 0); enDec: in std_logic;
 sDec: out std_logic_vector(15 downto 0));
 end component;
 
 signal sigEnt: std_logic_vector (3 downto 0);
 signal sigEna: std_logic;
 signal sigS: std_logic_vector (15 downto 0);
 
begin
 comp: Decodificador4x16_estrutural port map (sigEnt,sigEna,sigS);
 process
 begin
 
 sigEna <='0', '1' after 3 ns;
 sigEnt <= "0000","1111" after 2 ns, "0000" after 4 ns, "0001" after 6 ns,"0010" after 8 ns,
 "0011" after 10 ns, "0100" after 12 ns, "0101" after 14 ns, "0110" after 16 ns, 
 "0111" after 18 ns, "1000" after 20 ns, "1001" after 22 ns, "1010" after 24 ns, 
 "1011" after 28 ns, "1100" after 30 ns, "1101" after 32 ns, "1110" after 34 ns, 
 "1111" after 36 ns;
 wait;
 end process;
end teste_estrutural;
Decodificador4x16_fluxo.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Decodificador4x16_fluxo is
 port(entDec: in std_logic_vector(3 downto 0);
 enDec: in std_logic;
 sDec: out std_logic_vector(15 downto 0));
end Decodificador4x16_fluxo;
architecture fluxoDec of Decodificador4x16_fluxo is
 begin
 --sDec <="0000000000000000";
 --ENTRADAS ="0000" => SAIDA = "0000000000000001"
 sDec(0) <= (NOT(entDec(3)) AND NOT(entDec(2)) AND NOT(entDec(1)) AND NOT(entDec(0)) AND enDec);
 --ENTRADAS ="0001" => SAIDA = "0000000000000010"
 sDec(1) <= (NOT(entDec(3)) AND NOT(entDec(2)) AND NOT(entDec(1)) AND entDec(0) AND enDec);
 --ENTRADAS ="0010" => SAIDA = "0000000000000100"
 sDec(2) <= (NOT(entDec(3)) AND NOT(entDec(2)) AND entDec(1) AND NOT(entDec(0)) AND enDec);
 --ENTRADAS ="0011" => SAIDA = "0000000000001000"
 sDec(3) <= (NOT(entDec(3)) AND NOT(entDec(2)) AND entDec(1) AND entDec(0) AND enDec);
 --ENTRADAS ="0100" => SAIDA = "0000000000010000"
 sDec(4) <= (NOT(entDec(3)) AND entDec(2) AND NOT(entDec(1)) AND NOT(entDec(0)) AND enDec);
 --ENTRADAS ="0101" => SAIDA = "0000000000100000"
 sDec(5) <= (NOT(entDec(3)) AND entDec(2) AND NOT(entDec(1)) AND entDec(0) AND enDec);
 --ENTRADAS ="0110" => SAIDA = "0000000001000000"
 sDec(6) <= (NOT(entDec(3)) AND entDec(2) AND entDec(1) AND NOT(entDec(0)) AND enDec);
 --ENTRADAS ="0111" => SAIDA = "0000000010000000"
 sDec(7) <= (NOT(entDec(3)) AND entDec(2) AND entDec(1) AND entDec(0) AND enDec);
 --ENTRADAS ="1000" => SAIDA = "0000000100000000"
 sDec(8) <= (entDec(3) AND NOT(entDec(2)) AND NOT(entDec(1)) AND NOT(entDec(0)) AND enDec);
 --ENTRADAS ="1001" => SAIDA = "00000010000000000"
 sDec(9) <= (entDec(3) AND NOT(entDec(2)) AND NOT(entDec(1)) AND entDec(0) AND enDec);
 --ENTRADAS ="1010" => SAIDA = "00000100000000000"
 sDec(10) <= (entDec(3) AND NOT(entDec(2)) AND entDec(1) AND NOT(entDec(0)) AND enDec);
 --ENTRADAS ="1011" => SAIDA = "00001000000000000"
 sDec(11) <= (entDec(3) AND NOT(entDec(2)) AND entDec(1) AND entDec(0) AND enDec);
 --ENTRADAS ="1100" => SAIDA = "00010000000000000"
 sDec(12) <= (entDec(3) AND entDec(2) AND NOT(entDec(1)) AND NOT(entDec(0)) AND enDec);
 --ENTRADAS ="1101" => SAIDA = "00100000000000000"
 sDec(13) <= (entDec(3) AND entDec(2) AND NOT(entDec(1)) AND entDec(0) AND enDec);
 --ENTRADAS ="1110" => SAIDA = "01000000000000000"
 sDec(14) <= (entDec(3) AND entDec(2) AND entDec(1) AND NOT(entDec(0)) AND enDec);
 --ENTRADAS ="1111" => SAIDA = "10000000000000000"
 sDec(15) <= (entDec(3) AND entDec(2) AND entDec(1) AND entDec(0) AND enDec);
end fluxoDec;
library ieee;
use ieee.std_logic_1164.all;
entity testBenchDecodificador4x16_fluxo is
end testBenchDecodificador4x16_fluxo;
architecture teste of testBenchDecodificador4x16_fluxo is
 component Decodificador4x16_fluxo
 port (entDec: in std_logic_vector(3 downto 0);
 enDec: in std_logic;
 sDec: out std_logic_vector(15 downto 0));
 end component;
signal sigEntDec: std_logic_vector (3 downto 0);
signal sigEnDec: std_logic;
signal signalSaidaDec: std_logic_vector (15 downto 0);
begin
 comp: Decodificador4x16_fluxo port map (sigEntDec, sigEnDec, signalSaidaDec);
 process
 begin
 sigEnDec <= '0','1' after 2 ns,'0' after 34 ns;
 sigEntDec <= "0000","0001" after 4 ns,"0010" after 6 ns, "0011" after 8 ns,
 "0100" after 10 ns,"0101" after 12 ns,"0110" after 14 ns,"0111" after 16 ns,"1000" after 18 ns,
 "1001" after 20 ns,"1010" after 22 ns,"1011" after 24 ns,"1100" after 26 ns,"1101" after 28 ns,
 "1110" after 30 ns,"1111" after 32 ns;
 -- sigEntDec <= "0000","1111" after 4 ns;
 wait;
 end process;
end teste;
Deslocador_Algoritmica.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Deslocador_algoritmica is
 port(EntA: in std_logic_vector(15 downto 0);
 EntF: in std_logic_vector(1 downto 0);
 SaiS: out std_logic_vector(15 downto 0));
 end Deslocador_algoritmica;
 
 architecture algoritmica of Deslocador_algoritmica is
 begin 
 process (EntA,EntF)
 begin
 case EntF is
 when "00" => SaiS <= EntA; --mantém 
 when "01" => SaiS <= to_stdlogicvector(to_bitvector(EntA) srl 1) ;--desloca 1 bit para a direita
 when "10" => SaiS <= to_stdlogicvector(to_bitvector(EntA) sll 1); -- desloca 1 bit para a esquerda
 --when "11" => S <= A; 
 when others => null;
 end case;
end process;
end algoritmica;
library ieee;
use ieee.std_logic_1164.all;
entity testbenchDeslocador_algoritimica is
end testbenchDeslocador_algoritimica;
architecture teste of testbenchDeslocador_algoritimica is
 component Deslocador_algoritmica
 port (EntA:in std_logic_vector (15 downto 0);
 EntF:in std_logic_vector (1 downto 0);
 SaiS:out std_logic_vector (15 downto 0));
 end component;
 
signal sigA,sigS: std_logic_vector(15 downto 0);
signal sigF: std_logic_vector(1 downto 0);
begin
 comp: Deslocador_algoritmica port map (sigA,sigF,sigS);
 process
 begin
 sigA<="0000000000000000","1111111111111111" after 2 ns;
 sigF<="00","01" after 4 ns,"11" after 6 ns, "10" after 8 ns;
 wait;
 end process;
end teste;
Deslocador_Estrutural.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Deslocador_estrutural is
 port(EntA: in std_logic_vector(15 downto 0);
 EntF: in std_logic_vector(1 downto 0);
 SaiS: out std_logic_vector(15 downto 0));
end Deslocador_estrutural;
architecture Deslocador_estrutural of Deslocador_estrutural is
 
 component AND2
 port (E2,E1:in std_logic; S: out std_logic);
 end component;
 
 component INV
 port (E: in std_logic; S: out std_logic);
 end component;
 
 component OR2
 port (E1,E2:in std_logic; S: out std_logic);
 end component;
 
 component AND3
 port (E1,E2,E3:in std_logic; S: out std_logic);
 end component;
 
 component OR3
 port (E1,E2,E3:in std_logic; S: out std_logic);
 end component;
 
 signal S1,S2,S3,S4,S5,S6,S7,S8: std_logic;
 signaL S10,S11,S12,S14,S15,S16: std_logic;
 signal S18,S19,S20,S22,S23,S24: std_logic;
 signal S26,S27,S28,S30,S31,s32: std_logic;
 signal S34,S35,S36,S38,S39,S40: std_logic;
 signal S42,S43,S44,S46,S47,S48: std_logic;
 signal S50,S51,S52,S54,S55,S56: std_logic;
 signal S58,S59,S60,S62,S63,S64: std_logic;
 signal S66,S67: std_logic;
 
 
 begin
 
 P1: INV port map (EntF(0), S1);
 P2: INV port map (EntF(1), S2);
 
 P3: AND2 port map (S1,EntF(1),S3);
 P4: AND2 port map (S2,EntF(0),S4);
 
 P5: OR2 port map (S3,S4,S5);
 
 P6:INV port map (S5, S6);
 
 --lOGICA DA SAIDA 0
 P7: AND2 port map (S6,EntA(0),S7);
 P8: AND2 port map (S4,EntA(1),S8);
 P9: OR2 port map (S7,S8,SaiS(0));
 
 --lOGICA DA SAIDA 1
 P10: AND2 port map (S3,EntA(0),S10);
 P11: AND2 port map (S6,EntA(1),S11);
 P12: AND2 port map (S4,EntA(2),S12);
 P13: OR3 port map (S10,S11,S12,SaiS(1)); 
 
 --lOGICA DA SAIDA 2
 P14: AND2 port map (S3,EntA(1),S14);
 P15: AND2 port map (S6,EntA(2),S15);
 P16: AND2 port map (S4,EntA(3),S16);
 P17: OR3 port map (S14,S15,S16,SaiS(2)); 
 
 --lOGICA DA SAIDA 3
 P18: AND2 port map (S3,EntA(2),S18);
 P19: AND2 port map (S6,EntA(3),S19);
 P20: AND2 port map (S4,EntA(4),S20);
 P21: OR3 port map (S18,S19,S20,SaiS(3)); 
 
 --lOGICA DA SAIDA 4
 P22: AND2 port map (S3,EntA(3),S22);
 P23: AND2 port map (S6,EntA(4),S23);
 P24: AND2 port map (S4,EntA(5),S24);
 P25: OR3 port map (S22,S23,S24,SaiS(4)); 
 
 --lOGICA DA SAIDA 5
 P26: AND2 port map (S3,EntA(4),S26);
 P27: AND2 port map (S6,EntA(5),S27);
 P28: AND2 port map (S4,EntA(6),S28);
 P29: OR3 port map (S26,S27,S28,SaiS(5)); 
 
 --lOGICA DA SAIDA 6
 P30: AND2 port map (S3,EntA(5),S30);
 P31: AND2 port map (S6,EntA(6),S31);
 P32: AND2 port map (S4,EntA(7),S32);
 P33: OR3 port map (S30,S31,S32,SaiS(6)); 
 
 --lOGICA DA SAIDA 7
 P34: AND2 port map (S3,EntA(6),S34);
 P35: AND2 port map (S6,EntA(7),S35);
 P36: AND2 port map (S4,EntA(8),S36);
 P37: OR3 port map (S34,S35,S36,SaiS(7)); 
 
 --lOGICA DA SAIDA 8
 P38: AND2 port map (S3,EntA(7),S38);
 P39: AND2 port map (S6,EntA(8),S39);
 P40: AND2 port map (S4,EntA(9),S40);
 P41: OR3 port map (S38,S39,S40,SaiS(8));
 
 --lOGICA DA SAIDA 9
 P42: AND2 port map (S3,EntA(8),S42);
 P43: AND2 port map (S6,EntA(9),S43);
 P44: AND2 port map (S4,EntA(10),S44);
 P45: OR3 port map (S42,S43,S44,SaiS(9)); 
 
 --lOGICA DA SAIDA 10
 P46: AND2 port map (S3,EntA(9),S46);
 P47: AND2 port map (S6,EntA(10),S47);
 P48: AND2 port map (S4,EntA(11),S48);
 P49: OR3 port map (S46,S47,S48,SaiS(10)); 
 
 --lOGICA DA SAIDA 11
 P50: AND2 port map (S3,EntA(10),S50);
 P51: AND2 port map (S6,EntA(11),S51);
 P52: AND2 port map (S4,EntA(12),S52);
 P53: OR3 port map (S50,S51,S52,SaiS(11)); 
 
 --lOGICA DA SAIDA 12
 P54: AND2 port map (S3,EntA(11),S54);
 P55: AND2 port map (S6,EntA(12),S55);
 P56: AND2 port map (S4,EntA(13),S56);
 P57: OR3 port map (S54,S55,S56,SaiS(12)); 
 
 --lOGICA DA SAIDA 13
 P58: AND2 port map (S3,EntA(12),S58);
 P59: AND2 port map (S6,EntA(13),S59);
 P60: AND2 port map (S4,EntA(14),S60);
 P61: OR3 port map (S58,S59,S60,SaiS(13)); 
 
 --lOGICA DA SAIDA 14
 P62: AND2 port map (S3,EntA(13),S62);
 P63: AND2 port map (S6,EntA(14),S63);
 P64: AND2 port map (S4,EntA(15),S64);
 P65: OR3 port map (S62,S63,S64,SaiS(14)); 
 
 --lOGICA DA SAIDA 15
 P66: AND2 port map (S3,EntA(14),S66);
 P67: AND2 port map (S6,EntA(15),S67);
 P68: OR2 port map (S66,S67,SaiS(15)); 
 
end Deslocador_estrutural;
library ieee;
use ieee.std_logic_1164.all;
entity testBenchDeslocador_estrutural is
end testBenchDeslocador_estrutural;
architecture teste_estrutural of testBenchDeslocador_estrutural is
 component Deslocador_estrutural
 port (EntA: in std_logic_vector(15 downto 0);
 EntF: in std_logic_vector(1 downto 0);
 SaiS: out std_logic_vector(15 downto 0));
 end component;
 
 signal sigEntA: std_logic_vector (15 downto 0);
 signal sigEntF: std_logic_vector(1 downto 0);
 signal sigSaiS: std_logic_vector (15 downto 0);
 
 begin 
 comp: Deslocador_estrutural port map (sigEntA,sigEntF,sigSaiS);
 process
 begin
 
 sigEntA <= "1111111111111111","1111111111111110" after 14 ns;
 sigEntF <= "00", "01" after 4 ns,"11" after 8 ns,"10" after 12 ns,
 "00" after 16 ns,"01" after 20 ns,"11" after 24 ns,"10" after 28 ns;
 wait;
 end process;
end teste_estrutural;
Deslocador_Fluxo.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Deslocador_Fluxo is
 port(EntA: in std_logic_vector(15 downto 0);
 EntF: in std_logic_vector(1 downto 0);
 SaiS: out std_logic_vector(15 downto 0));
end Deslocador_Fluxo;
architecture fluxoDeslocador of Deslocador_Fluxo is
 begin
 
 SaiS(0) <= ((not((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(1)) or (EntF(0) and not(EntF(1)) and EntA(1)));
 SaiS(1) <= ((not(EntF(0)) and EntF(1) and EntA(2)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(1)) or (EntF(0) and not(EntF(1)) and EntA(0)));
 SaiS(2) <= ((not(EntF(0)) and EntF(1) and EntA(3)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(2)) or (EntF(0) and not(EntF(1)) and EntA(1)));
 SaiS(3) <= ((not(EntF(0)) and EntF(1) and EntA(4)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(3)) or (EntF(0) and not(EntF(1)) and EntA(2)));
 SaiS(4) <= ((not(EntF(0)) and EntF(1) and EntA(5)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(4)) or (EntF(0) and not(EntF(1)) and EntA(3)));
 SaiS(5) <= ((not(EntF(0)) and EntF(1) and EntA(6)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(5)) or (EntF(0) and not(EntF(1)) and EntA(4)));
 SaiS(6) <= ((not(EntF(0)) and EntF(1) and EntA(7)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(6)) or (EntF(0) and not(EntF(1)) and EntA(5)));
 SaiS(7) <= ((not(EntF(0)) and EntF(1) and EntA(8)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(7)) or (EntF(0) and not(EntF(1)) and EntA(6)));
 SaiS(8) <= ((not(EntF(0)) and EntF(1) and EntA(9))
or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(8)) or (EntF(0) and not(EntF(1)) and EntA(7)));
 SaiS(9) <= ((not(EntF(0)) and EntF(1) and EntA(10)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(9)) or (EntF(0) and not(EntF(1)) and EntA(8)));
 SaiS(10) <= ((not(EntF(0)) and EntF(1) and EntA(11)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(10)) or (EntF(0) and not(EntF(1)) and EntA(9)));
 SaiS(11) <= ((not(EntF(0)) and EntF(1) and EntA(12)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(11)) or (EntF(0) and not(EntF(1)) and EntA(10)));
 SaiS(12) <= ((not(EntF(0)) and EntF(1) and EntA(13)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(12)) or (EntF(0) and not(EntF(1)) and EntA(11)));
 SaiS(13) <= ((not(EntF(0)) and EntF(1) and EntA(14)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(13)) or (EntF(0) and not(EntF(1)) and EntA(12)));
 SaiS(14) <= ((not(EntF(0)) and EntF(1) and EntA(15)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(14)) or (EntF(0) and not(EntF(1)) and EntA(13)));
 SaiS(15) <= ((not(EntF(0)) and EntF(1) and EntA(15)) or (not ((not(EntF(0)) and EntF(1)) or (EntF(0) and not(EntF(1)))) and EntA(14)));
 
 end fluxoDeslocador;
 
 library ieee;
use ieee.std_logic_1164.all;
entity testBenchDeslocador_fluxo is
end testBenchDeslocador_fluxo;
architecture teste of testBenchDeslocador_fluxo is
 component Deslocador_Fluxo
 port (EntA: in std_logic_vector(15 downto 0);
 EntF: in std_logic_vector(1 downto 0);
 SaiS: out std_logic_vector(15 downto 0));
 end component;
 
 signal sigEntA: std_logic_vector (15 downto 0);
 signal sigEntF: std_logic_vector (1 downto 0);
 signal signalSaiS: std_logic_vector (15 downto 0);
begin
 comp: Deslocador_Fluxo port map (sigEntA, sigEntF, signalSaiS);
 process
 begin
 sigEntA<="0000000000000000","1111111111111111" after 2 ns;
 sigEntF<="00","01" after 4 ns,"11" after 6 ns, "10" after 8 ns;
 wait;
 end process;
end teste;
FlipFlopD.vhd
library ieee;
use ieee.std_logic_1164.all;
entity ffD is
 port(RST,CLK:in bit;
 D: in std_logic;
 Q,NQ: out std_logic);
end ffD;
architecture algoritmica of ffD is
begin
 process (RST,D,CLK) begin
 if ( RST = '1' ) then
 Q<= '0';
 NQ <= '1';
 elsif ( CLK = '1' and CLK'event ) then
 Q <= D;
 NQ <= not D;
 end if;
 end process;
end algoritmica;
library ieee;
use ieee.std_logic_1164.all;
entity teste_ffD is
end teste_ffD;
architecture teste of teste_ffD is
 component ffD
 port(RST,CLK:in bit;
 D: in std_logic;
 Q,NQ: out std_logic);
 end component;
signal sigRST, sigCLK: bit;
signal sigD,sigQ,sigNQ :std_logic ;
begin
comp:ffD port map (sigRST, sigCLK, sigD,sigQ,sigNQ);
process
 begin
 sigCLK <='0', not (sigCLK) after 3 ns;
 sigD<='0','1' after 2 ns;
 wait for 6 ns;
 end process;
end teste;
GSC.vhd
library ieee;
use ieee.std_logic_1164.all;
entity GSC is
 port(T1,T2,T3,T4: out std_logic);
end GSC; 
architecture comportamental of GSC is
 
 signal clock: std_logic:='1';
 signal sigT1: std_logic:='1';
 signal sigT2: std_logic:='1';
 signal sigT3: std_logic:='1';
 signal sigT4: std_logic:='1';
 
 begin
 
 process
 begin
 clock <= not clock after 5 ns;
 wait for 5 ns;
 end process;
 
 process(clock)
 begin
 if clock'event and clock='1'
 then sigT1<='1', '0' after 2.5 ns;
 end if;
 end process;
 
 process(sigT1)
 begin
 if sigT1'event and sigT1='0'
 then sigT2<='1', '0' after 2.5 ns;
 end if;
 end process;
 
 process(sigT2)
 begin
 if sigT2'event and sigT2='0'
 then sigT3<='1', '0' after 2.5 ns;
 end if;
 end process;
 
 process(sigT3)
 begin
 if sigT3'event and sigT3='0'
 then sigT4<='1', '0' after 2.5 ns;
 end if;
 end process;
 
 T1 <= sigT1;
 T2 <= sigT2;
 T3 <= sigT3;
 T4 <= sigT4;
 
end comportamental;
incrementadorGen.vhd
library ieee;
use ieee.std_logic_1164.all;
entity incrementadorGen is
 generic (tam: integer);
 port (A: in std_logic_vector (tam - 1 downto 0);
 resultado: out std_logic_vector(tam - 1 downto 0));
end incrementadorGen;
architecture estrutura of incrementadorGen is 
component somador is
 port (A, B, vem1: in std_logic;
 resultado, vai1: out std_logic);
end component;
signal result: std_logic_vector (tam - 1 downto 0);
signal b: std_logic_vector (31 downto 0);
signal vem1: std_logic_vector (tam + 1 downto 0);
begin
 b <= "00000000000000000000000000000000";
 vem1(0)<='1';
 som: for i in tam - 1 downto 0 generate
 somn: somador port map (a(i),b(i),vem1(i),result(i),vem1(i+1));
 end generate;
resultado <= result;
end estrutura;
library ieee;
use ieee.std_logic_1164.all;
entity testbench_incrementadorGen is
end testbench_incrementadorGen;
architecture testbench of testbench_incrementadorGen is
component incrementadorGen is
 generic (tam: integer);
 port (A: in std_logic_vector (tam - 1 downto 0);
 resultado: out std_logic_vector(tam - 1 downto 0));
end component;
signal sigA,sigResultado: std_logic_vector (3 downto 0);
begin
 incrementadorX: incrementadorGen generic map (4) port map (sigA,sigResultado);
 
 process
 begin
 sigA<= "0000", "0001" after 5 ns, "0010" after 10 ns, "1111" after 20 ns;
 wait;
 end process;
end testbench;
Latch.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Latch is
 port(
 D: in std_logic_vector(15 downto 0);
 CK: in std_logic;
 Q: out std_logic_vector(15 downto 0)
 );
end Latch;
architecture algoritmica of Latch is
begin
 process (D,CK)
 begin
 if CK ='1' and CK'event then
 Q<=D;
 end if;
 end process;
end algoritmica;
library ieee;
use ieee.std_logic_1164.all;
entity testbench_latch is
end testbench_latch;
architecture testbench of testbench_latch is
component Latch is
 generic (tam: integer);
 port (en: in std_logic_vector (tam - 1 downto 0);
 comando: in std_logic;
 saida: out std_logic_vector (tam - 1 downto 0));
end component;
signal a, b: std_logic_vector (7 downto 0);
signal comando: std_logic;
begin
 Latcha: Latch generic map (8) port map (a,comando,b);
 
 process
 begin
 a <= "00110011", "00001111" after 10 ns, "10101010" after 20 ns;
 comando <= '0', '1' after 5 ns, '0' after 15 ns, '1' after 30 ns;
 wait;
 end process; 
end testbench;
Logica_Microsequenciamento_Algoritmica.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Logica_microsequenciamento_algoritmica is
 port(EntN,EntZ: in std_logic;
 EntCond: in std_logic_vector(1 downto 0);
 SaiS: out std_logic);
 end Logica_microsequenciamento_algoritmica;
architecture algoritmica of Logica_microsequenciamento_algoritmica is
 begin 
 process (EntN,EntZ,EntCond)
 begin
 -- SaiS <= ((not(EntCond(1)) and EntCond(0) and EntN) or (EntCond(1) and not(EntCond(0)) and EntZ) 
 -- or (EntCond(1) and EntCond(0));
 SaiS <= ((EntCond(0) and EntN) or (EntCond(1) and EntZ) or (EntCond(1) and EntCond(0)));
 end process;
end algoritmica;
library ieee;
use ieee.std_logic_1164.all;
entity testbenchLogica_microsequenciamento_algoritimica is
end testbenchLogica_microsequenciamento_algoritimica;
architecture teste of testbenchLogica_microsequenciamento_algoritimica is
 component Logica_microsequenciamento_algoritmica
 port (EntN,EntZ: in std_logic;
 EntCond: in std_logic_vector(1 downto 0);
SaiS: out std_logic);
 end component;
 
signal sigEntN,sigEntZ,sigSaiS: std_logic;
signal sigEntCond: std_logic_vector(1 downto 0);
begin
 comp: Logica_microsequenciamento_algoritmica port map (sigEntN,sigEntZ,sigEntCond,sigSaiS);
 process
 begin
 -- a saída só deve ser 1 nos seguintes casos:
 -- quando Cond =01 e N=1;
 -- quando Cond =11 e Z=1;
 sigEntN <= '0','1' after 2ns, '0' after 6 ns,'1' after 12ns, '0' after 16 ns,
 '1' after 22ns, '0' after 26 ns,'1' after 32ns, '0' after 36 ns;
 sigEntZ <= '0','1' after 4ns, '0' after 8 ns,'1' after 14ns, '0' after 18 ns,
 '1' after 24ns, '0' after 28 ns,'1' after 34ns, '0' after 38 ns;
 sigEntCond <= "00", "01" after 10ns , "10" after 20 ns,"11" after 30 ns;
 wait;
 end process;
end teste;
Logica_Microsequenciamento_Estrutural.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Logica_microsequenciamento_estrutural is
 port(EntN,EntZ: in std_logic;
 EntCond: in std_logic_vector(1 downto 0);
 SaiS: out std_logic);
end Logica_microsequenciamento_estrutural;
architecture Logica_microsequenciamento_estrutural of Logica_microsequenciamento_estrutural is
 
 component AND2
 port (E2,E1:in std_logic; S: out std_logic);
 end component;
 
 component OR3
 port (E1,E2,E3:in std_logic; S: out std_logic);
 end component;
 
 signal S1,S2,S3: std_logic;
 begin
 
 P1: AND2 port map (EntN,EntCond(0),S1);
 P2: AND2 port map (EntZ,EntCond(1),S2);
 P3: AND2 port map (EntCond(0),EntCond(1),S3);
 
 P4: OR3 port map (S1,S2,S3,SaiS); 
 
end Logica_microsequenciamento_estrutural;
library ieee;
use ieee.std_logic_1164.all;
entity testBenchLogica_microsequenciamento_estrutural is
end testBenchLogica_microsequenciamento_estrutural;
architecture teste_estrutural of testBenchLogica_microsequenciamento_estrutural is
 component Logica_microsequenciamento_estrutural
 port (EntN,EntZ: in std_logic;
 EntCond: in std_logic_vector(1 downto 0);
 SaiS: out std_logic);
 end component;
 
 signal sigEntN,sigEntZ,sigSaiS: std_logic;
 signal sigEntCond: std_logic_vector(1 downto 0);
 
 begin 
 comp: Logica_microsequenciamento_estrutural port map (sigEntN,sigEntZ,sigEntCond,sigSaiS);
 process
 begin
 
 sigEntN <= '0','1' after 2ns, '0' after 6 ns,'1' after 12ns, '0' after 16 ns,
 '1' after 22ns, '0' after 26 ns,'1' after 32ns, '0' after 36 ns;
 sigEntZ <= '0','1' after 4ns, '0' after 8 ns,'1' after 14ns, '0' after 18 ns,
 '1' after 24ns, '0' after 28 ns,'1' after 34ns, '0' after 38 ns;
 sigEntCond <= "00", "01" after 10ns , "10" after 20 ns,"11" after 30 ns;
 
 wait;
 end process;
end teste_estrutural;
Logica_Microsequenciamento_Fluxo.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Logica_microsequenciamento_Fluxo is
 port(EntN,EntZ: in std_logic;
 EntCond: in std_logic_vector(1 downto 0);
 SaiS: out std_logic);
end Logica_microsequenciamento_Fluxo;
architecture fluxoLogica_microsequenciamento of Logica_microsequenciamento_Fluxo is
 begin
 
 SaiS <= ((EntCond(0) AND EntN) OR (EntCond(1) AND EntZ) OR (EntCond(0) AND EntCond(1)));
 
 end fluxoLogica_microsequenciamento;
 
 library ieee;
use ieee.std_logic_1164.all;
entity testBenchLogica_microsequenciamento_fluxo is
end testBenchLogica_microsequenciamento_fluxo;
architecture teste of testBenchLogica_microsequenciamento_fluxo is
 component Logica_microsequenciamento_Fluxo
 port (EntN,EntZ: in std_logic;
 EntCond: in std_logic_vector(1 downto 0);
 SaiS: out std_logic);
 end component;
 
 signal sigEntN,sigEntZ,signalSaiS: std_logic;
 signal sigEntCond: std_logic_vector (1 downto 0);
begin
 comp: Logica_microsequenciamento_Fluxo port map (sigEntN,sigEntZ, sigEntCond, signalSaiS);
 process
 begin
 
 -- a saída só deve ser 1 nos seguintes casos:
 -- quando Cond =01 e N=1;
 -- quando Cond =11 e Z=1;
 sigEntN <= '0','1' after 2ns, '0' after 6 ns,'1' after 12ns, '0' after 16 ns,
 '1' after 22ns, '0' after 26 ns,'1' after 32ns, '0' after 36 ns;
 sigEntZ <= '0','1' after 4ns, '0' after 8 ns,'1' after 14ns, '0' after 18 ns,
 '1' after 24ns, '0' after 28 ns,'1' after 34ns, '0' after 38 ns;
 sigEntCond <= "00", "01" after 10ns , "10" after 20 ns,"11" after 30 ns;
 wait;
 end process;
end teste;
memoriaT3.vhd
library ieee;
use ieee.std_logic_1164.all;
entity memoriaT3 is
 port (signal bc, csa, csb, csc: in std_logic_vector(15 downto 0);
 signal sclock4: in std_logic;
 signal ba, bb: out std_logic_vector(15 downto 0));
end memoriaT3;
 
architecture estrutura of memoriaT3 is
 
component tristate is
 port ( entrada: in std_logic_vector (15 downto 0);
 oe: in std_logic;
 saida: out std_logic_vector (15 downto 0));
end component ;
component registrador is
 generic (nbits: integer);
 port ( dado: in std_logic_vector (nbits - 1 downto 0);
 clk: in std_logic;
 saida: out std_logic_vector (nbits - 1 downto 0));
end component;
signal barramentoA, barramentoB, clk_reg: std_logic_vector (15 downto 0);
signal comando, rd: std_logic; 
signal saida0, saida1, saida2, saida3, saida4, saida5, saida6, saida7,
 saida8, saida9, saida10, saida11, saida12, saida13, saida14, saida15: std_logic_vector (15 downto 0);
 
signal s_0:std_logic_vector(15 downto 0):=x"0000"; 
signal s_1:std_logic_vector(15 downto 0):=x"0001";
signal s_11:std_logic_vector(15 downto 0):=x"FFFF";
signal s_amask:std_logic_vector(15 downto 0):=x"03FF";
signal s_smask:std_logic_vector(15 downto 0):=x"00FF";
begin
 
 clkreg: for i in 0 to 15 generate
 clk_reg (i) <= csc(i) and sclock4;
 end generate; 
PC: registrador generic map (16) port map (bc,clk_reg(0),saida0);
tripca: tristate port map (saida0,csa(0),barramentoA);
tripcb: tristate port map (saida0,csb(0),barramentoB);
AC: registrador generic map (16) port map (bc,clk_reg(1),saida1);
triaca: tristate port map (saida1,csa(1),barramentoA);
triacb: tristate port map (saida1,csb(1),barramentoB);
SP: registrador generic map (16) port map (bc,clk_reg(2),saida2);
trispa: tristate port map (saida2,csa(2),barramentoA);
trispb: tristate port map (saida2,csb(2),barramentoB);
 
IR: registrador generic map (16) port map (bc,clk_reg(3),saida3);
triIRa: tristate port map (saida3,csa(3),barramentoA);
triirb: tristate port map (saida3,csb(3),barramentoB);
 
TIR: registrador generic map (16) port map (bc,clk_reg(4),saida4);
tritIRa: tristate port map (saida4,csa(4),barramentoA);
tritirb: tristate port map (saida4,csb(4),barramentoB);
 
REG0: registrador generic map (16) port map (s_0,sclock4,saida5);
tri0a: tristate port map (saida5,csa(5),barramentoA);
tri0b: tristate port map (saida5,csb(5),barramentoB);
 
REGM1: registrador generic map (16) port map (s_1,sclock4,saida6);
triM1a: tristate port map (saida6,csa(6),barramentoA);
triM1b: tristate port map (saida6,csb(6),barramentoB);
 
REGm11: registrador generic map (16) port map (s_11,sclock4,saida7);
trim11a: tristate port map (saida7,csa(7),barramentoA);
trim11b: tristate port map (saida7,csb(7),barramentoB); 
 
AMASK: registrador generic map (16) port map (s_amask,sclock4,saida8);
triAMASKa: tristate port map (saida8,csa(8),barramentoA);
triAMASKb: tristate port map (saida8,csb(8),barramentoB);
 
SMASK: registrador generic map (16) port map (s_smask,sclock4,saida9);
triSMASKa: tristate port map (saida9,csa(9),barramentoA);
triSMASKb: tristate port map (saida9,csb(9),barramentoB);
 
A: registrador generic map (16) port map (bc,clk_reg(10),saida10);
triAa: tristate port map (saida10,csa(10),barramentoA);
triAb: tristate port map (saida10,csb(10),barramentoB);
 
B: registrador generic map (16) port map (bc,clk_reg(11),saida11);
triBa: tristate port map (saida11,csa(11),barramentoA);
triBb: tristate port map (saida11,csb(11),barramentoB);
 
C: registrador generic map (16) port map (bc,clk_reg(12),saida12);
triCa: tristate port map (saida12,csa(12),barramentoA);
triCb: tristate port map (saida12,csb(12),barramentoB);
 
D: registrador generic map (16) port map (bc,clk_reg(13),saida13);
triDa: tristate port map (saida13,csa(13),barramentoA);
triDb: tristate port map (saida13,csb(13),barramentoB);
 
E: registrador generic map (16) port map (bc,clk_reg(14),saida14);
triEa: tristate port map (saida14,csa(14),barramentoA);
triEb: tristate port map (saida14,csb(14),barramentoB);
F: registrador generic map (16) port map (bc,clk_reg(15),saida15);
triFa: tristate port map (saida15,csa(15),barramentoA);
triFb: tristate port map (saida15,csb(15),barramentoB);
ba <= barramentoA;
bb <= barramentoB;
 
end estrutura; 
Memoria_controle.vhd
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_bit.all;
entity Memoria_Controle is
 port(Address: in unsigned (7 downto 0); 
 Dado: out std_logic_vector (31 downto 0));
end Memoria_Controle; 
architecture algoritmica of Memoria_Controle is
 type TP_Memoria is array (0 to 73) of std_logic_vector (31 downto 0);
 constant Memoria: TP_Memoria := ("00000000110000000000000000000000", -- 0
 "00000000010100000110000000000000", -- 1
 "10001000000110101000000000000000", -- 2
 "10110000000100110000000000011101", -- 3
 "00010100000101000000001100000000", -- 4
 "00110100000101000000010000010100", -- 5
 "00110100000101000000010000001110", -- 6
 "00110000000101000000010000001011", -- 7
 "00000000110000001010000000000000", -- 8
 "00000000010000000000000000000000", -- 9
 "11110000000100010000000000000000", -- 10
 "00010001100000001010000100000000", -- 11
 "00000000001000000000000000000000", -- 12
 "01100000001000000000000000000000", -- 13
 "00000000110000001010000000000000", -- 14
 "00110000010101000000010000010001", -- 15
 "11100000000100010001000000000000", -- 16
 "10011000000110100000000000000000", -- 17
 "00000000000110101010011000000000", -- 18
 "01100000000100010001101000000000", -- 19
 "00110100000101000000010000011010", -- 20
 "00110000000101000000010000011000", -- 21
 "00110000000100010000000100000000", -- 22
 "01100000000000000000000000011011", -- 23
 "01010000000100010000000100011011", -- 24
 "01100000000000000000000000000000", -- 25
 "00110000000101000000010000011100", -- 26
 "01110000000100000000101000000000", -- 27
 "01110000000100010000101000000000", -- 28
 "00110100000101000000010000011111", -- 29
 "01100000000110101010001000000110", -- 30
 "00110100000101000000010000100101", -- 31
 "00110000000101000000010000100011", -- 32
 "00110000000100010000000100011011", -- 33
 "01100000000000000000000000000000", -- 34
 "01010000000100010000000100000000", -- 35
 "01100000000000000000000000011011", -- 36
 "00110100000101000000010000101010", -- 37
 "00000000000100100111001000000000", -- 38
 "00010001100000000010000000000000", -- 39
 "00010000001100000000101000000000", -- 40
 "01100000001000000000000000000000", -- 41
 "00110100000101000000010000111101", -- 42
 "00110100000101000000010000110101", -- 43
 "00110000000101000000010000110001", -- 44
 "00000000110000000001000000000000", -- 45
 "00000000010100100010011100000000", -- 46
 "00000000101000000010000000000000", -- 47
 "01100000001000000000000000000000", -- 48
 "00000000110000000010000000000000", -- 49
 "00000000010100100010011000000000", -- 50
 "00000000101000000001000000000000", -- 51
 "01100000001000000000000000000000", -- 52
 "00110000000101000000010000111010", -- 53
 "00000000000100100010011100000000", -- 54
 "00010001100000000010000100000000", -- 55
 "00000000001000000000000000000000", -- 56
 "01100000001000000000000000000000", -- 57
 "00000000110000000010000000000000", -- 58
 "00000000010100100010011000000000", -- 59
 "11110000000100010000000000000000", -- 60
 "00110100000101000000010001000101", -- 61
 "00110000000101000000010001000010", -- 62
 "00000000110000000010000000000000", -- 63
 "00000000010100100010011000000000", -- 64
 "11110000000100000000000000000000", -- 65
 "00010000000110100000000100000000", -- 66
 "00010000000100010000001000000000", -- 67
 "00010000000100100000101000000000", -- 68
 "00000000000110100011100100000000", -- 69
 "00110000000101000000010001001000", -- 70
 "01100000000100100010101000000000", -- 71
 "00011000000110100000101000000000", -- 72
 "01100000000110101010011001000111"); -- 73
 begin
 process (Address)
 begin
 
 Dado <= Memoria(to_integer(Address));
 
 end process;
 end algoritmica;
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_bit.all;
 
entity TestBench_MC is
end TestBench_MC;
architecture test of TestBench_MC is
 
 component Memoria_Controle
 port(Address: in unsigned (7 downto 0); Dado: out std_logic_vector (31 downto 0));
 end component;
 
 signal SigAdd: unsigned(7
downto 0);
 signal SigDado: std_logic_vector(31 downto 0);
 begin
 MC: Memoria_Controle port map (SigAdd, SigDado);
 process
 begin
 SigAdd <="00000000",
 "00000001" after 1 ns,
 "00000010" after 2 ns,
 "00000011" after 3 ns,
 "00000100" after 4 ns,
 "00000101" after 5 ns,
 "00000110" after 6 ns,
 "00000111" after 7 ns,
 "00001000" after 8 ns,
 "00001001" after 9 ns,
 "00001010" after 10 ns,
 "00001011" after 11 ns,
 "00001100" after 12 ns,
 "00001101" after 13 ns,
 "00001110" after 14 ns,
 "00001111" after 15 ns,
 "00010000" after 16 ns,
 "00010001" after 17 ns,
 "00010010" after 18 ns,
 "00010011" after 19 ns,
 "00010100" after 20 ns,
 "00010101" after 21 ns,
 "00010110" after 22 ns,
 "00010111" after 23 ns,
 "00011000" after 24 ns,
 "00011001" after 25 ns,
 "00011010" after 26 ns,
 "00011011" after 27 ns,
 "00011100" after 28 ns,
 "00011101" after 29 ns,
 "00011110" after 30 ns,
 "00011111" after 31 ns,
 "00100000" after 32 ns,
 "00100001" after 33 ns,
 "00100010" after 34 ns,
 "00100011" after 35 ns,
 "00100100" after 36 ns,
 "00100101" after 37 ns,
 "00100110" after 38 ns,
 "00100111" after 39 ns,
 "00101000" after 40 ns,
 "00101001" after 41 ns,
 "00101010" after 42 ns,
 "00101011" after 43 ns,
 "00101100" after 44 ns,
 "00101101" after 45 ns,
 "00101110" after 46 ns,
 "00101111" after 47 ns,
 "00110000" after 48 ns,
 "00110001" after 49 ns,
 "00110010" after 50 ns,
 "00110011" after 51 ns,
 "00110100" after 52 ns,
 "00110101" after 53 ns,
 "00110110" after 54 ns,
 "00110111" after 55 ns,
 "00111000" after 56 ns,
 "00111001" after 57 ns,
 "00111010" after 58 ns,
 "00111011" after 59 ns,
 "00111100" after 60 ns,
 "00111101" after 61 ns,
 "00111110" after 62 ns,
 "00111111" after 63 ns,
 "01000000" after 64 ns,
 "01000001" after 65 ns,
 "01000010" after 66 ns,
 "01000011" after 67 ns,
 "01000100" after 68 ns,
 "01000101" after 69 ns,
 "01000110" after 70 ns,
 "01000111" after 71 ns,
 "01001000" after 72 ns,
 "01001001" after 73 ns;
 wait;
 end process;
 end test;
MUX2x1 - Estrutural.vhdl
library ieee;
use ieee.std_logic_1164.all;
entity MUX2x1_estrutural is
 port (A,B,C:in std_logic; S:out std_logic);
end MUX2x1_estrutural ;
architecture estrutural of MUX2x1_estrutural is
 component AND2
 port (E1,E2:in std_logic; S: out std_logic);
 end component;
 component INV
 port (E: in std_logic; S: out std_logic);
 end component;
 component OR2
 port (E1,E2:in std_logic; S: out std_logic);
 end component;
signal S1,S2,S3: std_logic;
begin
 P1: AND2 port map (B,C,S1);
 P2: INV port map (C,S2);
 P3: AND2 port map (S2,A,S3);
 P4: OR2 port map (S1,S3,S);
END estrutural;
library ieee;
use ieee.std_logic_1164.all;
entity testBenchMUX2x1_estrutural is
end testBenchMUX2x1_estrutural;
architecture teste_estrutural of testBenchMUX2x1_estrutural is
 component MUX2x1_estrutural
 port (A,B,C:in std_logic; S:out std_logic);
 end component;
 signal sigA,sigB,sigC,sigS:std_logic;
begin
 comp: MUX2x1_estrutural
 port map (sigA,sigB,sigC,sigS);
 process
 begin
 sigA <= '0','1' after 2 ns, '0' after 4 ns;
 sigB <= '1','0' after 3 ns, '1' after 5 ns;
 sigC <= '0','1' after 3 ns, '0' after 6 ns;
 wait;
 end process;
end teste_estrutural;
 
Mux2x1_16.vhd
library ieee;
use ieee.std_logic_1164.all;
entity mux2x1_16 is 
 port (A,B:in std_logic_vector (15 downto 0);
 C: in std_logic;
 S:out std_logic_vector (15 downto 0));
end mux2x1_16;
architecture estrutural of mux2x1_16 is
 component mux2x1
 port (A,B,C: in std_logic; S:out std_logic);
 end component;
begin
 M15:mux2x1 port map (A(15),B(15),C,S(15));
 M14:mux2x1 port map (A(14),B(14),C,S(14));
 M13:mux2x1 port map (A(13),B(13),C,S(13));
 M12:mux2x1 port map (A(12),B(12),C,S(12));
 M11:mux2x1 port map (A(11),B(11),C,S(11)); 
 M10:mux2x1 port map (A(10),B(10),C,S(10));
 M09:mux2x1 port map (A(9),B(9),C,S(9));
 M08:mux2x1 port map (A(8),B(8),C,S(8));
 M07:mux2x1 port map (A(7),B(7),C,S(7));
 M06:mux2x1 port map (A(6),B(6),C,S(6));
 M05:mux2x1 port map (A(5),B(5),C,S(5));
 M04:mux2x1 port map (A(4),B(4),C,S(4));
 M03:mux2x1 port map (A(3),B(3),C,S(3));
 M02:mux2x1 port map (A(2),B(2),C,S(2));
 M01:mux2x1 port map (A(1),B(1),C,S(1));
 M00:mux2x1 port map (A(0),B(0),C,S(0));
end estrutural;
library ieee;
use ieee.std_logic_1164.all;
entity testbenchMUX2X1_16 is
end testbenchMUX2X1_16;
architecture teste of testbenchMUX2X1_16 is
 component MUX2X1_16
 port (A,B:in std_logic_vector (15 downto 0);C: in std_logic;
 S:out std_logic_vector (15 downto 0));
 end component;
signal sigA,sigB,sigS:std_logic_vector (15 downto 0);
signal sigC:std_logic;
begin
 comp:MUX2X1_16 port map (sigA,sigB,sigC,sigS);
 process
 begin
 sigA<="0000000000000000","1111111111111111" after 2 ns,"0000000000000000" after 4 ns;
 sigB<="1111111111111111","0000000000000000" after 3 ns,"1111111111111111" after 5 ns;
 sigC<='0','1' after 3 ns,'0' after 6 ns;
 wait;
 end process;
end teste;
Mux2x1_algoritmica.vhd
library ieee;
use ieee.std_logic_1164.all;
entity MUX2x1 is
 port (A, B, C: in std_logic;
 S: out std_logic);
end MUX2x1;
architecture algoritmica of MUX2x1 is
 begin
 process (A, B, C)
 begin
 if C='0' then
 S<=A;
 else S<=B;
 end if;
 end process;
 end algoritmica;
 
library ieee;
use ieee.std_logic_1164.all;
entity testbenchMUX2x1_algoritimica is
end testbenchMUX2x1_algoritimica;
architecture teste of testbenchMUX2x1_algoritimica is
 component MUX2x1
 port (A, B, C: in std_logic;
 S: out std_logic);
 end component;
signal sigA, sigB, sigC, sigS: std_logic;
begin
 comp: MUX2x1 port map (sigA, SigB, sigC, sigS);
 process
 begin
 sigA <= '0','1' after 2 ns,'0' after 4 ns;
 sigB <= '1','0' after 3 ns,'1' after 5 ns;
 sigC <= '0','1' after 3 ns,'0' after 6 ns;
 wait;
 end process;
end teste;
MUX2X1_Fluxo.vhd
library ieee;
use ieee.std_logic_1164.all;
entity MUX2x1_fluxo is
 port (A, B, C: in std_logic;
 S: out std_logic);
end MUX2x1_fluxo;
architecture fluxo of MUX2x1_fluxo is
 begin
 S<=(B AND C) OR (A AND NOT(C));
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity testbenchMUX2x1_fluxo is
end testbenchMUX2x1_fluxo;
architecture teste of testbenchMUX2x1_fluxo is
 component MUX2x1_fluxo
 port (A, B, C: in std_logic;
 S: out std_logic);
 end component;
signal sigA, sigB, sigC, sigS: std_logic;
begin
 comp: MUX2x1_fluxo port map (sigA, SigB, sigC, sigS);
 process
 begin
 sigA <= '0','1' after 2 ns,'0' after 4 ns;
 sigB <= '1','0' after 3 ns,'1' after 5 ns;
 sigC <= '0','1' after 3 ns,'0' after 6
ns;
 wait;
 end process;
end teste;
Processador.vhd
library ieee;
use ieee.std_logic_1164.all;
entity Processador is
 port(dados_inout: inout std_logic_vector (15 downto 0);
 endereco_out: out std_logic_vector (15 downto 0); 
 rd, wr: out std_logic);
end Processador; 
architecture estrutura of Processador is 
 component alu_16bits is
 port (EntA,EntB:in std_logic_vector (15 downto 0);
 EntF: in std_logic_vector (1 downto 0);
 saiS:out std_logic_vector (15 downto 0);
 SaiN,SaiZ: out std_logic));
 end component;
 component controlador_cpu is
 port (n,z,clk: in std_logic;
		amux,mbr,mar,rd,wr,enc: out std_logic;
		ula,sh:out std_logic_vector(1 downto 0);
		a,b,c:out std_logic_vector(3 downto 0));
	end component;
	
	component decodicador4X16_estrutural is
	 port (EntDec: in std_logic_vector(3 downto 0); 
	 enDec: in std_logic;
 sDec: out std_logic_vector(15 downto 0));
	end component;
		
	component deslocador_estrutural is
	 port (EntA: in std_logic_vector(15 downto 0);
 EntF: in std_logic_vector(1 downto 0);
 SaiS: out std_logic_vector(15 downto 0));
	end component;
	
	component GSC is
	 port(T1,T2,T3,T4: out std_logic);
	end component;
	
 component incrementadorgen is
 generic (tam: integer);
 port (A: in std_logic_vector (tam - 1 downto 0);
 resultado: out std_logic_vector(tam - 1 downto 0));
 end component;
 
 component latch is
 port( D: in std_logic_vector(15 downto 0);
 CK: in std_logic;
 Q: out std_logic_vector(15 downto 0));
 end component;
 
 component logica_microsequenciamento_estrutural is
 port(EntN,EntZ: in std_logic;
 EntCond: in std_logic_vector(1 downto 0);
 SaiS: out std_logic);
 end component;
 component memoria_controle is
 port(Address: in unsigned (7 downto 0); 
 Dado: out std_logic_vector (31 downto 0));
 end component; 
 component mux2x1_16 is 
 port (A,B:in std_logic_vector (15 downto 0);
 C: in std_logic;
 S:out std_logic_vector (15 downto 0));
 end component;
 
 component MBR is
 port(barramento: inout std_logic_vector(15 downto 0);
 toCPU: out std_logic_vector(15 downto 0);
 fromCPU: in std_logic_vector(15 downto 0);
 clock,rd,wr,controle : in bit);
 end component;
 component MAR is
 port (Entrada : in std_logic_vector(15 downto 0);
 CLK,Flag:in bit;
 Saida: out std_logic_vector(15 downto 0));
 end component;
 component MIR is
 port(RST,CLK:in bit;
 D: in std_logic_vector(31 downto 0);
 Q,NQ: out std_logic_vector(31 downto 0));
 end component;
 component ffD16 is
 port(RST,CLK:in bit;
 D: in std_logic_vector(15 downto 0);
 Q,NQ: out std_logic_vector(15 downto 0));
 end component;
 
 component tristate is
 port ( entrada: in std_logic_vector (15 downto 0);
 oe: in std_logic;
 saida: out std_logic_vector (15 downto 0));
 end component ;
 signal endereco, dados, csa, csb, csc, barramento_deslocador, entradaA, entradaB, barramentoA, barramentoB,
		 sai_desloc, saida_alu, entradaAluA, mbr_sai_interno: std_logic_vector (15 downto 0);
 signal enderecoA, enderecoB, enderecoC: std_logic_vector (3 downto 0);
 signal cabo_mux1, entrada_mc, saida_inc: std_logic_vector (7 downto 0);
 signal saida_mc, sinais_controle: std_logic_vector (31 downto 0);
 signal desvio_mux, habilita_decc, subclock1, subclock2, subclock3, subclock4, n, z: std_logic;
 
 
begin
 
 GSC1:GSC port map (subclock1, subclock2, subclock3, subclock4);
 
 decA:decodicador4X16_estrutural port map (enderecoA,1,csa);
 decB:decodicador4X16_estrutural port map (enderecoB,1,csb);
 EnableDec <= subclock4 and sinais_controle (20); 
 decC:decodicador4X16_estrutural port map (enderecoC,EnableDec,csc); 
 
 mux:mux2x1_16 port map(sinais_controle(7 downto 0),saida_inc, desvio_mux, cabo_mux1);
 
 inc: incrementadorgen generic map (8) port map (entrada_mc, saida_inc);
 MEMControle: memoria_controle port map (entrada_mc, saida_mc);
 
 TIR: ffD16 port map (saida_mc, subclock1, sinais_controle);
 
 lachA: laTch port map (entradaA, subclock1, barramentoA);
 lachB: laTch port map (entradaB, subclock1, barramentoB); 
 
 amux: mux2x1_16 port map (mbr_sai_interno ,barramentoA, sinais_controle (31), entradaAluA);
 ALU1: alu_16bits port map (entradaAluA, barramentoB, sinais_controle(28 downto 27), n, z, saida_alu);
 
 desloc: deslocador_estrutural port map (saida_alu, sinais_controle(25), sinais_controle(26), sai_desloc);
 
 LMS1: logica_microsequenciamento_estrutural port map (n, z, sinais_controle (30 downto 29), desvio_mux);
 
 mar1: MAR port map (barramentoB, subclock3, sinais_controle(22), endereco);
 
 mbr: MBR port map (sai_desloc, dados_in, sinais_controle (22), sinais_controle (21), sinais_controle (20),subclock4, mbr_sai_interno, dados);
 regs: memoriat3 port map(sai_desloc, csa, csb, csc, subclock4, entradaA, entradaB); 
 rd <= sinais_controle (21);
 wr <= sinais_controle (20); 
 
 
 
 
 
 
end estrutura;
Registrador_Dados.vhd
library ieee ;
use ieee.std_logic_1164.all;
entity MBR is
 port(barramento: inout std_logic_vector(15 downto 0);
 toCPU: out std_logic_vector(15 downto 0);
 fromCPU: in std_logic_vector(15 downto 0);
 clock,rd,wr,controle : in bit);
end MBR;
architecture algoritmica of MBR is
begin
 process(controle, clock, rd,wr)
 begin
 if (clock='1' and clock'event) then
 if (controle = '1' ) then
 if ( wr ='1') then
 barramento <= fromCPU;
 else
 barramento<="ZZZZZZZZZZZZZZZZ";
 end if;
 elsif (rd = '1') then
 toCPU <= barramento;
 end if;
 end if;
end process;
end algoritmica;
library ieee;
use ieee.std_logic_1164.all;
entity teste_MBR is
end teste_MBR;
architecture testbench of teste_MBR is
 component MBR is
 port(barramento: inout std_logic_vector(15 downto 0);
 toCPU: out std_logic_vector(15 downto 0);
 fromCPU: in std_logic_vector(15 downto 0);
 clock ,rd,wr,controle: in bit);
 end component;
signal sigClk,sigRD,sigCTRL,sigWR: bit;
signal sigBarramento,sigtoCPU,sigfromCPU: std_logic_vector (15 downto 0);
begin
 comp: MBR port map (sigBarramento,sigtoCPU,sigfromCPU,sigCLK,sigRD,sigWR,sigCTRL);
process
begin
 sigClk <= not (sigClk) after 1 ns;
wait for 2 ns;
end process;
process
begin
 sigCTRL <= '1','0' after 6 ns;
 sigRD <= '0','1' after 5 ns,'0' after 10 ns;
 sigWR <= '1','0' after 6 ns;
 sigfromCPU <= "1010101010101010","1111111111111111" after 5 ns;
wait;
end process;
end testbench;
Registrador_Endereco.vhd
library ieee;
use ieee.std_logic_1164.all ;
entity MAR is
 port (Entrada : in std_logic_vector(15 downto 0);
 CLK,Flag:in bit;
 Saida: out std_logic_vector(15 downto 0) 
 );
end MAR;
architecture algo_MAR of MAR is
 begin
 process (CLK,Flag)
 begin
 if (Flag = '1' and CLK = '1' and CLK'event) then
 Saida <= Entrada;
 end if;
 end process;
 end algo_MAR;
 
library ieee ;
use ieee.std_logic_1164.all ;
entity teste_mar is 
end teste_mar;
architecture teste of teste_mar is
 component MAR
 port(Entrada : in std_logic_vector(15 downto 0);
 CLK,Flag:in bit;
 Saida: out std_logic_vector(15 downto 0) 
 );
 end component;
 signal sigIN, sigOUT: std_logic_vector(15 downto 0);
 signal sigCLK, sigF: bit;
 begin
 comp: MAR port map (sigIN,sigCLK,sigF,sigOUT); 
 process 
 begin
 sigCLK <= not(sigClk) after 1 ns;
 wait for 2 ns;
 end process;
 
 process
 begin
 sigF <= '1', '0' after 3 ns, '1' after 5 ns ;
 sigIN <= "1010001010001011","0001000100001101"
after 3 ns ,"0000001111010111" after 6 ns ;
 wait;
 end process;
end teste;
Registrador_microinstrucao.vhd
library ieee;
use ieee.std_logic_1164.all;
entity MIR is
 port(RST,CLK:in bit;
 D: in std_logic_vector(31 downto 0);
 Q,NQ: out std_logic_vector(31 downto 0));
end MIR;
architecture estru_MIR of MIR is
 component ffD
 port(RST,CLK:in bit;
 D: in std_logic;
 Q,NQ: out std_logic);
 end component;
begin
 GEN:for I in 31 downto 0 generate
 ff : ffD port map (RST, CLK, D(I), Q(I),NQ(I));
 end generate ;
end estru_MIR;
library ieee;
use ieee.std_logic_1164.all;
entity teste_MIR is
end teste_MIR;
architecture teste of teste_MIR is
 component MIR
 port(RST,CLK:in bit;
 D: in std_logic_vector(31 downto 0);
 Q,NQ: out std_logic_vector(31 downto 0));
 end component;
signal sigRST, sigCLK: bit;
signal sigD,sigQ,sigNQ :std_logic_vector(31 downto 0) ;
begin
 comp:MIR port map (sigRST, sigCLK, sigD,sigQ,sigNQ);
process
begin
 sigCLK <='0', not (sigCLK) after 1 ns;
wait for 2 ns;
end process;
process
begin
 sigD<="10111000101110011011100010111001","01000010000010000100001000001000" after 2 ns,"00000010000100010000001000010001" after 10 ns;
 sigRST<='0', '1' after 4 ns;
 wait ;
end process;
end teste;
RegistroLocal.vhd
library ieee;
use ieee.std_logic_1164.all;
entity ffD16 is
 port(RST,CLK:in bit;
 D: in std_logic_vector(15 downto 0);
 Q,NQ: out std_logic_vector(15 downto 0));
end ffD16;
architecture estru_ffD16 of ffD16 is
 component ffD
 port(RST,CLK:in bit;
 D: in std_logic;
 Q,NQ: out std_logic);
 end component;
begin
 GEN:for I in 15 downto 0 generate
 ff : ffD port map (RST, CLK, D(I), Q(I),NQ(I));
 end generate ;
end estru_ffD16;
library ieee;
use ieee.std_logic_1164.all;
entity teste_ffD16 is
end teste_ffD16;
architecture teste of teste_ffD16 is
 component ffD16
 port(RST,CLK:in bit;
 D: in std_logic_vector(15 downto 0);
 Q,NQ: out std_logic_vector(15 downto 0));
 end component;
 signal sigRST, sigCLK: bit;
 signal sigD,sigQ,sigNQ :std_logic_vector(15 downto 0) ;
begin
 comp:ffD16 port map (sigRST, sigCLK, sigD,sigQ,sigNQ);
 
process 
 begin
 sigCLK <='0', not (sigCLK) after 3 ns;
 wait for 5 ns;
end process;
 
process 
 begin
 sigD<="1011100010111001","0100001000001000" after 2 ns,"0000001000010001" after 10 ns;
 sigRST<='0', '1' after 4 ns;
 wait ;
end process;
end teste;
Somador.vhd
library ieee;
use ieee.std_logic_1164.all;
entity somador is
 port (A, B, vem1: in std_logic;
 resultado, vai1: out std_logic);
end somador;
architecture fluxo of somador is 
signal somando: std_logic_vector (8 downto 0);
begin
somando(0) <= a xor b;
somando(1) <= vem1 xor somando(0);
somando(2) <= a and b;
somando(3) <= vem1 and somando(0);
vai1 <= somando(2) or somando(3);
resultado <= somando(1);
end fluxo;
library ieee;
use ieee.std_logic_1164.all;
entity testbench_somador is
end testbench_somador;
architecture testbench of testbench_somador is
component somador is
 port (A, B, vem1: in std_logic;
 resultado, vai1: out std_logic);
end component;
signal sigA,sigB,sigVem1,sigResultado,sigVai1: std_logic;
begin
somador1: somador port map(sigA,sigB,sigVem1,sigResultado,sigVai1);
 process
 begin
 sigA <= '0', '1' after 10 ns, '0' after 20 ns;
 sigB <= '1', '0' after 5 ns, '0' after 20 ns;
 sigVem1 <= '0', '1' after 10 ns, '0' after 15 ns;
 wait;
 end process;
end testbench;
SomadorGen.vhd
library ieee;
use ieee.std_logic_1164.all;
entity somadorGen is
 generic (tam: integer);
 port (A, B: in std_logic_vector (tam - 1 downto 0);
 resultado: out std_logic_vector(tam - 1 downto 0));
end somadorGen;
architecture estrutura of somadorGen is 
component somador is
 port (A, B, vem1: in std_logic;
 resultado, vai1: out std_logic);
end component;
signal result: std_logic_vector (tam - 1 downto 0);
signal vem1: std_logic_vector (tam downto 0);
begin
 vem1(0)<='0';
 som: for i in tam - 1 downto 0 generate
 somn: somador port map (a(i),b(i),vem1(i),result(i),vem1(i+1));
 end generate;
resultado <= result;
end estrutura;
library ieee;
use ieee.std_logic_1164.all;
entity testbench_somadorGen is
end testbench_somadorGen;
architecture testbench of testbench_somadorGen is
component somadorGen is
 generic (tam: integer);
 port (A, B: in std_logic_vector (tam - 1 downto 0);
 resultado: out std_logic_vector(tam - 1 downto 0));
end component;
signal sigA, sigB, sigResultado: std_logic_vector (3 downto 0);
begin
 somadorX: somadorGen generic map (4) port map (sigA, sigB, sigResultado);
 
 process
 begin
 sigA<= "0000", "0001" after 5 ns, "0010" after 10 ns, "1111" after 20 ns;
 sigB<= "0000", "0001" after 5 ns, "0001" after 10 ns, "1001" after 15 ns, "1111" after 20 ns, "0001" after 25 ns;
 wait;
 end process;
end testbench;
Tristate.vhd
library ieee;
use ieee.std_logic_1164.all;
-- Tristate 16 bits 
entity tristate is
 port ( entrada: in std_logic_vector (15 downto 0);
 oe: in std_logic;
 saida: out std_logic_vector (15 downto 0));
end tristate ;
architecture estrutura of tristate is
signal entrada_tri, saida_tri: std_logic_vector (15 downto 0);
begin
 saida <= entrada when oe = '1' else "ZZZZZZZZZZZZZZZZ"; 
end estrutura;
library ieee;
use ieee.std_logic_1164.all;
 
entity testbench_tristate is
end testbench_tristate;
architecture teste of testbench_tristate is
component tristate is
 port ( entrada: in std_logic_vector (15 downto 0);
 oe: in std_logic;
 saida: out std_logic_vector (15 downto 0));
end component;
signal ent, sai: std_logic_vector (15 downto 0);
signal sinal:std_logic;
 begin
 a1: tristate port map (ent,sinal,sai);
 
 process
 begin
 ent <="1010101010101010", "1111111111111111" after 12 ns;
 sinal <= '0', '1' after 5 ns, '0' after 13 ns, '1' after 20 ns;
 wait;
 end process;
 
end teste;

Teste o Premium para desbloquear

Aproveite todos os benefícios por 3 dias sem pagar! 😉
Já tem cadastro?

Mais conteúdos dessa disciplina