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

Subversion Repositories vhdl-pipeline-mips

[/] [vhdl-pipeline-mips/] [trunk/] [2_instruction_decoding/] [instruction_decoding.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 elujan
--
2
-- Etapa Instruction Decoding (ID) 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
 
24
library ieee;
25
use ieee.std_logic_1164.all;
26
use ieee.numeric_std.all;
27
 
28
library work;
29
use work.records_pkg.all;
30
use work.segm_mips_const_pkg.all;
31
 
32
entity INSTRUCTION_DECODING is
33
        port(
34
                        CLK                     :       in      STD_LOGIC;                              --Reloj
35
                        RESET                   :       in      STD_LOGIC;                              --Reset asincrónico
36
                        --Entradas de la etapa de Búsqueda de la Instrucción (IF)
37
                        INSTRUCTION             :       in      STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Instrucción
38
                        NEW_PC_ADDR_IN          :       in      STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Nueva dirección del PC
39
                        --Entradas de la etapa de Post Escritura (WB)     
40
                        RegWrite                :       in      STD_LOGIC;                              --Señal de habilitación de escritura (RegWrite)                
41
                        WRITE_DATA              :       in      STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos a ser escritos
42
                        WRITE_REG               :       in      STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro Rd
43
                        --Salidas de la etapa de Búsqueda de la Instrucción (IF)
44
                        NEW_PC_ADDR_OUT         :       out     STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Nueva dirección del PC
45
                        --Salidas generadas a partir de la instrucción
46
                        OFFSET                  :       out     STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Offset de la instrucción  [15-0]
47
                        RT_ADDR                 :       out     STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro RT [20-16]
48
                        RD_ADDR                 :       out     STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro RD [15-11]
49
                        --Salidas del Banco de Registros
50
                        RS                      :       out     STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos leidos de la dir. Rs
51
                        RT                      :       out     STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos leidos de la dir. Rt
52
                        --Salidas de la Unidad de Control
53
                        WB_CR                   :       out     WB_CTRL_REG;                            --Estas señales se postergarán hasta la etapa WB
54
                        MEM_CR                  :       out     MEM_CTRL_REG;                           --Estas señales se postergarán hasta la etapa MEM
55
                        EX_CR                   :       out     EX_CTRL_REG                             --Estas señales se postergarán hasta la etapa EX     
56
        );
57
end INSTRUCTION_DECODING;
58
 
59
architecture INSTRUCTION_DECODING_ARC of INSTRUCTION_DECODING is
60
 
61
--Declaración de componentes
62
 
63
        component REGISTERS is
64
        port(
65
                CLK             :       in      STD_LOGIC;                              --Reloj
66
                RESET           :       in      STD_LOGIC;                              --Reset asincrónico
67
                RW              :       in      STD_LOGIC;                              --Señal de habilitación de escritura (RegWrite)       
68
                RS_ADDR         :       in      STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro Rs
69
                RT_ADDR         :       in      STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro Rt
70
                RD_ADDR         :       in      STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro Rd
71
                WRITE_DATA      :       in      STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos a ser escritos
72
                RS              :       out     STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos leidos de la dir. Rs
73
                RT              :       out     STD_LOGIC_VECTOR (INST_SIZE-1 downto 0)  --Datos leidos de la dir. Rt    
74
        );
75
        end component REGISTERS;
76
 
77
 
78
        component CONTROL_UNIT is
79
        port(
80
                OP                      :       in      STD_LOGIC_VECTOR (5 downto 0);           --Código de operación
81
                RegWrite                :       out     STD_LOGIC;                              --Señal de habilitación de escritura (RegWrite)
82
                MemtoReg                :       out     STD_LOGIC;                              --Señal de habilitación  (MemToReg)
83
                Brach                   :       out     STD_LOGIC;                              --Señal de habilitación  (Branch)
84
                MemRead                 :       out     STD_LOGIC;                              --Señal de habilitación  (MemRead)
85
                MemWrite                :       out     STD_LOGIC;                              --Señal de habilitación  (MemWrite)
86
                RegDst                  :       out     STD_LOGIC;                              --Señal de habilitación  (RegDst)
87
                ALUSrc                  :       out     STD_LOGIC;                              --Señal de habilitación  (ALUSrc)
88
                ALUOp0                  :       out     STD_LOGIC;                              --Señal de habilitación  (ALUOp)
89
                ALUOp1                  :       out     STD_LOGIC;                              --Señal de habilitación  (ALUOp)
90
                ALUOp2                  :       out     STD_LOGIC                               --Señal de habilitación  (ALUOp2)
91
        );
92
        end component CONTROL_UNIT;
93
 
94
 
95
        component ID_EX_REGISTERS is
96
        port(
97
                --Entradas
98
 
99
                CLK                             : in    STD_LOGIC;                              -- Reloj
100
                RESET                           : in    STD_LOGIC;                              -- Reset asincrónico
101
                --Salidas de la etapa de Búsqueda de la Instrucción (IF)
102
                NEW_PC_ADDR_IN                  : in    STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);-- Nueva dirección del PC
103
                --Salidas generadas a partir de la instrucción
104
                OFFSET_IN                       : in    STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);-- Offset de la instrucción  [15-0]
