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] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 elujan
--
2
-- Etapa Execution (EX) 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 EXECUTION is
32
        port(
33
                --Entradas
34
                CLK                     : in STD_LOGIC;                                 --Reloj
35
                RESET                   : in STD_LOGIC;                                 --Reset asincrónico
36
                WB_CR                   : in WB_CTRL_REG;                               --Estas señales se postergarán hasta la etapa WB
37
                MEM_CR                  : in MEM_CTRL_REG;                              --Estas señales se postergarán hasta la etapa MEM
38
                EX_CR                   : in EX_CTRL_REG;                               --Estas señales se usarán en esta etapa               
39
                NEW_PC_ADDR_IN          : in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);    --Nueva dirección del PC
40
                RS                      : in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);    --Datos leidos de la dir. Rs
41
                RT                      : in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);    --Datos leidos de la dir. Rt
42
                OFFSET                  : in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);    --Offset de la instrucción  [15-0]
43
                RT_ADDR                 : in STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);    --Dirección del registro RT [20-16]
44
                RD_ADDR                 : in STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);    --Dirección del registro RD [15-11]                                                    
45
 
46
                --Salidas
47
                WB_CR_OUT               : out WB_CTRL_REG;                              --Estas señales se postergarán hasta la etapa WB
48
                MEM_CR_OUT              : out MEM_CTRL_REG;                             --Estas señales se postergarán hasta la etapa MEM
49
                NEW_PC_ADDR_OUT         : out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);   --Nueva dirección del PC
50
                ALU_FLAGS_OUT           : out ALU_FLAGS;                                --Las flags de la ALU
51
                ALU_RES_OUT             : out STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);    --El resultado generado por la ALU
52
                RT_OUT                  : out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);   --Entrará como Write Data en la etapa MEM
53
                RT_RD_ADDR_OUT          : out STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0)    --Se postergará hasta la etapa WB                      
54
        );
55
end EXECUTION;
56
 
57
architecture EXECUTION_ARC of EXECUTION is
58
 
59
--Declaración de componentes
60
        component ALU_CONTROL is
61
                port(
62
                        --Entradas
63
                        CLK             : in STD_LOGIC;                         -- Reloj
64
                        FUNCT           : in STD_LOGIC_VECTOR(5 downto 0);       -- Campo de la instrucción FUNC
65
                        ALU_OP_IN       : in ALU_OP_INPUT;                      -- Señal de control de la Unidad de Control
66
                        --Salidas
67
                        ALU_IN          : out ALU_INPUT                         -- Entrada de la ALU
68
                );
69
        end component ALU_CONTROL;
70
 
71
        component ALU is
72
                generic (N:INTEGER := INST_SIZE);
73
                port(
74
                        X               : in STD_LOGIC_VECTOR(N-1 downto 0);
75
                        Y               : in STD_LOGIC_VECTOR(N-1 downto 0);
76
                        ALU_IN          : in ALU_INPUT;
77
                        R               : out STD_LOGIC_VECTOR(N-1 downto 0);
78
                        FLAGS           : out ALU_FLAGS
79
                );
80
        end component ALU;
81
 
82
        component ADDER is
83
                generic (N:INTEGER := INST_SIZE);
84
                port(
85
                        X       : in    STD_LOGIC_VECTOR(N-1 downto 0);
86
                        Y       : in    STD_LOGIC_VECTOR(N-1 downto 0);
87
                        CIN     : in    STD_LOGIC;
88
                        COUT    : out   STD_LOGIC;
89
                        R       : out   STD_LOGIC_VECTOR(N-1 downto 0)
90
                );
91
        end component ADDER;
92
 
93
        component EX_MEM_REGISTERS is
94
            port(
95
                        --Entradas
96
                        CLK             : in STD_LOGIC;                                 --Reloj
97
                        RESET           : in STD_LOGIC;                                 --Reset asincrónico
98
                        WB_CR_IN        : in WB_CTRL_REG;                               --Estas señales se postergarán hasta la etapa WB
99
                        MEM_CR_IN       : in MEM_CTRL_REG;                              --Estas señales se postergarán hasta la etapa MEM
100
                        NEW_PC_ADDR_IN  : in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);    --Nueva dirección del PC
101
                        ALU_FLAGS_IN    : in ALU_FLAGS;                                 --Las flags de la ALU
102
                        ALU_RES_IN      : in STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);     --El resultado generado por la ALU
103
                        RT_IN           : in STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);    --Entrará como Write Data en la etapa MEM
104
                        RT_RD_ADDR_IN   : in STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);    --Se postergará hasta la etapa WB)     
105
 
106
                        --Salidas
