Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Como observaciones tenemos que para nuestro diseño únicamente tomaremos en cuenta los
siguientes bloques:
- REGISTERS
- ALU
- CONTROL
- CONTROL DE LA ALU
Los multiplexores no serán considerados en este caso ya que únicamente se considerara un solo
formato por lo que considero que no son necesarios.
- IMPLENTACION CONCEPTUAL:
Nuestro datapath fue ordenado de la siguiente manera:
CONTROL DE LA ALU
entity Register_File is
port( ----- ENTRADAS -----
-- Rb Ra Rd
Reg2,Reg1,WriteReg : in std_logic_vector (4 downto 0); -- WriteReg es el registro de escritura
WriteData : in std_logic_vector(31 downto 0); -- se escribira el resultado de la ALU
RegWrite : in std_logic;
----- SALIDAS -----
RegO1,RegO2: out std_logic_vector(31 downto 0));
end Register_File;
process(Reg1,Reg2,WriteReg,WriteData,RegWrite)
begin
IF(RegWrite='1') then
------------------------ REGISTRO RS ------------------------------------------
if (Reg1 = "00000") then RegO1<=R0;
elsif (Reg1 = "00001") then RegO1<=R1; elsif (Reg1 = "00010") then RegO1<=R2;
elsif (Reg1 = "00011") then RegO1<=R3; elsif (Reg1 = "00100") then RegO1<=R4;
elsif (Reg1 = "00101") then RegO1<=R5; elsif (Reg1 = "00110") then RegO1<=R6;
elsif (Reg1 = "00111") then RegO1<=R7; elsif (Reg1 = "01000") then RegO1<=R8;
elsif (Reg1 = "01001") then RegO1<=R9; elsif (Reg1 = "01010") then RegO1<=R10;
elsif (Reg1 = "01011") then RegO1<=R11; elsif (Reg1 = "01100") then RegO1<=R12;
elsif (Reg1 = "01101") then RegO1<=R13; elsif (Reg1 = "01110") then RegO1<=R14;
elsif (Reg1 = "01111") then RegO1<=R15; elsif (Reg1 = "10000") then RegO1<=R16;
elsif (Reg1 = "10001") then RegO1<=R17; elsif (Reg1 = "10010") then RegO1<=R18;
elsif (Reg1 = "10011") then RegO1<=R19; elsif (Reg1 = "10100") then RegO1<=R20;
elsif (Reg1 = "10101") then RegO1<=R21; elsif (Reg1 = "10110") then RegO1<=R22;
elsif (Reg1 = "10111") then RegO1<=R23; elsif (Reg1 = "11000") then RegO1<=R24;
elsif (Reg1 = "11001") then RegO1<=R25; elsif (Reg1 = "11010") then RegO1<=R26;
elsif (Reg1 = "11011") then RegO1<=R27; elsif (Reg1 = "11100") then RegO1<=R28;
elsif (Reg1 = "11101") then RegO1<=R29; elsif (Reg1 = "11110") then RegO1<=R30;
elsif (Reg1 = "11111") then RegO1<=R31; end if;
------------------------ REGISTRO RT ------------------------------------------
if (Reg2 = "00000") then RegO2<=R0;
elsif (Reg2 = "00001") then RegO2<=R1; elsif (Reg2 = "00010") then RegO2<=R2;
elsif (Reg2 = "00011") then RegO2<=R3; elsif (Reg2 = "00100") then RegO2<=R4;
elsif (Reg2 = "00101") then RegO2<=R5; elsif (Reg2 = "00110") then RegO2<=R6;
elsif (Reg2 = "00111") then RegO2<=R7; elsif (Reg2 = "01000") then RegO2<=R8;
elsif (Reg2 = "01001") then RegO2<=R9; elsif (Reg2 = "01010") then RegO2<=R10;
elsif (Reg2 = "01011") then RegO2<=R11; elsif (Reg2 = "01100") then RegO2<=R12;
elsif (Reg2 = "01101") then RegO2<=R13; elsif (Reg2 = "01110") then RegO2<=R14;
elsif (Reg2 = "01111") then RegO2<=R15; elsif (Reg2 = "10000") then RegO2<=R16;
elsif (Reg2 = "10001") then RegO2<=R17; elsif (Reg2 = "10010") then RegO2<=R18;
elsif (Reg2 = "10011") then RegO2<=R19; elsif (Reg2 = "10100") then RegO2<=R20;
elsif (Reg2 = "10101") then RegO2<=R21; elsif (Reg2 = "10110") then RegO2<=R22;
elsif (Reg2 = "10111") then RegO2<=R23; elsif (Reg2 = "11000") then RegO2<=R24;
elsif (Reg2 = "11001") then RegO2<=R25; elsif (Reg2 = "11010") then RegO2<=R26;
elsif (Reg2 = "11011") then RegO2<=R27; elsif (Reg2 = "11100") then RegO2<=R28;
elsif (Reg2 = "11101") then RegO2<=R29; elsif (Reg2 = "11110") then RegO2<=R30;
elsif (Reg2 = "11111") then RegO2<=R31; end if;
------------------------ REGISTRO RD ------------------------------------------
if (WriteReg = "01000") then RD<=R8; elsif (WriteReg = "01001") then RD<=R9;
elsif (WriteReg = "01010") then RD<=R10; elsif (WriteReg = "01011") then RD<=R11;
elsif (WriteReg = "01100") then RD<=R12; elsif (WriteReg = "01101") then RD<=R13;
elsif (WriteReg = "01110") then RD<=R14; elsif (WriteReg = "01111") then RD<=R15;
elsif (WriteReg = "10000") then RD<=R16; elsif (WriteReg = "10001") then RD<=R17;
elsif (WriteReg = "10010") then RD<=R18; elsif (WriteReg = "10011") then RD<=R19;
elsif (WriteReg = "10100") then RD<=R20; elsif (WriteReg = "10101") then RD<=R21;
elsif (WriteReg = "10110") then RD<=R22; elsif (WriteReg = "10111") then RD<=R23; end if;
RD <= WriteData;
ELSE
RD <= "00000000000000000000000000000000";
end if;
end process;
end arch_Register_File;
entity Control is
port( Instru : in std_logic_vector(5 downto 0); -- op que va de 31 a 26
-----------------------------------------------------------------------------
ALUop1 : out std_logic_vector(1 downto 0);
RegWrite1 : out std_logic );
end Control;
end arch_Control;
--- CONTROL DE LA ALU---
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity ALU_control is
port( ALUop2: in std_logic_vector(1 downto 0);
funct : in std_logic_vector(5 downto 0); -- funct que va de 5 a 0
----------------------------------------------
carry_in : out std_logic;
control : out std_logic_vector(3 downto 0) );
end ALU_control;
end arch_ALU_control;
entity ALU_32 is
port( ----- ENTRADAS -----
A,B : in std_logic_vector(31 downto 0);
operacion : in std_logic_vector( 3 downto 0); --- selector de operaciones
Cin : in std_logic;
----- SALIDAS -----
resultadoALU : out std_logic_vector(31 downto 0); --- resultado de la operacion
Cout,cero,overflow : out std_logic);
end ALU_32;
end arch_ALU_32;
--- TEST BENCH ---
library ieee;
use ieee.std_logic_1164.all;
entity tb_datapath is
end tb_datapath;