105
                RT_ADDR_IN                      : in    STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);-- Dirección del registro RT [20-16]
106
                RD_ADDR_IN                      : in    STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);-- Dirección del registro RD [15-11]
107
                --Salidas del Banco de Registros
108
                RS_IN                           : in    STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);-- Datos leidos de la dir. Rs
109
                RT_IN                           : in    STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);-- Datos leidos de la dir. Rt
110
                --Salidas de la Unidad de Control
111
                WB_IN                           : in    WB_CTRL_REG;                            -- Señales de control para la etapa WB
112
                M_IN                            : in    MEM_CTRL_REG;                           -- Señales de control para la etapa MEM
113
                EX_IN                           : in    EX_CTRL_REG;                            -- Señales de control para la etapa EX
114
 
115
                --Salidas
116
 
117
                --Salidas de la etapa de Búsqueda de la Instrucción (IF)
118
                NEW_PC_ADDR_OUT                 : out   STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);-- Nueva dirección del PC
119
                --Salidas generadas a partir de la instrucción
120
                OFFSET_OUT                      : out   STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);-- Offset de la instrucción  [15-0]
121
                RT_ADDR_OUT                     : out   STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);-- Dirección del registro RT [20-16]
122
                RD_ADDR_OUT                     : out   STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);-- Dirección del registro RD [15-11]
123
                --Salidas del Banco de Registros
124
                RS_OUT                          : out   STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);-- Datos leidos de la dir. Rs
125
                RT_OUT                          : out   STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);-- Datos leidos de la dir. Rt
126
                --Salidas de la Unidad de Control
127
                WB_OUT                          : out   WB_CTRL_REG;                            -- Estas señales se postergarán hasta la etapa WB
128
                M_OUT                           : out   MEM_CTRL_REG;                           -- Estas señales se postergarán hasta la etapa MEM
129
                EX_OUT                          : out   EX_CTRL_REG                             -- Estas señales se postergarán hasta la etapa EX
130
        );
131
        end component ID_EX_REGISTERS;
132
 
133
--Declaración de señales
134
 
135
        -- Buses de datos auxiliares para comunicar las distintas salidas
136
        -- que los componentes generan y dárselas a los registros de 
137
        -- sincronización de etapas.
138
        signal OFFSET_AUX       : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
139
        signal RS_AUX           : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
140
        signal RT_AUX           : STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);
141
        signal WB_AUX           : WB_CTRL_REG;
142
        signal MEM_AUX          : MEM_CTRL_REG;
143
        signal EX_AUX           : EX_CTRL_REG;
144
 
145
--Alias
146
        -- Se encuentran comentados debido a que GHDL no soporta su uso.
147
 
