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

Subversion Repositories plasma_fpu

[/] [plasma_fpu/] [trunk/] [src/] [plasma_mem_ctrl.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 __alexs__
-- --------------------------------------------------------------------------
2
-- >>>>>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<<<<
3
-- --------------------------------------------------------------------------
4
-- TITLE:       Plasma MEMORY CONTROL
5
-- AUTHOR:      Alex Schoenberger (Alex.Schoenberger@ies.tu-darmstadt.de)
6
-- COMMENT:     This project is based on Plasma CPU core by Steve Rhoads
7
--
8
-- www.ies.tu-darmstadt.de
9
-- TU Darmstadt
10
-- Institute for Integrated Systems
11
-- Merckstr. 25
12
-- 
13
-- 64283 Darmstadt - GERMANY
14
-- --------------------------------------------------------------------------
15
-- PROJECT:       Plasma CPU core with FPU
16
-- FILENAME:      plasma.vhd
17
-- --------------------------------------------------------------------------
18
-- COPYRIGHT: 
19
--  This project is distributed by GPLv2.0
20
--  Software placed into the public domain by the author.
21
--  Software 'as is' without warranty.  Author liable for nothing.
22
-- --------------------------------------------------------------------------
23
-- DESCRIPTION:
24
--    preparate data for memory access
25
--
26
--    SYNTHESIZABLE
27
--
28
----------------------------------------------------------------------------
29
-- Revision History
30
-- --------------------------------------------------------------------------
31
-- Revision   Date    Author     CHANGES
32
-- 1.0      4/2014    AS         initial
33
-- 2.0      5/2015    AS         works with MIPS commands directly
34
-- --------------------------------------------------------------------------
35
library IEEE;
36
  use IEEE.std_logic_1164.ALL;
37
 
38
library PLASMA;
39
  use PLASMA.mips_instruction_set.ALL;
40
  use PLASMA.plasma_pack.ALL;
41
 
42
 
43
entity plasma_mem_ctrl is
44
  port(
45
      clk                     : in  std_logic;
46
      reset                   : in  std_logic;
47
 
48
      -- INPUT FROM PLASMA
49
      mem_func                : in  t_mips_opcode;
50
      prog_addr_in            : in  t_plasma_word;
51
      data_addr_in            : in  t_plasma_word;
52
      data_w_in               : in  t_plasma_word;
53
 
54
      -- INPUT FROM MEMORY
55
      prog_stall_in           : in  std_logic;
56
      data_stall_In           : in  std_logic;
57
      prog_in                 : in t_plasma_word;
58
      data_r_in               : in t_plasma_word;
59
 
60
      -- OUTPUT TO PLASMA
61
      prog_stall_out          : out std_logic;
62
      data_stall_out          : out std_logic;
63
      prog_out                : out t_plasma_word;
64
      data_r_out              : out t_plasma_word;
65
 
66
      -- OUTPUT TO MEMORY
67
      prog_addr_out           : out t_plasma_word;
68
      data_addr_out           : out t_plasma_word;
69
      wr_mask_out             : out t_plasma_mask;
70
      rd_mask_out             : out t_plasma_mask;
71
      data_w_out              : out t_plasma_word
72
    );
73
end entity plasma_mem_ctrl;
74
 
75
 
76
architecture structure_plasma_mem_ctrl of plasma_mem_ctrl is
77
 
78
  -- ___  ____ ___ ____    ___ ____    _  _ ____ _  _ ____ ____ _   _ 
79
  -- |  \ |__|  |  |__|     |  |  |    |\/| |___ |\/| |  | |__/  \_/  
80
  -- |__/ |  |  |  |  |     |  |__|    |  | |___ |  | |__| |  \   |   
81
  signal i_wr_mask        : t_plasma_mask;
82
  signal i_rd_mask        : t_plasma_mask;
83
  signal i_data_w         : t_plasma_word;
84
 
85
  -- ___  ____ ___ ____    ___ ____    ___  _    ____ ____ _  _ ____ 
86
  -- |  \ |__|  |  |__|     |  |  |    |__] |    |__| [__  |\/| |__| 
87
  -- |__/ |  |  |  |  |     |  |__|    |    |___ |  | ___] |  | |  | 
