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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [ds_dma64/] [pcie_src/] [pcie_sim/] [sim/] [cmd_sim_pkg.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
---------------------------------------------------------------------------------------------------
2
--
3
-- Title       : cmd_sim_pkg.vhd
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental System
6
--      
7
-- Version         : 1.1
8
---------------------------------------------------------------------------------------------------
9
--
10
-- Description :  Определение общих процедур моделирования
11
--
12
---------------------------------------------------------------------------------------------------
13
library IEEE;
14
use IEEE.STD_LOGIC_1164.all;
15
use ieee.std_logic_arith.all;
16
 
17
package cmd_sim_pkg is
18
 
19
type mem32 is array (natural range<>) of std_logic_vector( 31 downto 0 );
20
type mem64 is array (natural range<>) of std_logic_vector( 63 downto 0 );
21
constant mem_size:integer:=32; -- размер массива памяти
22
 
23
type bh_cmd is record
24
        cmd:    integer;
25
        adr:    mem32( mem_size-1 downto 0 );
26
        data:   mem64( mem_size-1 downto 0 );
27
        p0:             integer;
28
        p1:             integer;
29
end record;
30
 
31
-- Формат команды
32
-- cmd:
33
--              1 - read
34
--              2 - write
35
--              20 - запись числа в память
36
--              21 - чтение числа из памяти
37
--              22 - запись возрастающей последовательности чисел
38
--              30 - запись массива из файла data0.dat
39
--              31 - чтение массива и запись в файл data1.dat
40
 
41
--      p0[31..16] - длина блока данных
42
--  p0[0] - 1 - цикл 64 бита
43
--                      0 - цикл 32 бита
44
--  mem - данные для чтения или записи
45
 
46
 
47
 
48
 
49
type bh_ret is record
50
        ret:    integer;
51
        data:   mem64( mem_size-1 downto 0 );
52
end record;
53
 
54
 
55
procedure data_write(
56
        signal  cmd: out bh_cmd;        -- команда для устройства
57
        signal  ret: in bh_ret;         -- возвращаемое значение от устройства
58
        adr: in std_logic_vector( 31 downto 0 );         -- адрес регистра
59
        data: in std_logic_vector( 31 downto 0 ) -- данные для записи
60
        );
61
 
62
procedure data_read(
63
        signal cmd: out bh_cmd;         -- команда для устройства
64
        signal ret: in bh_ret;  -- возвращаемое значение от устройства
65
        adr: in std_logic_vector( 31 downto 0 );         -- адрес регистра
66
        data: out std_logic_vector( 31 downto 0 )        -- прочитанные данные
67
        );
68
 
69
procedure data_write64(
70
        signal  cmd: out bh_cmd;        -- команда для устройства
71
        signal  ret: in bh_ret;         -- возвращаемое значение от устройства
72
        adr: in std_logic_vector( 31 downto 0 );         -- адрес регистра
73
        data: in std_logic_vector( 63 downto 0 ) -- данные для записи
74
        );
75
 
76
procedure data_read64(
77
        signal cmd: out bh_cmd;         -- команда для устройства
78
        signal ret: in bh_ret;  -- возвращаемое значение от устройства
79
        adr: in std_logic_vector( 31 downto 0 );         -- адрес регистра
80
        data: out std_logic_vector( 63 downto 0 )        -- прочитанные данные
81
        );
82
 
83
 
84
procedure array_write(
85
        signal  cmd: out bh_cmd;        -- команда для устройства
86
        signal  ret: in bh_ret;         -- возвращаемое значение от устройства
87
        adr:  in mem32( mem_size-1 downto 0 );   -- адреса данных
88
        data: in mem32( mem_size-1 downto 0 );   -- данные для записи
89
        n:        in integer                                            -- размер блока памяти
90
        );
91
 
92
procedure array_read(
93
        signal cmd: out bh_cmd;         -- команда для устройства
94
        signal ret: in bh_ret;  -- возвращаемое значение от устройства
95
        adr:  in mem32( mem_size-1 downto 0 );   -- адреса данных
96
        data: out mem32( mem_size-1 downto 0 );  -- прочитанные данные
97
        n:        in integer                                                    -- размер блока памяти
98
        );
99
 
100
procedure array_write64(
101
        signal  cmd: out bh_cmd;        -- команда для устройства
102
        signal  ret: in bh_ret;         -- возвращаемое значение от устройства
103
        adr:  in mem32( mem_size-1 downto 0 );   -- адреса данных
104
        data: in mem64( mem_size-1 downto 0 );   -- данные для записи
105
        n:        in integer                                            -- размер блока памяти
106
        );
107
 
108
procedure array_read64(
109
        signal cmd: out bh_cmd;         -- команда для устройства
110
        signal ret: in bh_ret;  -- возвращаемое значение от устройства
111
        adr:  in mem32( mem_size-1 downto 0 );   -- адреса данных
112
        data: out mem64( mem_size-1 downto 0 );  -- прочитанные данные
113
        n:        in integer                                            -- размер блока памяти
114
        );
115
 
116
procedure int_mem_read(
117
        signal cmd: out bh_cmd;         -- команда для устройства
118
        signal ret: in bh_ret;  -- возвращаемое значение от устройства
119
        adr:    in std_logic_vector( 31 downto 0 ); -- адрес памяти
120
        data:   out std_logic_vector( 31 downto 0 ) -- данные из памяти
121
        );
122
 
123
procedure int_mem_write(
124
        signal cmd: out bh_cmd;         -- команда для устройства
125
        signal ret: in bh_ret;          -- возвращаемое значение от устройства
126
        adr:    in std_logic_vector( 31 downto 0 ); -- адрес памяти
127
        data:   in std_logic_vector( 31 downto 0 ) -- данные для записи
128
        );
129
 
130
 
131
end package cmd_sim_pkg;
132
 
133
 
134
 
135
package body cmd_sim_pkg is
136
 
137
 
138
procedure data_write(
139
        signal  cmd: out bh_cmd;        -- команда для устройства
140
        signal  ret: in bh_ret;         -- возвращаемое значение от устройства
141
        adr: in std_logic_vector( 31 downto 0 );         -- адрес регистра
142
        data: in std_logic_vector( 31 downto 0 ) -- данные для записи
143
        ) is
144
 variable vcmd: bh_cmd;
145
 variable vp0: std_logic_vector( 31 downto 0 );
146
begin
147
 
148
 
149
        vcmd.cmd:=2;
150
        vcmd.adr(0):=adr;
151
        vcmd.data(0)( 31 downto 0 ):=data;
152
 
153
        vp0:=(others=>'0');
154
        vp0(16):='1';
155
        vcmd.p0:=conv_integer( unsigned( vp0 ) );
156
        cmd<=vcmd;
157
        wait until ret'event;
158
        vcmd.cmd:=0;
159
        cmd<=vcmd;
160
        wait for 10 ns;
161
end data_write;
162
 
163
 
164
 
165
procedure data_read(
166
        signal cmd: out bh_cmd;         -- команда для устройства
167
        signal ret: in bh_ret;          -- возвращаемое значение от устройства
168
        adr: in std_logic_vector( 31 downto 0 );         -- адрес регистра
169
        data: out std_logic_vector( 31 downto 0 )        -- прочитанные данные
170
        ) is
171
 variable vcmd: bh_cmd;
172
 variable vp0: std_logic_vector( 31 downto 0 );
173
begin
174
 
175
        vcmd.cmd:=1;
176
        vcmd.adr(0):=adr;
177
 
178
        vp0:=(others=>'0');
179
        vp0(16):='1';
180
        vcmd.p0:=conv_integer( unsigned( vp0 ) );
181
        cmd<=vcmd;
182
        wait until ret'event;
183
        data:=ret.data(0)( 31 downto 0 );
184
        vcmd.cmd:=0;
185
        cmd<=vcmd;
186
        wait for 10 ns;
187
end data_read;
188
 
189
procedure data_write64(
190
        signal  cmd: out bh_cmd;        -- команда для устройства
191
        signal  ret: in bh_ret;         -- возвращаемое значение от устройства
192
        adr: in std_logic_vector( 31 downto 0 );         -- адрес регистра
193
        data: in std_logic_vector( 63 downto 0 ) -- данные для записи
194
        ) is
195
 variable vcmd: bh_cmd;
196
 variable vp0: std_logic_vector( 31 downto 0 );
197
begin
198
 
199
        vcmd.cmd:=2;
200
        vcmd.adr(0):=adr;
201
        vcmd.data(0):=data;
202
 
203
        vp0:=(others=>'0');
204
        vp0(0):='1';
205
        vp0(16):='1';
206
        vcmd.p0:=conv_integer( unsigned( vp0 ) );
207
        cmd<=vcmd;
208
        wait until ret'event;
209
        vcmd.cmd:=0;
210
        cmd<=vcmd;
211
        wait for 10 ns;
212
end data_write64;
213
 
214
procedure data_read64(
215
        signal cmd: out bh_cmd;         -- команда для устройства
216
        signal ret: in bh_ret;          -- возвращаемое значение от устройства
217
        adr: in std_logic_vector( 31 downto 0 );         -- адрес регистра
218
        data: out std_logic_vector( 63 downto 0 )        -- прочитанные данные
219
        )  is
220
 variable vcmd: bh_cmd;
221
 variable vp0: std_logic_vector( 31 downto 0 );
222
begin
223
 
224
        vcmd.cmd:=1;
225
        vcmd.adr(0):=adr;
226
 
227
        vp0:=(others=>'0');
228
        vp0(0):='1';
229
        vp0(16):='1';
230
        vcmd.p0:=conv_integer( unsigned( vp0 ) );
231
        cmd<=vcmd;
232
        wait until ret'event;
233
        data:=ret.data(0);
234
        vcmd.cmd:=0;
235
        cmd<=vcmd;
236
        wait for 10 ns;
237
end data_read64;
238
 
239
 
240
procedure array_write(
241
        signal  cmd: out bh_cmd;        -- команда для устройства
242
        signal  ret: in bh_ret;         -- возвращаемое значение от устройства
243
        adr:  in mem32( mem_size-1 downto 0 );   -- адрес регистра
244
        data: in mem32( mem_size-1 downto 0 );           -- данные для записи
245
        n:        in integer                                                    -- размер блока памяти
246
        ) is
247
 variable vcmd: bh_cmd;
248
 variable vp0: std_logic_vector( 31 downto 0 );
249
begin
250
 
251
 
252
        vcmd.cmd:=2;
253
        for i in 0 to n loop
254
          vcmd.adr(i):=adr(i);
255
          vcmd.data(i)( 31 downto 0 ):=data(i);
256
        end loop;
257
 
258
        vp0:=(others=>'0');
259
        vp0(31 downto 16):=conv_std_logic_vector( n, 16 );
260
        vcmd.p0:=conv_integer( unsigned( vp0 ) );
261
        cmd<=vcmd;
262
        wait until ret'event;
263
        vcmd.cmd:=0;
264
        cmd<=vcmd;
265
        wait for 10 ns;
266
end array_write;
267
 
268
procedure array_read(
269
        signal cmd: out bh_cmd;         -- команда для устройства
270
        signal ret: in bh_ret;          -- возвращаемое значение от устройства
271
        adr:  in mem32( mem_size-1 downto 0 );   -- адрес регистра
272
        data: out mem32( mem_size-1 downto 0 );  -- прочитанные данные
273
        n: in integer                   -- размер блока
274
        )  is
275
 variable vcmd: bh_cmd;
276
 variable vp0: std_logic_vector( 31 downto 0 );
277
begin
278
 
279
 
280
        vcmd.cmd:=1;
281
        for i in 0 to n loop
282
          vcmd.adr(i):=adr(i);
283
        end loop;
284
 
285
        vp0:=(others=>'0');
286
        vp0(31 downto 16):=conv_std_logic_vector( n, 16 );
287
        vcmd.p0:=conv_integer( unsigned( vp0 ) );
288
        cmd<=vcmd;
289
        wait until ret'event;
290
 
291
        for i in 0 to n loop
292
          data(i):=ret.data(i)( 31 downto 0 );
293
        end loop;
294
 
295
        vcmd.cmd:=0;
296
        cmd<=vcmd;
297
        wait for 10 ns;
298
end array_read;
299
 
300
procedure array_write64(
301
        signal  cmd: out bh_cmd;        -- команда для устройства
302
        signal  ret: in bh_ret;         -- возвращаемое значение от устройства
303
        adr:  in mem32( mem_size-1 downto 0 );   -- адрес регистра
304
        data: in mem64( mem_size-1 downto 0 );           -- данные для записи
305
        n:        in integer                                                    -- размер блока памяти
306
        )  is
307
 variable vcmd: bh_cmd;
308
 variable vp0: std_logic_vector( 31 downto 0 );
309
begin
310
 
311
 
312
        vcmd.cmd:=2;
313
        for i in 0 to n loop
314
          vcmd.adr(i):=adr(i);
315
          vcmd.data(i):=data(i);
316
        end loop;
317
 
318
        vp0:=(others=>'0');
319
        vp0(0):='1';
320
        vp0(31 downto 16):=conv_std_logic_vector( n, 16 );
321
        vcmd.p0:=conv_integer( unsigned( vp0 ) );
322
        cmd<=vcmd;
323
        wait until ret'event;
324
        vcmd.cmd:=0;
325
        cmd<=vcmd;
326
        wait for 10 ns;
327
end array_write64;
328
 
329
procedure array_read64(
330
        signal cmd: out bh_cmd;         -- команда для устройства
331
        signal ret: in bh_ret;          -- возвращаемое значение от устройства
332
        adr:  in mem32( mem_size-1 downto 0 );   -- адрес регистра
333
        data: out mem64( mem_size-1 downto 0 );  -- прочитанные данные
334
        n:      in integer                      -- размер блока
335
        )   is
336
 variable vcmd: bh_cmd;
337
 variable vp0: std_logic_vector( 31 downto 0 );
338
begin
339
 
340
 
341
        vcmd.cmd:=1;
342
        for i in 0 to n loop
343
          vcmd.adr(i):=adr(i);
344
        end loop;
345
 
346
        vp0:=(others=>'0');
347
        vp0(0):='1';
348
        vp0(31 downto 16):=conv_std_logic_vector( n, 16 );
349
        vcmd.p0:=conv_integer( unsigned( vp0 ) );
350
        cmd<=vcmd;
351
        wait until ret'event;
352
 
353
        for i in 0 to n loop
354
          data(i):=ret.data(i);
355
        end loop;
356
 
357
        vcmd.cmd:=0;
358
        cmd<=vcmd;
359
        wait for 10 ns;
360
end array_read64;
361
 
362
procedure int_mem_read(
363
        signal cmd: out bh_cmd;         -- команда для устройства
364
        signal ret: in bh_ret;          -- возвращаемое значение от устройства
365
        adr:    in std_logic_vector( 31 downto 0 ); -- адрес памяти
366
        data:   out std_logic_vector( 31 downto 0 ) -- данные из памяти
367
        )  is
368
 
369
 variable vcmd: bh_cmd;
370
 
371
begin
372
 
373
        vcmd.cmd:=21;
374
        vcmd.adr(0):=adr;
375
        cmd<=vcmd;
376
        wait until ret'event;
377
        wait for 1 ns;
378
        data:=ret.data(0)( 31 downto 0 );
379
        vcmd.cmd:=0;
380
        cmd<=vcmd;
381
        wait for 10 ns;
382
 
383
end int_mem_read;
384
 
385
procedure int_mem_write(
386
        signal cmd: out bh_cmd;         -- команда для устройства
387
        signal ret: in bh_ret;          -- возвращаемое значение от устройства
388
        adr:    in std_logic_vector( 31 downto 0 ); -- адрес памяти
389
        data:   in std_logic_vector( 31 downto 0 ) -- данные для записи
390
        ) is
391
 
392
 variable vcmd: bh_cmd;
393
 
394
begin
395
 
396
        vcmd.cmd:=20;
397
        vcmd.adr(0):=adr;
398
        vcmd.data(0)( 31 downto 0 ):=data;
399
        cmd<=vcmd;
400
        wait until ret'event;
401
        wait for 1 ns;
402
        vcmd.cmd:=0;
403
        cmd<=vcmd;
404
        wait for 10 ns;
405
 
406
end int_mem_write;
407
 
408
 
409
 
410
end package body cmd_sim_pkg;

powered by: WebSVN 2.1.0

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