OpenCores
URL https://opencores.org/ocsvn/vhdl-pipeline-mips/vhdl-pipeline-mips/trunk

Subversion Repositories vhdl-pipeline-mips

[/] [vhdl-pipeline-mips/] [trunk/] [3_execution/] [execution.vhd] - Rev 2

Compare with Previous | Blame | View Log

--
-- Etapa Execution (EX) del procesador MIPS Segmentado
--
-- Licencia: Copyright 2008 Emmanuel Luján
--
-- 	This program is free software; you can redistribute it and/or
-- 	modify it under the terms of the GNU General Public License as
-- 	published by the Free Software Foundation; either version 2 of
-- 	the License, or (at your option) any later version. This program
-- 	is distributed in the hope that it will be useful, but WITHOUT
-- 	ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-- 	or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
-- 	License for more details. You should have received a copy of the
-- 	GNU General Public License along with this program; if not, write
-- 	to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
-- 	Boston, MA 02110-1301 USA.
-- 
-- Autor:	Emmanuel Luján
-- Email:	info@emmanuellujan.com.ar
-- Versión:	1.0
--
 
library IEEE;
use IEEE.STD_LOGIC_1164.all;		
use IEEE.numeric_std.all;
 
library work;
use work.records_pkg.all;
use work.segm_mips_const_pkg.all;
 
entity EXECUTION is
	port( 
		--Entradas
     		CLK			: in STD_LOGIC;					--Reloj
		RESET			: in STD_LOGIC;					--Reset asincrónico
     		WB_CR			: in WB_CTRL_REG; 				--Estas señales se postergarán hasta la etapa WB
		MEM_CR			: in MEM_CTRL_REG;				--Estas señales se postergarán hasta la etapa MEM
		EX_CR			: in EX_CTRL_REG;				--Estas señales se usarán en esta etapa 	     	
		NEW_PC_ADDR_IN		: in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Nueva dirección del PC
		RS	 		: in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Datos leidos de la dir. Rs
	    	RT 			: in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Datos leidos de la dir. Rt
		OFFSET			: in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Offset de la instrucción  [15-0]
		RT_ADDR			: in STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);	--Dirección del registro RT [20-16]
		RD_ADDR			: in STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);	--Dirección del registro RD [15-11]			 				
 
		--Salidas
		WB_CR_OUT		: out WB_CTRL_REG;				--Estas señales se postergarán hasta la etapa WB
		MEM_CR_OUT		: out MEM_CTRL_REG;				--Estas señales se postergarán hasta la etapa MEM
		NEW_PC_ADDR_OUT		: out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Nueva dirección del PC
		ALU_FLAGS_OUT		: out ALU_FLAGS;				--Las flags de la ALU
		ALU_RES_OUT		: out STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);	--El resultado generado por la ALU
		RT_OUT			: out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Entrará como Write Data en la etapa MEM
		RT_RD_ADDR_OUT		: out STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0)	--Se postergará hasta la etapa WB			
	);
end EXECUTION;
 
architecture EXECUTION_ARC of EXECUTION is	
 
--Declaración de componentes
	component ALU_CONTROL is
		port(
			--Entradas
			CLK		: in STD_LOGIC;				-- Reloj
			FUNCT		: in STD_LOGIC_VECTOR(5 downto 0);	-- Campo de la instrucción FUNC
			ALU_OP_IN	: in ALU_OP_INPUT;			-- Señal de control de la Unidad de Control
			--Salidas
		     	ALU_IN		: out ALU_INPUT				-- Entrada de la ALU
		);
	end component ALU_CONTROL;
 
	component ALU is 
		generic (N:INTEGER := INST_SIZE);
		port(
			X		: in STD_LOGIC_VECTOR(N-1 downto 0);
			Y		: in STD_LOGIC_VECTOR(N-1 downto 0);
			ALU_IN		: in ALU_INPUT;
			R		: out STD_LOGIC_VECTOR(N-1 downto 0);
			FLAGS		: out ALU_FLAGS	
		);
	end component ALU;
 
	component ADDER is 
		generic (N:INTEGER := INST_SIZE);    
		port(
			X	: in	STD_LOGIC_VECTOR(N-1 downto 0);
			Y	: in	STD_LOGIC_VECTOR(N-1 downto 0);
			CIN	: in	STD_LOGIC;
			COUT	: out	STD_LOGIC;
			R	: out	STD_LOGIC_VECTOR(N-1 downto 0)
		);
	end component ADDER;
 
	component EX_MEM_REGISTERS is  
	    port(
			--Entradas
			CLK		: in STD_LOGIC;					--Reloj
			RESET		: in STD_LOGIC;					--Reset asincrónico
			WB_CR_IN	: in WB_CTRL_REG; 				--Estas señales se postergarán hasta la etapa WB
			MEM_CR_IN	: in MEM_CTRL_REG;				--Estas señales se postergarán hasta la etapa MEM
			NEW_PC_ADDR_IN	: in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Nueva dirección del PC
			ALU_FLAGS_IN	: in ALU_FLAGS;					--Las flags de la ALU
			ALU_RES_IN	: in STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);	--El resultado generado por la ALU
			RT_IN		: in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Entrará como Write Data en la etapa MEM
			RT_RD_ADDR_IN	: in STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);	--Se postergará hasta la etapa WB)	
 
			--Salidas
			WB_CR_OUT	: out WB_CTRL_REG; 				--Estas señales se postergarán hasta la etapa WB
			MEM_CR_OUT	: out MEM_CTRL_REG;				--Estas señales se postergarán hasta la etapa MEM
			NEW_PC_ADDR_OUT	: out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Nueva dirección del PC
			ALU_FLAGS_OUT	: out ALU_FLAGS;				--Las flags de la ALU
			ALU_RES_OUT	: out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--El resultado generado por la ALU
			RT_OUT		: out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);	--Entrará como Write Data en la etapa MEM
			RT_RD_ADDR_OUT	: out STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0)	--Se postergará hasta la etapa WB)
 
		);
	end component EX_MEM_REGISTERS;
 