88
  signal i_data_r         : t_plasma_word;
89
 
90
 
91
begin
92
  -- ----------------------------------------------------------------------------------------------
93
  --  _____  _____   ____   _____ _____            __  __ 
94
  -- |  __ \|  __ \ / __ \ / ____|  __ \     /\   |  \/  |
95
  -- | |__) | |__) | |  | | |  __| |__) |   /  \  | \  / |
96
  -- |  ___/|  _  /| |  | | | |_ |  _  /   / /\ \ | |\/| |
97
  -- | |    | | \ \| |__| | |__| | | \ \  / ____ \| |  | |
98
  -- |_|    |_|  \_\\____/ \_____|_|  \_\/_/    \_\_|  |_|
99
  -- ----------------------------------------------------------------------------------------------
100
  --
101
  -- FORWARDING ONLY, WORDS AS INPUT AND OUTPUT
102
  --
103
  -- ____ ___  ___  ____    ___ ____    ___  _    ____ ____ _  _ ____ 
104
  -- |__| |  \ |  \ |__/     |  |  |    |__] |    |__| [__  |\/| |__| 
105
  -- |  | |__/ |__/ |  \     |  |__|    |    |___ |  | ___] |  | |  | 
106
  prog_stall_out        <= prog_stall_in;                                                       -- program memory stall
107
  prog_out              <= prog_in;                                                             -- program data
108
 
109
  -- ____ ___  ___  ____    ___ ____    _  _ ____ _  _ ____ ____ _   _ 
110
  -- |__| |  \ |  \ |__/     |  |  |    |\/| |___ |\/| |  | |__/  \_/  
111
  -- |  | |__/ |__/ |  \     |  |__|    |  | |___ |  | |__| |  \   |   
112
  prog_addr_out         <= prog_addr_in;                                                        -- program address
113
 
114
  -- ----------------------------------------------------------------------------------------------
115
  --  _____       _______       
116
  -- |  __ \   /\|__   __|/\    
117
  -- | |  | | /  \  | |  /  \   
118
  -- | |  | |/ /\ \ | | / /\ \  
119
  -- | |__| / ____ \| |/ ____ \ 
120
  -- |_____/_/    \_\_/_/    \_\
121
  -- ----------------------------------------------------------------------------------------------
122
  --
123
  -- REGISTER STAGE AND MASK LOGIC
124
  --
125
 
126
mem_read_write_process:
127
  process( mem_func, data_w_in, data_r_in )
128
  begin
129
    -- DEFAULT VALUES
130
    i_rd_mask     <= (others => '0');
131
    i_wr_mask     <= (others => '0');
132
 
133
    i_data_w      <= PLASMA_ZERO_WORD;
134
    i_data_r      <= PLASMA_ZERO_WORD;
135
 
136
    -- MEMORY ACCESS FUNCTION
137
    case mem_func is
138
                            -- ____ ____ ____ ___  
139
                            -- |__/ |___ |__| |  \ 
140
                            -- |  \ |___ |  | |__/ 
141
      when MIPS_OPCODE_LW   |
142
           MIPS_OPCODE_LWC1 |
143
           MIPS_OPCODE_LWL    =>  i_rd_mask               <= PLASMA_MASK_READ32;
144
                                  i_data_r                <= data_r_in;
145
 
146
      -- when MIPS_OPCODE_LWL    =>  i_rd_mask               <= PLASMA_MASK_READ32L;    -- COMPILER BUG !!
147
      --                             i_data_w                <= data_w_in;
148
      --                             i_data_r                <= data_r_in;
149
 