107
                        WB_CR_OUT       : out WB_CTRL_REG;                              --Estas señales se postergarán hasta la etapa WB
108
                        MEM_CR_OUT      : out MEM_CTRL_REG;                             --Estas señales se postergarán hasta la etapa MEM
109
                        NEW_PC_ADDR_OUT : out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);   --Nueva dirección del PC
110
                        ALU_FLAGS_OUT   : out ALU_FLAGS;                                --Las flags de la ALU
111
                        ALU_RES_OUT     : out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);   --El resultado generado por la ALU
112
                        RT_OUT          : out STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);   --Entrará como Write Data en la etapa MEM
113
                        RT_RD_ADDR_OUT  : out STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0)    --Se postergará hasta la etapa WB)
114
 
115
                );
116
        end component EX_MEM_REGISTERS;
117
 
118
--Declaración de señales
119
        signal CARRY_AUX        : STD_LOGIC;
120
        signal ALU_IN_AUX       : ALU_INPUT;
121
        signal PC_ADDR_AUX      : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
122
        signal RT_RD_ADDR_AUX   : STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);
123
        signal OFFSET_SHIFT2    : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
124
        signal ALU_REG_IN       : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
125
        signal ALU_RES_AUX      : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
126
        signal ALU_FLAGS_AUX    : ALU_FLAGS;
127
 
128
begin
129
        OFFSET_SHIFT2 <= OFFSET(29 downto 0) & "00";
130
 
131
        --Port maps
132
        ALU_CTRL:
133
                ALU_CONTROL port map(
134
                        CLK             => CLK,
135
                        FUNCT           => OFFSET(5 downto 0),
136
                        ALU_OP_IN       => EX_CR.ALUOp,
137
                        ALU_IN          => ALU_IN_AUX
138
                );
139
 
140
        ADDER_MIPS:
141
                ADDER generic map (N => INST_SIZE)
142
                port map(
143
                        X        => NEW_PC_ADDR_IN,
144
                        Y        => OFFSET_SHIFT2,
145
                        CIN      => '0',
146
                        COUT     => CARRY_AUX,
147
                        R        => PC_ADDR_AUX
148
                );
149
 
150
        MUX_RT_RD:
151
                process(EX_CR.RegDst,RT_ADDR,RD_ADDR) is
152
                begin
153
                        if( EX_CR.RegDst = '0') then
154
                                RT_RD_ADDR_AUX <= RT_ADDR;
155
                        else
156
                                RT_RD_ADDR_AUX <= RD_ADDR;
157
                        end if;
158
                end process MUX_RT_RD;
159
 
160
        MUX_ALU:
161
                process(EX_CR.AluSrc,ALU_REG_IN,RT,OFFSET)
162
                begin
163
                        if( EX_CR.AluSrc = '0') then
164
                                ALU_REG_IN <= RT;
165
                        else
166
                                ALU_REG_IN <= OFFSET;
167
                        end if;
168
                end process MUX_ALU;
169
 
170
        ALU_MIPS:
171
                ALU generic map (N => INST_SIZE)
172
                port map(
173
                        X       => RS,
174
                        Y       => ALU_REG_IN,
175
                        ALU_IN  => ALU_IN_AUX,
176
                        R       => ALU_RES_AUX,
177
                        FLAGS   => ALU_FLAGS_AUX
178
                );
179
 
180
        EX_MEM_REGS:
181
                 EX_MEM_REGISTERS port map(
182
                        --Entradas
183
                        CLK             => CLK,
184
                        RESET           => RESET,
185
                        WB_CR_IN        => WB_CR,
186
                        MEM_CR_IN       => MEM_CR,
187
                        NEW_PC_ADDR_IN  => PC_ADDR_AUX,
188
                        ALU_FLAGS_IN    => ALU_FLAGS_AUX,
189
                        ALU_RES_IN      => ALU_RES_AUX,
190
                        RT_IN           => RT,
191
                        RT_RD_ADDR_IN   => RT_RD_ADDR_AUX,
192
                        --Salidas
193
                        WB_CR_OUT       => WB_CR_OUT,
194
                        MEM_CR_OUT      => MEM_CR_OUT,
195
                        NEW_PC_ADDR_OUT => NEW_PC_ADDR_OUT,
196
                        ALU_FLAGS_OUT   => ALU_FLAGS_OUT,
197
                        ALU_RES_OUT     => ALU_RES_OUT,
198
                        RT_OUT          => RT_OUT,
199
                        RT_RD_ADDR_OUT  => RT_RD_ADDR_OUT
200
                );
201
 
202
end EXECUTION_ARC;
203
 

powered by: WebSVN 2.1.0

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