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/] [root_memory_pkg.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dsmv
-------------------------------------------------------------------------------
2
--
3
-- Title       : root_memory_pkg
4
-- Author      : Dmitry Smekhov
5
-- Company     : Instrumental Systems
6
-- E-mail      : dsmv@insys.ru
7
--
8
-- Version     : 1.0
9
--
10
-------------------------------------------------------------------------------
11
--
12
-- Description : 
13
--
14
-------------------------------------------------------------------------------
15
 
16
library IEEE;
17
use IEEE.STD_LOGIC_1164.all;
18
use ieee.std_logic_arith.all;
19
use ieee.std_logic_unsigned.all;
20
use ieee.std_logic_textio.all;
21
 
22
use std.textio.all;
23
use std.textio;
24
 
25
 
26
package root_memory_pkg is
27
 
28
type type_root_mem32 is array (natural range<>) of integer;
29
 
30
shared variable root_mem_0x10   : type_root_mem32( 16383 downto 0 );     -- адреса 0x100000 - 0x10FFFF;
31
shared variable root_mem_0x80   : type_root_mem32( 16383 downto 0 );     -- адреса 0x800000 - 0x80FFFF;
32
 
33
--! Размер пакета COMPLETION в 32-х разрядных словах 
34
shared variable memory_request_completion_size  :integer:=16;
35
 
36
--! тип одного запроса к памяти 
37
type type_memory_request_item is record
38
 
39
        tag                             : std_logic_vector( 7 downto 0 );                --! идентификатор запроса 
40
        adr_low                 : std_logic_vector( 31 downto 0 );               --! младшие разряды адреса 
41
        adr_high                : std_logic_vector( 31 downto 0 );               --! старшие разряды адреса
42
        size                    : integer;                                      --! размер 
43
        requester_id    : std_logic_vector( 15 downto 0 );               --! идентификатор отправителя запроса
44
 
45
end record;
46
 
47
 
48
 
49
signal                  mem64r_request                  : std_logic:='0';        --! событие запроса 
50
 
51
 
52
--! запись запроса в очередь
53
procedure       memory_request_write
54
        (
55
                req_item                : in type_memory_request_item   --! запрос
56
        );
57
 
58
--! извлечение запроса из очереди       
59
procedure       memory_request_read
60
        (
61
                req_ready               : out integer;                                          --! 1 - есть запрос
62
                req_item                : out type_memory_request_item          --! запрос 
63
        );
64
 
65
 
66
--! запись данных в память 
67
procedure       memory_write
68
        (
69
                adr_high                : in std_logic_vector( 31 downto 0 );    --! 1 - старшие разряды адреса
70
                adr_low                 : in std_logic_vector( 31 downto 0 );    --! 1 - старшие разряды адреса
71
                data                    : std_logic_vector( 31 downto 0 )                --! данные для записи в память
72
        );
73
 
74
 
75
 
76
end package;
77
 
78
package body root_memory_pkg is
79
 
80
 
81
constant        memory_request_size                     : integer:=64;  --! размер очереди запросов
82
--! типа очереди запросов на чтение 
83
type type_memory_request_array is array( memory_request_size-1 downto 0 ) of type_memory_request_item;
84
 
85
-- Очередь запросов 
86
shared variable memory_request_array    : type_memory_request_array;    --! данные запроса 
87
shared variable memory_request_index_wr : integer:=-1;                                  --! индекс записи в память запросов 
88
shared variable memory_request_index_rd : integer:=-1;                                  --! индекс чтения из памяти запросов
89
 
90
 
91
--! переход к следующему элементу       
92
function next_index( index : in integer ) return integer is
93
 
94
        variable        ret             : integer;
95
 
96
begin
97
 
98
        ret := index + 1;
99
        if( ret=memory_request_size ) then
100
                ret:=0;
101
        end if;
102
 
103
        return ret;
104
 
105
end next_index;
106
 
107
--! запись запроса в очередь
108
procedure       memory_request_write
109
        (
110
                req_item                : in type_memory_request_item   --! запрос
111
        ) is
112
 
113
variable        n       : integer;
114
 
115
begin
116
 
117
        n:=next_index( memory_request_index_wr );
118
 
119
        memory_request_array( n ) := req_item;
120
 
121
        memory_request_index_wr:=n;
122
 
123
 
124
end memory_request_write;
125
 
126
--! извлечение запроса из очереди       
127
procedure       memory_request_read
128
        (
129
                req_ready               : out integer;                                          --! 1 - есть запрос
130
                req_item                : out type_memory_request_item          --! запрос 
131
        ) is
132
 
133
variable        n               : integer;
134
variable        ret             : type_memory_request_array;
135
 
136
begin
137
 
138
        if( memory_request_index_wr=memory_request_index_rd ) then
139
                req_ready := 0;
140
        else
141
                n:=next_index( memory_request_index_rd );
142
                req_item:=memory_request_array( n );
143
                req_ready := 1;
144
                memory_request_index_rd :=n;
145
        end if;
146
 
147
end memory_request_read;
148
 
149
 
150
--! запись данных в память 
151
procedure       memory_write
152
        (
153
                adr_high                : in std_logic_vector( 31 downto 0 );    --! 1 - старшие разряды адреса
154
                adr_low                 : in std_logic_vector( 31 downto 0 );    --! 1 - старшие разряды адреса
155
                data                    : std_logic_vector( 31 downto 0 )                --! данные для записи в память
156
        ) is
157
 
158
variable        adr_h           : integer;
159
variable        adr_l           : integer;
160
variable        datai           : integer;
161
variable        index           : integer;
162
variable        str     : LINE;         -- pointer to string
163
begin
164
 
165
        adr_h :=  conv_integer( adr_high );
166
        adr_l := conv_integer( adr_low );
167
 
168
        if( adr_h=0 ) then
169
                if( adr_l>=16#100000# and adr_l<=16#10FFFF# ) then
170
                        index:=adr_l-16#100000#;
171
                        index:=index/4;
172
                        root_mem_0x10(index):= conv_integer( data );
173
 
174
                write( str, string'("adr_l: " )); hwrite( str, adr_low ); write( str, string'(" index: " )); write( str, index ); write( str, string'(" : " ));  hwrite( str, data ); writeline( output, str );
175
 
176
                elsif( adr_l>=16#800000# and adr_l<=16#80FFFF# ) then
177
                        index:=adr_l-16#800000#;
178
                        index:=index/4;
179
                        root_mem_0x80(index):= conv_integer( data );
180
                end if;
181
        end if;
182
 
183
 
184
end memory_write;
185
 
186
 
187
end package body;

powered by: WebSVN 2.1.0

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