4 Direccion
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
6 26
esta instruccin slo contiene el cdigo de operacin y la direccin a donde
va a saltar
Ahora especificaremos cmo funcionan cada una de las partes del datapath.
para el diseo del control principal debemos recordar lo siguiente:
ALUSrc
Desactivado: el segundo operando de ALU se toma de la salida del segundo
archivo de registro (ReadData 2). Es decir, solo se activa con las
instrucciones tipo R ya que el Read Data 2 para por el 0 del mux haciendo
que lo que salga del read data 2, pase directamente.
Activado: el segundo operando alu es el signo extendido, 16 bits ms bajos de
la instruccin. Este mux est en 1 cuando se ocupan las instrucciones tipo
R, Ya que el primer registro de las instrucciones tipo R entra por el Read
Data 1, y el segundo pasa por el signo extendido, haciendo que entre active el
mux.
PCSrc
Desactivado: la PC sobrescribe la salida del sumador (PC + 1), es decir, el
contador suma 1 cada ciclo del reloj.
Activado: PC sobrescrito por la direccin de destino. Cuando existe un salto,
este mux se activa haciendo que se sume lo que tiene el signo extendido con
lo que tiene el PC, haciendo que se vuelva a actualizar en el siguiente ciclo.
MemRead
Desactivado: ninguna accin
Activado:Este acceso se ocupa solamente cuando se guardaran elementos, es
decir con la instruccin Sw, lo que har es guardar lo que tenga el Read
Data 2 en la Memoria Read, no pasara por otra instruccin.
MemWrite
Desactivado: ninguna accin
Activado: Los contenidos de la memoria de datos designados por la entrada
de direccin estn presentes en la entrada WriteData
RegWrite
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
desigualdad entre los registros. Si los contenidos de los registros son iguales
el brinco debe realizarse, por lo que el sumador deber ser sustituido por la
direccin calculada. Pero si no son iguales, el brinco no se realizar por lo
que se continuar con la instruccin ubicada en la direccin siguiente a la
direccin del brinco.
Por lo tanto, el camino de datos debe realizar las dos operaciones: calcular la
direccin destino del brinco y comparar los contenidos de los registros. La
ALU realizara una resta para verificar si los contenidos de los registros son
iguales de manera que el salto queda condicionado cuando la bandera zero
est en alto (es decir 1). Con otro sumador se obtendr la direccin destino
del brinco. En la instruccin se incluye al desplazamiento en 16 bits, ste se
extiende en signo y PC + 1. El resultado de la suma es la direccin destino
del brinco.
En el caso de la instruccin j, el salto es incondicional; es decir, no est
sujeto al resultado de una comparacin. La instruccin j tiene dos campos, un
campo de 6 bits que corresponde al opcode y otro de 26 bits que indica la
direccin destino del salto. Para esta instruccin tambin deber considerarse
que las instrucciones ocupan 4 bytes, El nuevo valor del contador de
instrucciones se obtendr concatenando los 6 bits menos.
En las imgenes anteriores se mostr el camino de datos para cada
instruccin, ahora se combinar para tener un solo camino de datos.
Debe tomarse en cuenta que se trata de una implementacin que ejecutar
todas las instrucciones en 1 ciclo de reloj. Esto significa que los recursos en
el camino de los datos no pueden ser usados ms de una vez por instruccin,
de manera que cualquier elemento que se requiera ms de una vez, deber ser
duplicado.
Al compartir elementos, pueden requerirse mltiples conexiones a una
entrada. Para ello se utilizarn multiplexores, y ser el control el que
determine cul de los datos fluir a cada entrada.
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
Control de la ALU
La seleccin entre cada una de las entradas depender de la clase de
instruccin. para cargas y almacenamientos se requiere que la ALU realice
una suma para calcular la direccin de la localidad de memoria a la que se
realizar el acceso. para instrucciones aritmtico lgicas la ALU realizara una
suma, resta,AND, OR, o ajuste sobre menor que, dependiendo del campo de
funcin que se encuentra en los 6 bits menos significativos en esta clase de
instrucciones.
como un primer paso realizaremos una pequea unidad de control que tenga
una entrada de 2 bits a la que se determin como ALUop. con esa entrada se
determina si la ALU realizara una suma para carga de almacenamientos, una
resta para brincos o si la operacin quedar determinada por el campo de la
funcin para instrucciones tipo R.la salida de la ALU se conectar
directamente con las lneas de control de la ALU.
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3) Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
Memoria de Datos
Descripcin
Es una memoria que permite almacenar temporalmente datos,
como si fuera una memoria del sistema.
Cdigo
entity DataMem is
Port ( i_addr : in STD_LOGIC_VECTOR (31 downto 0);
i_din : in STD_LOGIC_VECTOR (31 downto 0);
i_clk : in STD_LOGIC;
i_we : in STD_LOGIC;
o_dat : out STD_LOGIC_VECTOR (31 downto 0));
end DataMem;
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
begin
process (i_clk, i_addr)
begin
end Behavioral;
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
Descripcin
Cdigo
entity pccontrol is
Port ( i_pcsel : in STD_LOGIC_VECTOR (1 downto 0);
i_eq : in STD_LOGIC;
o_pcsel : out STD_LOGIC_VECTOR (1 downto 0));
end pccontrol;
begin
process (i_pcsel, i_eq)
begin
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
end process;
end Behavioral;
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
Descripcin
Cdigo
entity ext26b is
Port ( i_dat : in STD_LOGIC_VECTOR (25 downto 0);
o_ext : out STD_LOGIC_VECTOR (31 downto 0));
end ext26b;
begin
process (i_dat)
begin
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
end if;
end process;
end Behavioral;
Descripcin
Cdigo
entity decopcode is
Port ( i_opcode : in std_logic_vector(5 downto 0);
i_funct : in std_logic_vector(5 downto 0);
o_aluctrl : out std_logic_vector(3 downto 0);
o_alusrc : out std_logic;
o_regdest : out std_logic;
o_regwr : out std_logic;
o_memwr : out std_logic;
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
begin
process (i_opcode, i_funct)
begin
case i_opcode is
when "000000" => -- tipo R
case i_funct is
when "000000" => o_aluctrl <= "1001"; -- SLL
when "000010" => o_aluctrl <= "1010"; -- SRL
when "100100" => o_aluctrl <= "0000"; -- AND
when "100101" => o_aluctrl <= "0001"; -- OR
when "100001" => o_aluctrl <= "0010"; -- ADDU, era ADD
(100000)
when "100011" => o_aluctrl <= "0110"; -- SUBU, era SUB
(100010)
when "101010" => o_aluctrl <= "0111"; -- SLT
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
end Behavioral;
5. ALU (Modificada):
Descripcin
Cdigo
entity alu32b is
Port ( in_a : in std_logic_vector(31 downto 0);
in_b : in std_logic_vector(31 downto 0);
in_s : in std_logic_vector(4 downto 0);
in_funct : in std_logic_vector(3 downto 0);
o_y : out std_logic_vector(31 downto 0);
o_eq : out std_logic);
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
end alu32b;
begin
process (in_a, in_b, in_funct)
begin
case in_funct is
when "0000" => o_y <= in_a AND in_b;
when "0001" => o_y <= in_a OR in_b;
when "0010" => o_y <= in_a + in_b;
when "0110" => o_y <= in_a - in_b;
when "0111" => if (in_a < in_b) then
o_y <= (others => '1');
else
o_y <= (others => '0');
end if;
when "1100" => o_y <= in_a XOR in_b;
when "1001" => case in_s is
when "00000" => o_y <= in_b;
when "00001" => o_y <= in_b(30 downto 0) & '0';
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
end Behavioral;
Descripcin
Cdigo
entity Datapath3 is
Port ( i_clk : in std_logic;
i_rst : in std_logic;
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
i_we : in std_logic;
i_sel : in std_logic_vector(1 downto 0);
o_output: out std_logic_vector(7 downto 0);
o_prueba: out std_logic_vector(3 downto 0));
end Datapath3;
component Datapath1 is
Port ( i_rst : in std_logic;
i_clk : in std_logic;
i_en : in std_logic;
i_eq : in std_logic;
i_pcsrc : in std_logic_vector(1 downto 0);
i_offset : in std_logic_vector(25 downto 0);
o_data : out std_logic_vector(31 downto 0));
end component;
component Regfile is
port(i_wd : in std_logic_vector(31 downto 0); -- Input Data
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
component alu32b is
Port ( in_a : in std_logic_vector(31 downto 0);
in_b : in std_logic_vector(31 downto 0);
in_s : in std_logic_vector(4 downto 0);
in_funct : in std_logic_vector(3 downto 0);
o_y : out std_logic_vector(31 downto 0);
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
component decopcode is
Port ( i_opcode : in std_logic_vector(5 downto 0);
i_funct : in std_logic_vector(5 downto 0);
o_aluctrl : out std_logic_vector(3 downto 0);
o_alusrc : out std_logic;
o_regdest : out std_logic;
o_regwr : out std_logic;
o_memwr : out std_logic;
o_memtoreg : out std_logic;
o_pcsrc : out std_logic_vector(1 downto 0));
end component;
component extimmed is
Port ( i_immed : in STD_LOGIC_VECTOR (15 downto 0);
o_ext : out STD_LOGIC_VECTOR (31 downto 0));
end component;
component mux32b2a1 is
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
component mux5b2a1 is
Port ( i_a : in STD_LOGIC_VECTOR (4 downto 0);
i_b : in STD_LOGIC_VECTOR (4 downto 0);
i_sel : in STD_LOGIC;
o_y : out STD_LOGIC_VECTOR (4 downto 0));
end component;
component div_frec is
Port ( i_clk : in STD_LOGIC;
i_rst : in STD_LOGIC;
o_clk : out STD_LOGIC);
end component;
component mux8b4a1 is
Port ( i_d0 : in STD_LOGIC_VECTOR (7 downto 0);
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
component DataMem is
Port ( i_addr : in STD_LOGIC_VECTOR (31 downto 0);
i_din : in STD_LOGIC_VECTOR (31 downto 0);
i_clk : in STD_LOGIC;
i_we : in STD_LOGIC;
o_dat : out STD_LOGIC_VECTOR (31 downto 0));
end component;
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
begin
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
process (aluoper)
begin
o_prueba <= aluoper;
end process;
end Structural;
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
CONCLUSIONES Y RECOMENDACIONES
Referencias:
http://mixteco.utm.mx/~merg/AC/pdfs/DataPath2.pdf
http://mixteco.utm.mx/~merg/AC/pdfs/Unit_4_Part_1.pdf
http://isc.utp.edu.co/~michaelm/
MIPS Instruction Set Referente, http://www.mips.com/
____________________________
DLXMICROPROCESADOR(DATAPATH 3)
Noviembre/2006/6
____________________________