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

Subversion Repositories vhdl-pipeline-mips

[/] [vhdl-pipeline-mips/] [trunk/] [segmented_mips.vhd] - Rev 2

Compare with Previous | Blame | View Log

--
-- Entidad Segmented MIPS (Top Level) 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 SEGMENTED_MIPS is
	port(
		CLK 	: in STD_LOGIC;
		RESET	: in STD_LOGIC
	);
end SEGMENTED_MIPS;
 
architecture SEGMENTED_MIPS_ARC of SEGMENTED_MIPS is	
 
	--Declaración de componentes
		component INSTRUCTION_FETCHING is
		 port(
			--Entradas
			CLK		:	in STD_LOGIC;					-- Reloj
			RESET		:	in STD_LOGIC;					-- Reset asincrónico
			PCSrc		:	in STD_LOGIC;					-- Señal de habilitación del MUX_PC
			NEW_PC_ADDR_IN	:	in STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);	-- Una de las entradas del MUX_PC
			--Salidas
			NEW_PC_ADDR_OUT	:	out STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);	--Nueva instrucción del PC
			INSTRUCTION 	:	out STD_LOGIC_VECTOR(INST_SIZE-1 downto 0)	--La instrucción encontrada en la Memoria de Instrucción
		 );
		end component INSTRUCTION_FETCHING;
 
		component INSTRUCTION_DECODING is
		port(
			CLK			:	in	STD_LOGIC;				--Reloj
			RESET			:	in	STD_LOGIC;				--Reset asincrónico asincrónico
			--Entradas de la etapa de Búsqueda de la Instrucción (IF)
			INSTRUCTION		:	in	STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Instrucción
			NEW_PC_ADDR_IN		:	in	STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Nueva dirección del PC
			--Entradas de la etapa de Post Escritura (WB)	  
			RegWrite		:	in	STD_LOGIC;				--Señal de habilitación de escritura (RegWrite)		 
			WRITE_DATA		:	in	STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos a ser escritos
			WRITE_REG 		:	in	STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro Rd
			--Salidas de la etapa de Búsqueda de la Instrucción (IF)
			NEW_PC_ADDR_OUT		:	out	STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Nueva dirección del PC
			--Salidas generadas a partir de la instrucción
			OFFSET			:	out	STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Offset de la instrucción  [15-0]
			RT_ADDR			:	out	STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro RT [20-16]
			RD_ADDR			:	out	STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro RD [15-11]
			--Salidas del Banco de Registros
			RS	 		:	out	STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos leidos de la dir. Rs
			RT 			:	out	STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos leidos de la dir. Rt
			--Salidas de la Unidad de Control
			WB_CR			:	out	WB_CTRL_REG;				--Estas señales se postergarán hasta la etapa WB
			MEM_CR			:	out	MEM_CTRL_REG;				--Estas señales se postergarán hasta la etapa MEM
			EX_CR			:	out	EX_CTRL_REG				--Estas señales se postergarán hasta la etapa EX     
		);
		end component INSTRUCTION_DECODING;
 
		component 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 component EXECUTION;
 
		component MEMORY_ACCESS is
		port( 
				--Entradas
				CLK			: in STD_LOGIC;
				RESET			: in STD_LOGIC;					--Reset asincrónico
				WB_IN			: in WB_CTRL_REG;				--Estas señales se postergarán hasta la etapa WB
				MEM			: in MEM_CTRL_REG;				--Estas señales serán usadas en esta etapa
				FLAG_ZERO		: in STD_LOGIC;					--Flag Zero de la ALU
				NEW_PC_ADDR		: in STD_LOGIC_vector (INST_SIZE-1 downto 0);	--Nueva dirección de pc hacia la etapa de IF
				ADDRESS_IN		: in STD_LOGIC_vector (INST_SIZE-1 downto 0);	--Salida de la ALU (ALU Result), dirección de la memoria de datos
				WRITE_DATA		: in STD_LOGIC_vector (INST_SIZE-1 downto 0);	--Datos a ser escritos en la memoria de datos
				WRITE_REG_IN		: in STD_LOGIC_vector (ADDR_SIZE-1 downto 0);	--WriteRegister de los registros de la etapa de ID
				--Salidas hacia la etapa WB, sincronizadas por registros
				WB_OUT			: out WB_CTRL_REG;				--Estas señales se postergarán hasta la etapa WB
				READ_DATA		: out STD_LOGIC_vector (INST_SIZE-1 downto 0);	--Datos leidos de la memoria de datos
				ADDRESS_OUT		: out STD_LOGIC_vector (INST_SIZE-1 downto 0);	--Resultado de la ALU
				WRITE_REG_OUT		: out STD_LOGIC_vector (ADDR_SIZE-1 downto 0);	--WriteRegister de los registros de la etapa de ID
				--Salidas hacia la etapas IF, sin sincronización
				NEW_PC_ADDR_OUT		: out STD_LOGIC_vector (INST_SIZE-1 downto 0);	--Nueva dirección de pc hacia la etapa de IF
				PCSrc			: out STD_LOGIC					--Señal de habilitación del mux de la etapa de IF
			);
		end component MEMORY_ACCESS;
 
		component WRITE_BACK is
		port( 
				--Entradas
				RESET			: in STD_LOGIC;					--Reset asincrónico
				WB			: in WB_CTRL_REG;				--Señalesde control para esta etapa
				READ_DATA		: in STD_LOGIC_vector (INST_SIZE-1 downto 0);	--Posible dato a ser escribido en la memoria de registros
				ADDRESS			: in STD_LOGIC_vector (INST_SIZE-1 downto 0);	--Posible dato a ser escribido en la memoria de registros
				WRITE_REG		: in STD_LOGIC_vector (ADDR_SIZE-1 downto 0);	--Dirección del registro a ser escrito en la memoria de registros		
				--Salidas hacia la etapas ID, sin sincronización
				RegWrite		: out STD_LOGIC;				--WB_OUT.RegWrite
				WRITE_REG_OUT		: out STD_LOGIC_vector (ADDR_SIZE-1 downto 0);	--Dirección del registro a ser escrito en la memoria de registros
				WRITE_DATA		: out STD_LOGIC_vector (INST_SIZE-1 downto 0)	--Este dato representa a READ_DATA o a ADDRESS, según lo decida WB_OUT.MemtoReg
		);
		end component WRITE_BACK;
 
	--Declaración de señales
 
		-- Buses de datos, representan los datos que se pasan entre las etapas
 
		-- MEM/IF
		signal PCSrc_AUX		: STD_LOGIC;
		signal NEW_PC_ADDR_AUX4		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		-- IF/ID
		signal NEW_PC_ADDR_AUX1		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal INSTRUCTION_AUX		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		-- WB/ID
		signal RegWrite_AUX		: STD_LOGIC;
		signal WRITE_REG_AUX2		: STD_LOGIC_vector (ADDR_SIZE-1 downto 0);
		signal WRITE_DATA_AUX		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		-- ID/EX
		signal NEW_PC_ADDR_AUX2		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal OFFSET_AUX		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal RT_ADDR_AUX		: STD_LOGIC_vector (ADDR_SIZE-1 downto 0);
		signal RD_ADDR_AUX 		: STD_LOGIC_vector (ADDR_SIZE-1 downto 0);
		signal RS_AUX	 		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal RT_AUX1 			: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal WB_CR_AUX1		: WB_CTRL_REG;
		signal MEM_CR_AUX1		: MEM_CTRL_REG;
		signal EX_CR_AUX		: EX_CTRL_REG;
		-- EX/MEM
		signal WB_CR_AUX2		: WB_CTRL_REG;
		signal MEM_CR_AUX2		: MEM_CTRL_REG;
		signal NEW_PC_ADDR_AUX3		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal ALU_FLAGS_AUX		: ALU_FLAGS;
		signal ALU_RES_AUX		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal RT_AUX2			: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal RT_RD_ADDR_AUX		: STD_LOGIC_vector (ADDR_SIZE-1 downto 0);
		--MEM/WB
		signal WB_CR_AUX3		: WB_CTRL_REG;
		signal READ_DATA_AUX		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal ADDRESS_AUX		: STD_LOGIC_vector (INST_SIZE-1 downto 0);
		signal WRITE_REG_AUX1		: STD_LOGIC_vector (ADDR_SIZE-1 downto 0);	
 
