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

Subversion Repositories astron_mm

[/] [astron_mm/] [trunk/] [tb_common_mem_pkg.vhd] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 danv
-------------------------------------------------------------------------------
2
--
3
-- Copyright (C) 2010
4
-- ASTRON (Netherlands Institute for Radio Astronomy) <http://www.astron.nl/>
5
-- JIVE (Joint Institute for VLBI in Europe) <http://www.jive.nl/>
6
-- P.O.Box 2, 7990 AA Dwingeloo, The Netherlands
7
--
8
-- This program is free software: you can redistribute it and/or modify
9
-- it under the terms of the GNU General Public License as published by
10
-- the Free Software Foundation, either version 3 of the License, or
11
-- (at your option) any later version.
12
--
13
-- This program is distributed in the hope that it will be useful,
14
-- but WITHOUT ANY WARRANTY; without even the implied warranty of
15
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16
-- GNU General Public License for more details.
17
--
18
-- You should have received a copy of the GNU General Public License
19
-- along with this program.  If not, see <http://www.gnu.org/licenses/>.
20
--
21
-------------------------------------------------------------------------------
22
 
23
LIBRARY IEEE, common_pkg_lib, common_ram_lib;
24
USE IEEE.std_logic_1164.ALL;
25
USE common_pkg_lib.common_pkg.ALL;
26
USE common_ram_lib.common_ram_pkg.ALL;
27
 
28
 
29
PACKAGE tb_common_mem_pkg IS
30
 
31
  ------------------------------------------------------------------------------
32
  -- MM bus access functions
33
  ------------------------------------------------------------------------------
34
 
35
  -- The mm_miso input needs to be declared as signal, because otherwise the
36
  -- procedure does not notice a change (also not when the mm_clk is declared
37
  -- as signal).
38
 
39
  -- Write data to the MM bus
40
  PROCEDURE proc_mem_mm_bus_wr(CONSTANT wr_addr : IN  NATURAL;  -- [31:0]
41
                               CONSTANT wr_data : IN  INTEGER;  -- [31:0]
42
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
43
                               SIGNAL   mm_miso : IN  t_mem_miso;  -- used for waitrequest
44
                               SIGNAL   mm_mosi : OUT t_mem_mosi);
45
 
46
  PROCEDURE proc_mem_mm_bus_wr(CONSTANT wr_addr : IN  NATURAL;  -- [31:0]
47
                               CONSTANT wr_data : IN  INTEGER;  -- [31:0]
48
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
49
                               SIGNAL   mm_mosi : OUT t_mem_mosi);
50
 
51
  PROCEDURE proc_mem_mm_bus_wr(CONSTANT wr_addr : IN  NATURAL;  -- [31:0]
52
                               CONSTANT wr_data : IN  STD_LOGIC_VECTOR;  -- [31:0]
53
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
54
                               SIGNAL   mm_mosi : OUT t_mem_mosi);
55
 
56
  -- Read data request to the MM bus
57
  PROCEDURE proc_mem_mm_bus_rd(CONSTANT rd_addr : IN  NATURAL;  -- [31:0]
58
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
59
                               SIGNAL   mm_miso : IN  t_mem_miso;  -- used for waitrequest
60
                               SIGNAL   mm_mosi : OUT t_mem_mosi);
61
 
62
  PROCEDURE proc_mem_mm_bus_rd(CONSTANT rd_addr : IN  NATURAL;  -- [31:0]
63
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
64
                               SIGNAL   mm_mosi : OUT t_mem_mosi);
65
 
66
  -- Wait for read data valid after read latency mm_clk cycles
67
  PROCEDURE proc_mem_mm_bus_rd_latency(CONSTANT c_rd_latency : IN NATURAL;
68
                                       SIGNAL   mm_clk       : IN STD_LOGIC);
69
 
70
  -- Write array of data words to the memory
71
  PROCEDURE proc_mem_write_ram(CONSTANT offset   : IN  NATURAL;
72
                               CONSTANT nof_data : IN  NATURAL;
73
                               CONSTANT data_arr : IN  t_slv_32_arr;
74
                               SIGNAL   mm_clk   : IN  STD_LOGIC;
75
                               SIGNAL   mm_mosi  : OUT t_mem_mosi);
76
 
77
  PROCEDURE proc_mem_write_ram(CONSTANT data_arr : IN  t_slv_32_arr;
78
                               SIGNAL   mm_clk   : IN  STD_LOGIC;
79
                               SIGNAL   mm_mosi  : OUT t_mem_mosi);
80
 
81
  -- Read array of data words from the memory
