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/] [registers.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 elujan
--
2
-- Banco de registros 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.segm_mips_const_pkg.all;
29
 
30
 
31
entity REGISTERS is
32
    port(
33
                --Entradas
34
                CLK             : in    STD_LOGIC;                              --Reloj
35
                RESET           : in    STD_LOGIC;                              --Reset asincrónico
36
                RW              : in    STD_LOGIC;                              --Señal de habilitación de escritura (RegWrite)       
37
                RS_ADDR         : in    STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro Rs
38
                RT_ADDR         : in    STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro Rt
39
                RD_ADDR         : in    STD_LOGIC_VECTOR (ADDR_SIZE-1 downto 0);--Dirección del registro Rd
40
                WRITE_DATA      : in    STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos a ser escritos
41
                --Salidas
42
                RS              : out   STD_LOGIC_VECTOR (INST_SIZE-1 downto 0);--Datos leidos de la dir. Rs
43
                RT              : out   STD_LOGIC_VECTOR (INST_SIZE-1 downto 0)  --Datos leidos de la dir. Rt
44
        );
45
end REGISTERS;
46
 
47
architecture REGISTERS_ARC of REGISTERS is
48
 
49
  -- Tipo para almacenar los registros
50
  type REGS_T is array (NUM_REG-1 downto 0) of STD_LOGIC_VECTOR(INST_SIZE-1 downto 0);
51
 
52
  -- Esta es la señal que contiene los registros. El acceso es de la
53
  -- siguiente manera: regs(i) acceso al registro i, donde i es
54
  -- un entero. Para convertir del tipo STD_LOGIC_VECTOR a entero se
55
  -- hace de la siguiente manera: to_integer(unsigned(slv)), donde
56
  -- slv es un elemento de tipo STD_LOGIC_VECTOR
57
  signal REGISTROS      : REGS_T;
58
 
59
begin
60
 
61
  REG_ASIG:
62
          process(CLK,RESET,RW,WRITE_DATA,RD_ADDR)
63
          begin
64
                if  RESET='1' then
65
                                for i in 0 to NUM_REG-1 loop
66
                                        REGISTROS(i) <= (others => '0');
67
                                end loop;
68
                                --Los resgitros son completados de esta manera para 
69
                                --la prueba del algoritmo "Restoring", ya que no se
70
                                --ha implementado la instrucción LLI
71
                                REGISTROS(0) <= "00000000000000000000000000000000";
72
                                REGISTROS(1) <= "00000000000000000000000000000001";
73
                                REGISTROS(2) <= "00000000000000000000000000000010";
74
                                REGISTROS(3) <= "00000000000000000000000000000011";
75
                                REGISTROS(4) <= "00000000000000000000000000000100";
76
                                --REGISTROS(5) <= "00000000000000000000000000000101";
77
                                REGISTROS(5) <= "00000000000000000000000000000001";
78
                                --REGISTROS(6) <= "00000000000000000000000000000110";
79
                                REGISTROS(6) <= "00000000000000000000000000000000";
80
                                --REGISTROS(7) <= "00000000000000000000000000000111";
81
                                REGISTROS(7) <= "00000000000000000000000000100000";
82
                                --REGISTROS(8) <= "00000000000000000000000000001000";
83
                                REGISTROS(8) <= "00000000000000000000000000000000";
84
                                REGISTROS(9) <= "00000000000000000000000000001001";
85
                                --REGISTROS(10) <= "00000000000000000000000000001010";
86
                                REGISTROS(10) <= "00000000000000000000000000010011";
87
                                --REGISTROS(11) <= "00000000000000000000000000001011";
88
                                REGISTROS(11) <= "00000000000000000000000000011010";
89
                                --REGISTROS(12) <= "00000000000000000000000000001100";
90
                                REGISTROS(12) <= "00000000000000000000000000000000";
91
                                REGISTROS(13) <= "00000000000000000000000000001101";
92
                                REGISTROS(14) <= "00000000000000000000000000001110";
93
                                REGISTROS(15) <= "00000000000000000000000000001111";
94
                                REGISTROS(16) <= "00000000000000000000000000010000";
95
                                REGISTROS(17) <= "00000000000000000000000000010001";
96
                                REGISTROS(18) <= "00000000000000000000000000010010";
97
                                REGISTROS(19) <= "00000000000000000000000000010011";
98
                                REGISTROS(20) <= "00000000000000000000000000010100";
99
                                REGISTROS(21) <= "00000000000000000000000000010101";
100
                                REGISTROS(22) <= "00000000000000000000000000010110";
101
                                REGISTROS(23) <= "00000000000000000000000000010111";
102
                                REGISTROS(24) <= "00000000000000000000000000011000";
103
                                REGISTROS(25) <= "00000000000000000000000000011001";
104
                                REGISTROS(26) <= "00000000000000000000000000011010";
105
                                REGISTROS(27) <= "00000000000000000000000000011011";
106
                                REGISTROS(28) <= "00000000000000000000000000011100";
107
                                REGISTROS(29) <= "00000000000000000000000000011101";
108
                                REGISTROS(30) <= "00000000000000000000000000011110";
109
                                REGISTROS(31) <= "00000000000000000000000000011111";
110
                elsif rising_edge(CLK) then
111
                        if  RW='1' then
112
                                REGISTROS(to_integer(unsigned(RD_ADDR)))<=WRITE_DATA;
113
                        end if;
114
                end if;
115
          end process  REG_ASIG;
116
 
117
  RS <= (others=>'0') when RS_ADDR="00000"
118
         else REGISTROS(to_integer(unsigned(RS_ADDR)));
119
  RT <= (others=>'0') when RT_ADDR="00000"
120
         else REGISTROS(to_integer(unsigned(RT_ADDR)));
121
 
122
end REGISTERS_ARC;

powered by: WebSVN 2.1.0

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