begin
 
	--Port maps
 
	INST_FETCH:
		INSTRUCTION_FETCHING port map(
			--Entradas
			CLK		=> CLK,
			RESET		=> RESET,
			PCSrc		=> PCSrc_AUX,
			NEW_PC_ADDR_IN	=> NEW_PC_ADDR_AUX4,
			--Salidas
			NEW_PC_ADDR_OUT	=> NEW_PC_ADDR_AUX1,
			INSTRUCTION	=> INSTRUCTION_AUX
		);	
 
	INST_DECOD:
		INSTRUCTION_DECODING port map(
			--Entradas
			CLK		=> CLK,
			RESET		=> RESET,
			INSTRUCTION	=> INSTRUCTION_AUX,
			NEW_PC_ADDR_IN	=> NEW_PC_ADDR_AUX1,
			RegWrite	=> RegWrite_AUX,  
			WRITE_DATA	=> WRITE_DATA_AUX, 
			WRITE_REG 	=> WRITE_REG_AUX2,
			--Salidas
			NEW_PC_ADDR_OUT	=> NEW_PC_ADDR_AUX2,
			OFFSET		=> OFFSET_AUX,
			RT_ADDR		=> RT_ADDR_AUX,
			RD_ADDR		=> RD_ADDR_AUX,
			RS 		=> RS_AUX,
			RT 		=> RT_AUX1,
			WB_CR		=> WB_CR_AUX1,
			MEM_CR		=> MEM_CR_AUX1,
			EX_CR		=> EX_CR_AUX
		);
 
	EXE:
		EXECUTION port map( 
			--Entradas
			CLK			=> CLK,
			RESET			=> RESET,
			WB_CR			=> WB_CR_AUX1,
			MEM_CR			=> MEM_CR_AUX1,
			EX_CR			=> EX_CR_AUX, 	     	
			NEW_PC_ADDR_IN		=> NEW_PC_ADDR_AUX2,
			RS	 		=> RS_AUX,
		    	RT 			=> RT_AUX1,
			OFFSET			=> OFFSET_AUX,
			RT_ADDR			=> RT_ADDR_AUX,
			RD_ADDR			=> RD_ADDR_AUX,			 				
			--Salidas
			WB_CR_OUT		=> WB_CR_AUX2,
			MEM_CR_OUT		=> MEM_CR_AUX2,
			NEW_PC_ADDR_OUT		=> NEW_PC_ADDR_AUX3,
			ALU_FLAGS_OUT		=> ALU_FLAGS_AUX,
			ALU_RES_OUT		=> ALU_RES_AUX,
			RT_OUT			=> RT_AUX2,
			RT_RD_ADDR_OUT		=> RT_RD_ADDR_AUX
		);
 
	MEM_ACC:
		MEMORY_ACCESS port map( 
			--Entradas
			CLK			=> CLK,
			RESET			=> RESET,
			WB_IN			=> WB_CR_AUX2,
			MEM			=> MEM_CR_AUX2,
			FLAG_ZERO		=> ALU_FLAGS_AUX.Zero,
			NEW_PC_ADDR		=> NEW_PC_ADDR_AUX3,
			ADDRESS_IN		=> ALU_RES_AUX,
			WRITE_DATA		=> RT_AUX2,
			WRITE_REG_IN		=> RT_RD_ADDR_AUX,
			--Salidas hacia la etapa WB, sincronizadas por registros
			WB_OUT			=> WB_CR_AUX3,
			READ_DATA		=> READ_DATA_AUX,
			ADDRESS_OUT		=> ADDRESS_AUX,
			WRITE_REG_OUT		=> WRITE_REG_AUX1,
			--Salidas hacia la etapas IF, sin sincronización
			NEW_PC_ADDR_OUT		=> NEW_PC_ADDR_AUX4,
			PCSrc			=> PCSrc_AUX	
		);
 
	WR_BK:
		WRITE_BACK port map( 
			--Entradas			
			RESET			=> RESET,
			WB			=> WB_CR_AUX3,
			READ_DATA		=> READ_DATA_AUX,
			ADDRESS			=> ADDRESS_AUX,
			WRITE_REG		=> WRITE_REG_AUX1,
			--Salidas hacia la etapas ID, sin sincronización
			RegWrite		=> RegWrite_AUX,
			WRITE_REG_OUT		=> WRITE_REG_AUX2,
			WRITE_DATA		=> WRITE_DATA_AUX
		);
 
 
end SEGMENTED_MIPS_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.