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

Subversion Repositories vhdl-pipeline-mips

[/] [vhdl-pipeline-mips/] [trunk/] [1_instruction_fetching/] [instruction_fetching.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 elujan
--
2
-- Etapa Instruction Fetching (IF) del procesador MIPS Segmentado
3
--
4
-- Licencia: Copyright 2008 Emmanuel Luján
5
--
6
--      This program is free software; you can redistribute it and/or
7
--      modify it under the terms of the GNU General Public License as
8
--      published by the Free Software Foundation; either version 2 of
9
--      the License, or (at your option) any later version. This program
10
--      is distributed in the hope that it will be useful, but WITHOUT
11
--      ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
12
--      or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
13
--      License for more details. You should have received a copy of the
14
--      GNU General Public License along with this program; if not, write
15
--      to the Free Software Foundation, Inc., 51 Franklin St, Fifth Floor,
16
--      Boston, MA 02110-1301 USA.
17
-- 
18
-- Autor:       Emmanuel Luján
19
-- Email:       info@emmanuellujan.com.ar
20
-- Versión:    1.0
21
--
22
 
23
library IEEE;
24
use IEEE.STD_LOGIC_1164.all;
25
use IEEE.numeric_std.all;
26
 
27
library work;
28
use work.records_pkg.all;
29
use work.segm_mips_const_pkg.all;
30
 
31
entity INSTRUCTION_FETCHING is
32
        port(
33
                --Entradas
34
                CLK             : in STD_LOGIC;                                 -- Reloj
35
                RESET           : in STD_LOGIC;                                 -- Reset asincrónico
36
                PCSrc           : in STD_LOGIC;                                 -- Señal de habilitación del MUX_PC
37
                NEW_PC_ADDR_IN  : in STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);     -- Una de las entradas del MUX_PC
38
                --Salidas
39
                NEW_PC_ADDR_OUT : out STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);    --Nueva instrucción del PC
40
                INSTRUCTION     : out STD_LOGIC_VECTOR(INST_SIZE-1 downto 0)     --La instrucción encontrada en la Memoria de Instrucción
41
        );
42
end INSTRUCTION_FETCHING;
43
 
44
architecture INSTRUCTION_FETCHING_ARC of INSTRUCTION_FETCHING is
45
 
46
--Declaración de componentes
47
 
48
        component ADDER is
49
                generic (N:NATURAL := INST_SIZE);-- Tamaño de los valores sumados
50
                port(
51
                        X       : in    STD_LOGIC_VECTOR(N-1 downto 0);
52
                        Y       : in    STD_LOGIC_VECTOR(N-1 downto 0);
53
                        CIN     : in    STD_LOGIC;
54
                        COUT    : out   STD_LOGIC;
55
                        R       : out   STD_LOGIC_VECTOR(N-1 downto 0)
56
                );
57
        end component ADDER;
58
 
59
        component REG is
60
                generic (N:NATURAL := INST_SIZE); -- N = Tamaño del registro
61
                port(
62
                        CLK             : in    STD_LOGIC;
63
                        RESET           : in    STD_LOGIC;
64
                        DATA_IN         : in    STD_LOGIC_VECTOR(N-1 downto 0);
65
                        DATA_OUT        : out   STD_LOGIC_VECTOR(N-1 downto 0)
66
                );
67
        end component REG;
68
 
69
        component IF_ID_REGISTERS is
70
                port(
71
                        CLK             : in    STD_LOGIC;
72
                        RESET           : in    STD_LOGIC;
73
                        NEW_PC_ADDR_IN  : in    STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);
74
                        INST_REG_IN     : in    STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);
75
                        NEW_PC_ADDR_OUT : out   STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);
76
                        INST_REG_OUT    : out   STD_LOGIC_VECTOR(INST_SIZE-1 downto 0)
77
                );
78
        end component IF_ID_REGISTERS;
79
 
80
        component INSTRUCTION_MEMORY is
81
                port(
82
                        RESET           : in    STD_LOGIC;
83
                        READ_ADDR       : in    STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
84
                        INST            : out   STD_LOGIC_VECTOR (INST_SIZE-1 downto 0)
85
                );
86
        end component INSTRUCTION_MEMORY;
87
 
88
--Señales
89
        signal PC_ADDR_AUX1     : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);       --Vieja instrucción de PC
90
        signal PC_ADDR_AUX2     : STD_LOGIC_VECTOR (INST_SIZE downto 0); --Nueva instrucción de PC + Carry out
91
        signal PC_ADDR_AUX3     : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);       --Salida del MUX_PC  
92
        signal INST_AUX         : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);       --Instrucción actual
93
 
94
begin
95
 
96
        --Port maps
97
 
98
        myADDER :
99
                ADDER generic map (N => INST_SIZE)
100
                port map(
101
                        X       => PC_ADDR_AUX1,
102
                        Y       => PC_COUNT, --De a cuanto suma el PC (de a 4 bits)
103
                        CIN     => '0',
104
                        COUT    => PC_ADDR_AUX2(INST_SIZE),
105
                        R       => PC_ADDR_AUX2(INST_SIZE-1 downto 0)
106
                );
107
 
108
        MUX_PC:
109
                process(PCSrc,PC_ADDR_AUX2,NEW_PC_ADDR_IN)
110
                begin
111
                        if( PCSrc = '0') then
112
                                PC_ADDR_AUX3 <= PC_ADDR_AUX2(INST_SIZE-1 downto 0);
113
                        else
114
                                PC_ADDR_AUX3 <= NEW_PC_ADDR_IN;
115
                        end if;
116
                end process MUX_PC;
117
 
118
        PC :
119
                REG generic map (N => INST_SIZE)
120
                port map(
121
                        CLK             => CLK,
122
                        RESET           => RESET,
123
                        DATA_IN         => PC_ADDR_AUX3,
124
                        DATA_OUT        => PC_ADDR_AUX1
125
                );
126
 
127
        INST_MEM:
128
                INSTRUCTION_MEMORY port map(
129
                        RESET           =>      RESET,
130
                        READ_ADDR       =>      PC_ADDR_AUX1,
131
                        INST            =>      INST_AUX
132
                );
133
 
134
        IF_ID_REG:
135
                IF_ID_REGISTERS port map(
136
                        CLK             => CLK,
137
                        RESET           => RESET,
138
                        NEW_PC_ADDR_IN  => PC_ADDR_AUX2(INST_SIZE-1 downto 0),
139
                        INST_REG_IN     => INST_AUX,
140
                        NEW_PC_ADDR_OUT => NEW_PC_ADDR_OUT,
141
                        INST_REG_OUT    => INSTRUCTION
142
                );
143
 
144
end INSTRUCTION_FETCHING_ARC;

powered by: WebSVN 2.1.0

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