148
        --alias OP_A            : STD_LOGIC_VECTOR (5 downto 0) is INSTRUCTION(INST_SIZE-1 downto 26);
149
        --alias RS_ADDR_A       : STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0) is INSTRUCTION(25 downto 21);
150
        --alias RT_ADDR_A       : STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0) is INSTRUCTION(20 downto 16);
151
        --alias RD_ADDR_A       : STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0) is INSTRUCTION(15 downto 11);
152
        --alias OFFSET_A        : STD_LOGIC_VECTOR (15 downto 0) is INSTRUCTION(15 downto 0);
153
 
154
begin
155
 
156
        --Port maps
157
        REGS:
158
                REGISTERS port map(
159
                        CLK             => CLK,
160
                        RESET           => RESET,
161
                        RW              => RegWrite,
162
                        RS_ADDR         => INSTRUCTION(25 downto 21),--RS_ADDR_A,
163
                        RT_ADDR         => INSTRUCTION(20 downto 16),--RT_ADDR_A,
164
                        RD_ADDR         => WRITE_REG,
165
                        WRITE_DATA      => WRITE_DATA,
166
                        RS              => RS_AUX,
167
                        RT              => RT_AUX
168
                );
169
 
170
        CTRL :
171
                CONTROL_UNIT port map(
172
                        --Entrada       
173
                        OP              => INSTRUCTION(INST_SIZE-1 downto 26),--OP_A,
174
                        --Salidas
175
                        RegWrite        => WB_AUX.RegWrite,
176
                        MemtoReg        => WB_AUX.MemtoReg,
177
                        Brach           => MEM_AUX.Branch,
178
                        MemRead         => MEM_AUX.MemRead,
179
                        MemWrite        => MEM_AUX.MemWrite,
180
                        RegDst          => EX_AUX.RegDst,
181
                        ALUSrc          => EX_AUX.ALUSrc,
182
                        ALUOp0          => EX_AUX.ALUOp.Op0,
183
                        ALUOp1          => EX_AUX.ALUOp.Op1,
184
                        ALUOp2          => EX_AUX.ALUOp.Op2
185
                );
186
 
187
        --Se hace una extensión de signo
188
        --OFFSET_AUX    <= ZERO16b & OFFSET_A
189
        --                      when OFFSET_A(15) = '0'
190
        --                              else ONE16b & OFFSET_A;
191
 
192
 
193
        OFFSET_AUX      <=  ZERO16b & INSTRUCTION(15 downto 0)
194
                                when INSTRUCTION(15) = '0'
195
                                        else  ONE16b & INSTRUCTION(15 downto 0);
196
 
197
 
198
        ID_EX_REGS:
199
                ID_EX_REGISTERS port map(
200
                        --Entradas
201
                        CLK                     => CLK,
202
                        RESET                   => RESET,
203
                        NEW_PC_ADDR_IN          => NEW_PC_ADDR_IN,
204
                        OFFSET_IN               => OFFSET_AUX,
205
                        RT_ADDR_IN              => INSTRUCTION(20 downto 16),--RT_ADDR_A,
206
                        RD_ADDR_IN              => INSTRUCTION(15 downto 11),--RD_ADDR_A,
207
                        RS_IN                   => RS_AUX,
208
                        RT_IN                   => RT_AUX,
209
                        WB_IN                   => WB_AUX,
210
                        M_IN                    => MEM_AUX,
211
                        EX_IN                   => EX_AUX,
212
                        --Salidas
213
                        NEW_PC_ADDR_OUT => NEW_PC_ADDR_OUT,
214
                        OFFSET_OUT      => OFFSET,
215
                        RT_ADDR_OUT     => RT_ADDR,
216
                        RD_ADDR_OUT     => RD_ADDR,
217
                        RS_OUT          => RS,
218
                        RT_OUT          => RT,
219
                        WB_OUT          => WB_CR,
220
                        M_OUT           => MEM_CR,
221
                        EX_OUT          => EX_CR
222
                );
223
 
224
end INSTRUCTION_DECODING_ARC;

powered by: WebSVN 2.1.0

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