OpenCores
URL https://opencores.org/ocsvn/minimips_superscalar/minimips_superscalar/trunk

Subversion Repositories minimips_superscalar

[/] [minimips_superscalar/] [tags/] [P1/] [sources/] [banc.vhd] - Blame information for rev 29

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 29 mcafruni
--------------------------------------------------------------------------
2
--                                                                      --
3
--                                                                      --
4
-- miniMIPS Superscalar Processor : Register bank                       --
5
-- based on miniMIPS Processor                                          --
6
--                                                                      --
7
--                                                                      --
8
-- Author : Miguel Cafruni                                              --
9
-- miguel_cafruni@hotmail.com                                           --
10
--                                                      March 2020      --
11
--------------------------------------------------------------------------
12
 
13
library ieee;
14
use ieee.std_logic_1164.all;
15
use ieee.numeric_std.all;
16
 
17
library work;
18
use work.pack_mips.all;
19
 
20
entity banc is
21
port (
22
       clock : in bus1;
23
       clock2 : in bus1;
24
       reset : in bus1;
25
 
26
       -- Register addresses to read
27
       reg_src1 : in bus5;
28
       reg_src2 : in bus5;
29
 
30
       -- Register address to write and its data
31
       reg_dest : in bus5;
32
       donnee   : in bus32;
33
 
34
       -- Write signal
35
       cmd_ecr  : in bus1;
36
 
37
       -- Bank outputs
38
       data_src1 : out bus32;
39
       data_src2 : out bus32;
40
 
41
       -- Register addresses to read
42
       reg_src3 : in bus5;
43
       reg_src4 : in bus5;
44
 
45
       -- Register address to write and its data
46
       reg_dest2 : in bus5;
47
       donnee2   : in bus32;
48
 
49
       -- Write signal
50
       cmd_ecr2  : in bus1;
51
 
52
       -- Bank outputs
53
       data_src3 : out bus32;
54
       data_src4 : out bus32
55
     );
56
end banc;
57
 
58
architecture rtl of banc is
59
 
60
    -- The register bank
61
    type tab_reg is array (1 to 31) of std_logic_vector(31 downto 0);
62
    signal registres : tab_reg;
63
    signal adr_src1 : integer range 0 to 31;
64
    signal adr_src2 : integer range 0 to 31;
65
    signal adr_dest : integer range 0 to 31;
66
    signal adr_src3 : integer range 0 to 31;
67
    signal adr_src4 : integer range 0 to 31;
68
    signal adr_dest2 : integer range 0 to 31;
69
 
70
    signal clk, cmd1, cmd2 : bus1;
71
begin
72
                                --    _                     _                _     _
73
    clk <= clock or clock2;     -- __| |________  or ______| |________ = ___| |___| |___
74
 
75
                                --      __________                  _                _
76
    cmd1 <= cmd_ecr and clock;  --  ___|          |_________  X  __| |________  = __| |________
77
                                --                 __________              _                   _
78
    cmd2 <= cmd_ecr2 and clock2;--  ______________|          |__  X  _____| |________  = _____| |________   
79
 
80
    adr_src1 <= to_integer(unsigned(reg_src1));
81
    adr_src2 <= to_integer(unsigned(reg_src2));
82
    adr_dest <= to_integer(unsigned(reg_dest));
83
    adr_src3 <= to_integer(unsigned(reg_src3));
84
    adr_src4 <= to_integer(unsigned(reg_src4));
85
    adr_dest2 <= to_integer(unsigned(reg_dest2));
86
 
87
    data_src1 <= (others => '0') when adr_src1=0 else
88
                 registres(adr_src1);
89
    data_src2 <= (others => '0') when adr_src2=0 else
90
                 registres(adr_src2);
91
    data_src3 <= (others => '0') when adr_src3=0 else
92
                 registres(adr_src3);
93
    data_src4 <= (others => '0') when adr_src4=0 else
94
                 registres(adr_src4);
95
 
96
    process(clk, cmd1, cmd2)
97
    begin
98
        if rising_edge(clk) then
99
            if reset='1' then
100
                for i in 1 to 31 loop
101
                    registres(i) <= (others => '0');
102
                end loop;
103
            elsif cmd1 = '1' and adr_dest /= 0 then
104
                -- The data is saved
105
                registres(adr_dest) <= donnee;
106
            else
107
                if cmd2 = '1' and adr_dest2 /= 0 then
108
                   -- The data is saved
109
                   registres(adr_dest2) <= donnee2;
110
                end if;
111
            end if;
112
        end if;
113
    end process;
114
 
115
end rtl;

powered by: WebSVN 2.1.0

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