150
      -- when MIPS_OPCODE_LWR    =>  i_rd_mask               <= PLASMA_MASK_READ32R;    -- COMPILER BUG !!
151
      --                             i_data_w                <= data_w_in;
152
      --                             i_data_r                <= data_r_in;
153
 
154
      when MIPS_OPCODE_LHU    =>  i_rd_mask               <= PLASMA_MASK_READ16;
155
                                  i_data_r(31 downto 16)  <= (others => '0');
156
                                  i_data_r(15 downto  0)  <= data_r_in(15 downto 0);
157
 
158
      when MIPS_OPCODE_LH     =>  i_rd_mask               <= PLASMA_MASK_READ16;
159
                                  i_data_r(31 downto 16)  <= (others => data_r_in(15));
160
                                  i_data_r(15 downto  0)  <= data_r_in(15 downto 0);
161
 
162
      when MIPS_OPCODE_LBU    =>  i_rd_mask               <= PLASMA_MASK_READ8;
163
                                  i_data_r(31 downto  8)  <= (others => '0');
164
                                  i_data_r( 7 downto  0)  <= data_r_in(7 downto 0);
165
 
166
      when MIPS_OPCODE_LB     =>  i_rd_mask               <= PLASMA_MASK_READ8;
167
                                  i_data_r(31 downto  8)  <= (others => data_r_in(7));
168
                                  i_data_r( 7 downto  0)  <= data_r_in(7 downto 0);
169
                            -- _ _ _ ____ _ ___ ____ 
170
                            -- | | | |__/ |  |  |___ 
171
                            -- |_|_| |  \ |  |  |___ 
172
      when MIPS_OPCODE_SW   |
173
           MIPS_OPCODE_SWC1 |
174
           MIPS_OPCODE_SWL    =>  i_wr_mask               <= PLASMA_MASK_WRITE32;
175
                                  i_data_w                <= data_w_in;
176
 
177
      -- when MIPS_OPCODE_SWL    =>  i_wr_mask               <= PLASMA_MASK_WRITE32L;   -- COMPILER BUG !!
178
      --                             i_data_w                <= data_w_in;
179
 
180
      -- when MIPS_OPCODE_SWR    =>  i_wr_mask               <= PLASMA_MASK_WRITE32R;   -- COMPILER BUG !!
181
      --                             i_data_w                <= data_w_in;
182
 
183
      when MIPS_OPCODE_SH     =>  i_wr_mask     <= PLASMA_MASK_WRITE16;
184
                                  --i_data_w(31 downto 16)  <= (others => '0');
185
                                  i_data_w(31 downto 16)  <= data_w_in(15 downto 0);
186
                                  i_data_w(15 downto  0)  <= data_w_in(15 downto 0);
187
 
188
      when MIPS_OPCODE_SB     =>  i_wr_mask     <= PLASMA_MASK_WRITE8;
189
                                  -- i_data_w(31 downto  8)  <= (others => '0');
190
                                  i_data_w(31 downto 24)  <= data_w_in(7 downto 0);
191
                                  i_data_w(23 downto 16)  <= data_w_in(7 downto 0);
192
                                  i_data_w(15 downto  8)  <= data_w_in(7 downto 0);
193
                                  i_data_w( 7 downto  0)  <= data_w_in(7 downto 0);
194
 
195
      when  others            => -- default values
196
    end case;
197
  end process;
198
 
199
  -- ADDRESS
200
  data_addr_out         <= data_addr_in;
201
 
202
  -- STALL
203
  data_stall_out        <= data_stall_in;
204
 
205
  -- READ
206
  rd_mask_out           <= i_rd_mask;
207
  data_r_out            <= i_data_r;
208
 
209
  -- WRITE
210
  wr_mask_out           <= i_wr_mask;
211
  data_w_out            <= i_data_w;
212
 
213
end architecture structure_plasma_mem_ctrl;

powered by: WebSVN 2.1.0

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