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 4

Details | Compare with Previous | View Log

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