82
  PROCEDURE proc_mem_read_ram(CONSTANT offset   : IN  NATURAL;
83
                              CONSTANT nof_data : IN  NATURAL;
84
                              SIGNAL   mm_clk   : IN  STD_LOGIC;
85
                              SIGNAL   mm_mosi  : OUT t_mem_mosi;
86
                              SIGNAL   mm_miso  : IN  t_mem_miso;
87
                              SIGNAL   data_arr : OUT t_slv_32_arr);
88
 
89
  PROCEDURE proc_mem_read_ram(SIGNAL   mm_clk   : IN  STD_LOGIC;
90
                              SIGNAL   mm_mosi  : OUT t_mem_mosi;
91
                              SIGNAL   mm_miso  : IN  t_mem_miso;
92
                              SIGNAL   data_arr : OUT t_slv_32_arr);
93
 
94
END tb_common_mem_pkg;
95
 
96
 
97
PACKAGE BODY tb_common_mem_pkg IS
98
 
99
  ------------------------------------------------------------------------------
100
  -- Private functions
101
  ------------------------------------------------------------------------------
102
 
103
  -- Issues a rd or a wr MM access
104
  PROCEDURE proc_mm_access(SIGNAL mm_clk    : IN  STD_LOGIC;
105
                           SIGNAL mm_access : OUT STD_LOGIC) IS
106
  BEGIN
107
    mm_access <= '1';
108
    WAIT UNTIL rising_edge(mm_clk);
109
    mm_access <= '0';
110
  END proc_mm_access;
111
 
112
  -- Issues a rd or a wr MM access and wait for it to have finished
113
  PROCEDURE proc_mm_access(SIGNAL mm_clk     : IN  STD_LOGIC;
114
                           SIGNAL mm_waitreq : IN  STD_LOGIC;
115
                           SIGNAL mm_access  : OUT STD_LOGIC) IS
116
  BEGIN
117
    mm_access <= '1';
118
    WAIT UNTIL rising_edge(mm_clk);
119
    WHILE mm_waitreq='1' LOOP
120
      WAIT UNTIL rising_edge(mm_clk);
121
    END LOOP;
122
    mm_access <= '0';
123
  END proc_mm_access;
124
 
125
  ------------------------------------------------------------------------------
126
  -- Public functions
127
  ------------------------------------------------------------------------------
128
 
129
  -- Write data to the MM bus
130
  PROCEDURE proc_mem_mm_bus_wr(CONSTANT wr_addr : IN  NATURAL;
131
                               CONSTANT wr_data : IN  INTEGER;
132
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
133
                               SIGNAL   mm_miso : IN  t_mem_miso;
134
                               SIGNAL   mm_mosi : OUT t_mem_mosi) IS
135
  BEGIN
136
    mm_mosi.address <= TO_MEM_ADDRESS(wr_addr);
137
    mm_mosi.wrdata  <= TO_MEM_DATA(wr_data);
138
    proc_mm_access(mm_clk, mm_miso.waitrequest, mm_mosi.wr);
139
  END proc_mem_mm_bus_wr;
140
 
141
  PROCEDURE proc_mem_mm_bus_wr(CONSTANT wr_addr : IN  NATURAL;
142
                               CONSTANT wr_data : IN  INTEGER;
143
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
144
                               SIGNAL   mm_mosi : OUT t_mem_mosi) IS
145
  BEGIN
146
    mm_mosi.address <= TO_MEM_ADDRESS(wr_addr);
147
    mm_mosi.wrdata  <= TO_MEM_DATA(wr_data);
148
    proc_mm_access(mm_clk, mm_mosi.wr);
149
  END proc_mem_mm_bus_wr;
150
 
151
  PROCEDURE proc_mem_mm_bus_wr(CONSTANT wr_addr : IN  NATURAL;
152
                               CONSTANT wr_data : IN  STD_LOGIC_VECTOR;
153
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
154
                               SIGNAL   mm_mosi : OUT t_mem_mosi) IS
155
  BEGIN
156
    mm_mosi.address <= TO_MEM_ADDRESS(wr_addr);
157
    mm_mosi.wrdata  <= RESIZE_UVEC(wr_data, c_mem_data_w);
158
    proc_mm_access(mm_clk, mm_mosi.wr);
159
  END proc_mem_mm_bus_wr;
160
 
161
 
162
  -- Read data request to the MM bus
163
  -- Use proc_mem_mm_bus_rd_latency() to wait for the MM MISO rd_data signal
164
  -- to show the data after some read latency
165
  PROCEDURE proc_mem_mm_bus_rd(CONSTANT rd_addr : IN  NATURAL;
166
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
167
                               SIGNAL   mm_miso : IN  t_mem_miso;
168
                               SIGNAL   mm_mosi : OUT t_mem_mosi) IS
169
  BEGIN
170
    mm_mosi.address <= TO_MEM_ADDRESS(rd_addr);
