source: FPGA/FAD/FACT_FAD_lib/hdl/memory_manager_beha.vhd@ 238

Last change on this file since 238 was 215, checked in by dneise, 15 years ago
initial commit (2nd part): only VHDL and UCF files were commited.
  • Property svn:executable set to *
File size: 10.1 KB
Line 
1--
2-- VHDL Architecture FACT_FAD_lib.memory_manager.beha
3--
4-- Created:
5-- by - kai.UNKNOWN (E5PCXX)
6-- at - 14:33:25 02.03.2010
7--
8-- using Mentor Graphics HDL Designer(TM) 2008.1 (Build 17)
9--
10library ieee;
11use ieee.std_logic_1164.all;
12use IEEE.STD_LOGIC_ARITH.all;
13use ieee.STD_LOGIC_UNSIGNED.all;
14
15library FACT_FAD_lib;
16use FACT_FAD_lib.fad_definitions.all;
17
18-- library UNISIM;
19-- use UNISIM.VComponents.all;
20-- USE IEEE.NUMERIC_STD.all;
21
22ENTITY memory_manager IS
23 PORT(
24 clk : IN std_logic;
25 config_start : IN std_logic;
26 ram_write_ready : IN std_logic;
27 roi_array : IN roi_array_type;
28 ram_write_ea : OUT std_logic := '0';
29 config_ready, config_started : OUT std_logic := '0';
30 roi_max : OUT roi_max_type := (others => conv_std_logic_vector (0, 11));
31 package_length : OUT std_logic_vector (15 downto 0) := (others => '0');
32 wiz_ram_start_addr : OUT std_logic_vector (13 downto 0) := (others => '0');
33 wiz_write_length : OUT std_logic_vector (16 downto 0) := (others => '0');
34 wiz_number_of_channels : OUT std_logic_vector (3 downto 0) := (others => '0');
35 wiz_write_ea : OUT std_logic := '0';
36 wiz_write_header : OUT std_logic := '0';
37 wiz_write_end : OUT std_logic := '0';
38 wiz_busy : IN std_logic;
39 ram_start_addr : OUT std_logic_vector (11 DOWNTO 0) := (others => '0')
40 );
41
42-- Declarations
43
44END memory_manager ;
45
46--
47ARCHITECTURE beha OF memory_manager IS
48
49type state_mm_type is (MM_CONFIG, MAX_ROI, MAX_ROI1, MAX_ROI2, FIFO_CALC, RAM_CALC, RAM_CALC1, RAM_CALC2, MM_MAIN, MM_MAIN1);
50signal state_mm : state_mm_type := MM_CONFIG;
51
52--type roi_array_type is array (0 to 35) of integer range 0 to 1024;
53type roi_max_array_type is array (0 to 8) of integer range 0 to 1024;
54type channel_size_type is array (0 to 8) of integer range 0 to W5300_TX_FIFO_SIZE;
55type fifo_write_length_type is array (0 to 8) of integer range 0 to W5300_TX_FIFO_SIZE;
56type fifo_channels_array_type is array (0 to 8) of integer range 0 to 9;
57type fifo_package_size_ram_type is array (0 to 8) of integer range 0 to RAM_SIZE_16B;
58
59signal roi_max_array : roi_max_array_type := (others => 0);
60
61-- size of channel groups (16 bit)
62signal channel_size : channel_size_type := (others => 0);
63-- write length of packages (16 bit)
64signal fifo_write_length : fifo_write_length_type := (others => 0);
65-- number of channels per package
66signal fifo_channels_array : fifo_channels_array_type := (others => 0);
67-- size of packages in ram (16 bit)
68signal fifo_package_size_ram : fifo_package_size_ram_type := (others => 0);
69--
70signal event_size_ram : integer range 0 to RAM_SIZE_16B := 0;
71signal event_size_ram_64b : integer range 0 to RAM_SIZE_64B := 0;
72signal event_size : integer range 0 to RAM_SIZE_16B := 0;
73
74signal drs_id : integer range 0 to 4 := 0;
75signal channel_id : integer range 0 to 9 := 0;
76signal channel_index : integer range 0 to 9 := 0;
77signal package_index : integer range 0 to 9 := 0;
78signal number_of_packages : integer range 0 to 9 := 0;
79signal max_events_ram, events_in_ram : integer range 0 to 2048;
80signal event_start_addr : integer range 0 to (RAM_SIZE_64B - 1);
81signal write_start_addr : integer range 0 to (RAM_SIZE_16B - 1);
82signal event_ready_flag : std_logic := '0';
83
84signal roi_index : integer range 0 to 45 := 0;
85signal temp_roi : integer range 0 to 1024 := 0;
86
87BEGIN
88
89 mm : process (clk)
90 begin
91 if rising_edge (clk) then
92 case state_mm is
93
94 when MM_CONFIG =>
95 if (config_start = '1') then
96 config_started <= '1';
97 roi_max_array <= (others => 0);
98 channel_size <= (others => 0);
99 fifo_write_length <= (others => 0);
100 fifo_channels_array <= (others => 0);
101 event_size <= 0;
102 ram_write_ea <= '0';
103 state_mm <= MAX_ROI;
104 end if;
105
106 -- calculate max ROIs and channel sizes
107 when MAX_ROI =>
108 roi_index <= (drs_id * 9) + channel_id;
109 state_mm <= MAX_ROI1;
110 when MAX_ROI1 =>
111 temp_roi <= roi_array (roi_index);
112 state_mm <= MAX_ROI2;
113 when MAX_ROI2 =>
114 if (channel_id < 9) then
115 if ( temp_roi > roi_max_array (channel_id)) then
116 roi_max_array (channel_id) <= temp_roi;
117 end if;
118 channel_size (channel_id) <= channel_size (channel_id) + temp_roi + 3;
119 drs_id <= drs_id + 1;
120 state_mm <= MAX_ROI;
121 if (drs_id = 3) then
122 drs_id <= 0;
123 channel_id <= channel_id + 1;
124 end if;
125 else
126 drs_id <= 0;
127 channel_id <= 0;
128 channel_size (0) <= channel_size (0) + PACKAGE_HEADER_LENGTH;
129 channel_size (8) <= channel_size (8) + PACKAGE_END_LENGTH;
130 state_mm <= FIFO_CALC;
131 end if;
132
133 -- calculate number of channels that fit in FIFO
134 when FIFO_CALC =>
135 if (channel_id < 9) then
136 if ((fifo_write_length (package_index) + channel_size (channel_id)) <= W5300_TX_FIFO_SIZE) then
137 fifo_write_length (package_index) <= fifo_write_length (package_index) + channel_size (channel_id);
138 fifo_channels_array (package_index) <= fifo_channels_array (package_index) + 1;
139 channel_id <= channel_id + 1;
140 event_size <= event_size + channel_size (channel_id);
141 else
142 package_index <= package_index + 1;
143 end if;
144 else
145 number_of_packages <= package_index + 1;
146 package_index <= 0;
147 channel_index <= 0;
148 channel_id <= 0;
149 fifo_package_size_ram <= (others => 0);
150 fifo_package_size_ram (0) <= PACKAGE_HEADER_LENGTH + 6;
151 event_size_ram <= 0;
152 event_size_ram_64b <= 0;
153 max_events_ram <= 0;
154 state_mm <= RAM_CALC;
155 end if;
156
157 when RAM_CALC =>
158 if (package_index < number_of_packages) then
159 if (channel_index < fifo_channels_array (package_index)) then
160 fifo_package_size_ram (package_index) <= fifo_package_size_ram (package_index) + ((roi_max_array (channel_id) + 3) * 4);
161 channel_index <= channel_index + 1;
162 channel_id <= channel_id + 1;
163 else
164 package_index <= package_index + 1;
165 event_size_ram <= event_size_ram + fifo_package_size_ram (package_index);
166 channel_index <= 0;
167 end if;
168 else
169 fifo_package_size_ram (package_index - 1) <= fifo_package_size_ram (package_index - 1) + 4;
170 event_size_ram <= event_size_ram + 4; -- Size of Event in RAM (16 Bit), + CRC + Endflag + 2 Spare
171 state_mm <= RAM_CALC1;
172 end if;
173 when RAM_CALC1 =>
174 max_events_ram <= max_events_ram + 1;
175 if ((max_events_ram * event_size_ram) <= RAM_SIZE_16B) then
176 state_mm <= RAM_CALC1;
177 else
178 max_events_ram <= max_events_ram - 1;
179 state_mm <= RAM_CALC2;
180 end if;
181 when RAM_CALC2 =>
182 event_size_ram_64b <= (event_size_ram / 4);
183 events_in_ram <= 0;
184 event_start_addr <= 0;
185 write_start_addr <= 0;
186 package_index <= 0;
187 channel_id <= 0;
188 ram_start_addr <= (others => '0');
189 ram_write_ea <= '1';
190 config_started <= '0';
191 config_ready <= '1';
192 package_length <= conv_std_logic_vector (event_size, 16);
193 for i in 0 to 8 loop
194 roi_max(i) <= conv_std_logic_vector(roi_max_array(i), 11);
195 end loop;
196 state_mm <= MM_MAIN;
197
198 when MM_MAIN =>
199 state_mm <= MM_MAIN1;
200 if ((ram_write_ready = '1') and (event_ready_flag = '0')) then
201 ram_write_ea <= '0';
202 events_in_ram <= events_in_ram + 1;
203 if ((event_start_addr + event_size_ram_64b) < (RAM_SIZE_64B - event_size_ram_64b)) then
204 event_start_addr <= event_start_addr + event_size_ram_64b;
205 else
206 event_start_addr <= 0;
207 end if;
208 event_ready_flag <= '1';
209 end if;
210 wiz_write_ea <= '0'; -- ?????
211
212 when MM_MAIN1 =>
213 state_mm <= MM_MAIN;
214 if (config_start = '1') then
215 config_ready <= '0';
216 if (events_in_ram = 0) then
217 state_mm <= MM_CONFIG;
218 end if;
219 end if;
220 if (event_ready_flag = '1') then
221 if (events_in_ram < max_events_ram) then
222 ram_write_ea <= '1';
223 ram_start_addr <= conv_std_logic_vector(event_start_addr, 12);
224 event_ready_flag <= '0';
225 end if;
226 end if;
227 if ((events_in_ram > 0) and (wiz_busy = '0')) then
228 if (package_index < number_of_packages) then
229 wiz_ram_start_addr <= conv_std_logic_vector(write_start_addr, 14);
230 wiz_write_length <= conv_std_logic_vector(fifo_write_length (package_index), 17);
231 wiz_number_of_channels <= conv_std_logic_vector(fifo_channels_array (package_index), 4);
232 wiz_write_ea <= '1';
233 package_index <= package_index + 1;
234 if (package_index = 0) then
235 -- first package -> write header
236 wiz_write_header <= '1';
237 else
238 wiz_write_header <= '0';
239 end if;
240 if (package_index = (number_of_packages - 1)) then
241 -- last package -> write end-flag
242 wiz_write_end <= '1';
243 -- next address
244 if ((write_start_addr + event_size_ram) < (RAM_SIZE_16B - event_size_ram)) then
245 write_start_addr <= write_start_addr + event_size_ram;
246 else
247 write_start_addr <= 0;
248 end if;
249 else
250 write_start_addr <= write_start_addr + fifo_package_size_ram (package_index);
251 wiz_write_end <= '0';
252 end if;
253 else
254 events_in_ram <= events_in_ram - 1;
255 package_index <= 0;
256 end if;
257 end if;
258
259
260 end case; -- state_mm
261 end if;
262 end process mm;
263
264
265
266END ARCHITECTURE beha;
267
Note: See TracBrowser for help on using the repository browser.