--Declaración de señales
	signal CARRY_AUX	: STD_LOGIC;
	signal ALU_IN_AUX	: ALU_INPUT;
	signal PC_ADDR_AUX	: STD_LOGIC_VECTOR (INST_SIZE-1 downto 0); 
	signal RT_RD_ADDR_AUX	: STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);
	signal OFFSET_SHIFT2	: STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
	signal ALU_REG_IN	: STD_LOGIC_VECTOR (INST_SIZE-1 downto 0); 
	signal ALU_RES_AUX	: STD_LOGIC_VECTOR (INST_SIZE-1 downto 0); 
	signal ALU_FLAGS_AUX	: ALU_FLAGS;
 
begin
	OFFSET_SHIFT2 <= OFFSET(29 downto 0) & "00";
 
	--Port maps
	ALU_CTRL:
		ALU_CONTROL port map(
			CLK		=> CLK,
			FUNCT		=> OFFSET(5 downto 0),
			ALU_OP_IN	=> EX_CR.ALUOp,
		     	ALU_IN		=> ALU_IN_AUX
		);
 
	ADDER_MIPS: 
		ADDER generic map (N => INST_SIZE) 
		port map(
			X	 => NEW_PC_ADDR_IN,
			Y	 => OFFSET_SHIFT2,
			CIN	 => '0',
			COUT	 => CARRY_AUX,
			R	 => PC_ADDR_AUX
		);
 
	MUX_RT_RD:
		process(EX_CR.RegDst,RT_ADDR,RD_ADDR) is
    		begin
    	 		if( EX_CR.RegDst = '0') then
    	 			RT_RD_ADDR_AUX <= RT_ADDR; 
	    	 	else
    		 		RT_RD_ADDR_AUX <= RD_ADDR;
    		 	end if;
    	 	end process MUX_RT_RD;
 
	MUX_ALU:
		process(EX_CR.AluSrc,ALU_REG_IN,RT,OFFSET)
		begin
			if( EX_CR.AluSrc = '0') then
				ALU_REG_IN <= RT; 
			else
				ALU_REG_IN <= OFFSET;
			end if;
		end process MUX_ALU;
 
	ALU_MIPS: 
		ALU generic map (N => INST_SIZE)
		port map(
			X	=> RS,
			Y	=> ALU_REG_IN,
			ALU_IN	=> ALU_IN_AUX,
			R	=> ALU_RES_AUX,
			FLAGS	=> ALU_FLAGS_AUX
		);
 
	EX_MEM_REGS:
		 EX_MEM_REGISTERS port map(
			--Entradas
			CLK		=> CLK,
			RESET		=> RESET,
			WB_CR_IN	=> WB_CR,
			MEM_CR_IN	=> MEM_CR,
			NEW_PC_ADDR_IN	=> PC_ADDR_AUX,
			ALU_FLAGS_IN	=> ALU_FLAGS_AUX,
			ALU_RES_IN	=> ALU_RES_AUX,
			RT_IN		=> RT,
			RT_RD_ADDR_IN	=> RT_RD_ADDR_AUX,	
			--Salidas
			WB_CR_OUT	=> WB_CR_OUT,
			MEM_CR_OUT	=> MEM_CR_OUT,
			NEW_PC_ADDR_OUT	=> NEW_PC_ADDR_OUT,
			ALU_FLAGS_OUT	=> ALU_FLAGS_OUT,
			ALU_RES_OUT	=> ALU_RES_OUT,
			RT_OUT		=> RT_OUT,
			RT_RD_ADDR_OUT	=> RT_RD_ADDR_OUT	
		);
 
end EXECUTION_ARC;
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.