171
    proc_mm_access(mm_clk, mm_miso.waitrequest, mm_mosi.rd);
172
  END proc_mem_mm_bus_rd;
173
 
174
  PROCEDURE proc_mem_mm_bus_rd(CONSTANT rd_addr : IN  NATURAL;
175
                               SIGNAL   mm_clk  : IN  STD_LOGIC;
176
                               SIGNAL   mm_mosi : OUT t_mem_mosi) IS
177
  BEGIN
178
    mm_mosi.address <= TO_MEM_ADDRESS(rd_addr);
179
    proc_mm_access(mm_clk, mm_mosi.rd);
180
  END proc_mem_mm_bus_rd;
181
 
182
  -- Wait for read data valid after read latency mm_clk cycles
183
  -- Directly assign mm_miso.rddata to capture the read data
184
  PROCEDURE proc_mem_mm_bus_rd_latency(CONSTANT c_rd_latency : IN NATURAL;
185
                                       SIGNAL   mm_clk       : IN STD_LOGIC) IS
186
  BEGIN
187
    FOR I IN 0 TO c_rd_latency-1 LOOP WAIT UNTIL rising_edge(mm_clk); END LOOP;
188
  END proc_mem_mm_bus_rd_latency;
189
 
190
 
191
  -- Write array of data words to the memory  
192
  PROCEDURE proc_mem_write_ram(CONSTANT offset   : IN  NATURAL;
193
                               CONSTANT nof_data : IN  NATURAL;
194
                               CONSTANT data_arr : IN  t_slv_32_arr;
195
                               SIGNAL   mm_clk   : IN  STD_LOGIC;
196
                               SIGNAL   mm_mosi  : OUT t_mem_mosi) IS
197
    CONSTANT c_data_arr : t_slv_32_arr(data_arr'LENGTH-1 DOWNTO 0) := data_arr;  -- map to fixed range [h:0]
198
  BEGIN
199
    FOR I IN 0 TO nof_data-1 LOOP
200
      proc_mem_mm_bus_wr(offset + I, c_data_arr(I), mm_clk, mm_mosi);
201
    END LOOP;
202
  END proc_mem_write_ram;
203
 
204
  PROCEDURE proc_mem_write_ram(CONSTANT data_arr : IN  t_slv_32_arr;
205
                               SIGNAL   mm_clk   : IN  STD_LOGIC;
206
                               SIGNAL   mm_mosi  : OUT t_mem_mosi) IS
207
    CONSTANT c_offset   : NATURAL := 0;
208
    CONSTANT c_nof_data : NATURAL := data_arr'LENGTH;
209
  BEGIN
210
    proc_mem_write_ram(c_offset, c_nof_data, data_arr, mm_clk, mm_mosi);
211
  END proc_mem_write_ram;
212
 
213
  -- Read array of data words from the memory
214
  PROCEDURE proc_mem_read_ram(CONSTANT offset   : IN  NATURAL;
215
                              CONSTANT nof_data : IN  NATURAL;
216
                              SIGNAL   mm_clk   : IN  STD_LOGIC;
217
                              SIGNAL   mm_mosi  : OUT t_mem_mosi;
218
                              SIGNAL   mm_miso  : IN  t_mem_miso;
219
                              SIGNAL   data_arr : OUT t_slv_32_arr) IS
220
  BEGIN
221
    FOR I IN 0 TO nof_data-1 LOOP
222
      proc_mem_mm_bus_rd(offset+I, mm_clk, mm_mosi);
223
      proc_mem_mm_bus_rd_latency(1, mm_clk);   -- assume read latency is 1
224
      data_arr(I) <= mm_miso.rddata(31 DOWNTO 0);
225
    END LOOP;
226
    -- wait one mm_clk cycle more to have last rddata captured in signal data_arr (otherwise this proc would need to use variable data_arr)
227
    WAIT UNTIL rising_edge(mm_clk);
228
  END proc_mem_read_ram;
229
 
230
  PROCEDURE proc_mem_read_ram(SIGNAL   mm_clk   : IN  STD_LOGIC;
231
                              SIGNAL   mm_mosi  : OUT t_mem_mosi;
232
                              SIGNAL   mm_miso  : IN  t_mem_miso;
233
                              SIGNAL   data_arr : OUT t_slv_32_arr) IS
234
    CONSTANT c_offset   : NATURAL := 0;
235
    CONSTANT c_nof_data : NATURAL := data_arr'LENGTH;
236
  BEGIN
237
    proc_mem_read_ram(c_offset, c_nof_data, mm_clk, mm_mosi, mm_miso, data_arr);
238
  END proc_mem_read_ram;
239
 
240
END tb_common_mem_pkg;

powered by: WebSVN 2.1.0

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