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

Subversion Repositories xmatchpro

[/] [xmatchpro/] [trunk/] [xmw4-comdec/] [src/] [level1r.vhd] - Blame information for rev 8

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 8 eejlny
--This library is free software; you can redistribute it and/or
2
--modify it under the terms of the GNU Lesser General Public
3
--License as published by the Free Software Foundation; either
4
--version 2.1 of the License, or (at your option) any later version.
5
 
6
--This library is distributed in the hope that it will be useful,
7
--but WITHOUT ANY WARRANTY; without even the implied warranty of
8
--MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
9
--Lesser General Public License for more details.
10
 
11
--You should have received a copy of the GNU Lesser General Public
12
--License along with this library; if not, write to the Free Software
13
--Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301  USA
14
 
15
-- e_mail : j.l.nunez-yanez@byacom.co.uk
16
 
17
---------------------------------
18
--  ENTITY       = LEVEL1      --
19
--  version      = 5.0         --
20
--  last update  = 1/05/01     --
21
--  author       = Jose Nunez  --
22
---------------------------------
23
 
24
 
25
-- FUNCTION
26
--  Top level of the compression decompression hierarchy.
27
 
28
 
29
library ieee,std,dzx;
30
use ieee.std_logic_1164.all;
31
 
32
use dzx.bit_utils.all;
33
-- use std.textio.all;
34
 
35
entity level1r is
36
port
37
(
38
        CS : in bit ;
39
        RW : in bit;
40
        ADDRESS: in bit_vector(3 downto 0);
41
        CONTROL : inout std_logic_vector(31 downto 0);
42
        CLK : in bit ;
43
        CLEAR: in bit;
44
        BUS_ACKNOWLEDGE_CC : in bit;
45
        BUS_ACKNOWLEDGE_CU : in bit;
46
        BUS_ACKNOWLEDGE_DC : in bit;
47
        BUS_ACKNOWLEDGE_DU : in bit;
48
        WAIT_CU : in bit;
49
  WAIT_CC : in bit;
50
  WAIT_DC : in bit;
51
  WAIT_DU : in bit;
52
        U_DATAIN : in bit_vector(31 downto 0);
53
        C_DATAIN : in bit_vector(31 downto 0);
54
        U_DATAOUT : out std_logic_vector(31 downto 0);
55
        C_DATAOUT : out std_logic_vector(31 downto 0);
56
        FINISHED_C : out bit;
57
        FINISHED_D : out bit;
58
        COMPRESSING : out bit;
59
        FLUSHING_C : out bit;
60
        FLUSHING_D : out bit;
61
        DECOMPRESSING : out bit;
62
        U_DATA_VALID : out bit;
63
        C_DATA_VALID : out bit;
64
        DECODING_OVERFLOW : out bit;
65
        CODING_OVERFLOW : out bit; -- ilegal => error condition
66
        CRC_ERROR : out bit; -- error condition in the compression or decompression channels
67
        INTERRUPT_REQUEST : out bit;
68
   INTERRUPT_ACKNOWLEDGE : in bit;
69
        BUS_REQUEST_CC : out bit;
70
        BUS_REQUEST_CU : out bit;
71
        BUS_REQUEST_DC : out bit;
72
        BUS_REQUEST_DU : out bit
73
);
74
end level1r;
75
 
76
 
77
architecture level1_1 of level1r is
78
 
79
-- these are  the components that form level1
80
 
81
component level1rc
82
port
83
(
84
  OVERFLOW_CONTROL :  in bit;
85
        CS : in bit ;
86
        RW : in bit;
87
        ADDRESS: in bit_vector(1 downto 0);
88
        CONTROL : inout std_logic_vector(31 downto 0);
89
        CLK : in bit ;
90
        CLEAR: in bit;
91
        BUS_ACKNOWLEDGE_U : in bit;
92
        BUS_ACKNOWLEDGE_C : in bit;
93
        WAIT_U   : in bit;
94
        WAIT_C   : in bit;
95
        U_DATAIN : in bit_vector(31 downto 0);
96
        C_DATAOUT : out std_logic_vector(31 downto 0);
97
        C_DATAOUT_TO_DECOMP : out std_logic_vector(31 downto 0);
98
        FINISHED : out bit;
99
        COMPRESSING : out bit;
100
        MODE : out bit;
101
        FLUSHING : out bit;
102
        CODING_OVERFLOW : out bit;
103
        C_DATA_VALID : out bit;
104
        CRC_OUT : out bit_vector(31 downto 0);
105
        BUS_REQUEST_U : out bit;
106
        BUS_REQUEST_C : out bit
107
);
108
end component;
109
 
110
component level1rd
111
port
112
(
113
        CS : in bit ;
114
        RW : in bit;
115
        ADDRESS: in bit_vector(1 downto 0);
116
        CONTROL : inout std_logic_vector(31 downto 0);
117
        CLK : in bit ;
118
        CLEAR: in bit;
119
        BUS_ACKNOWLEDGE_C : in bit;
120
        BUS_ACKNOWLEDGE_U : in bit;
121
  WAIT_C : in bit;
122
   WAIT_U : in bit;
123
        C_DATA_VALID : in bit;
124
        START_C : in bit;
125
        TEST_MODE : in bit;
126
        FINISHED_C : in bit;
127
        C_DATAIN : in bit_vector(31 downto 0);
128
        U_DATAOUT : out std_logic_vector(31 downto 0);
129
        FINISHED : out bit;
130
        FLUSHING : out bit;
131
        DECOMPRESSING : out bit;
132
        U_DATA_VALID : out bit;
133
        DECODING_OVERFLOW : out bit;
134
        CRC_OUT : out bit_vector(31 downto 0);
135
        BUS_REQUEST_C : out bit;
136
  OVERFLOW_CONTROL_DECODING_BUFFER : out bit;
137
        BUS_REQUEST_U : out bit
138
);
139
end component;
140
 
141
 
142
signal CS_C : bit;
143
signal CS_D : bit;
144
signal RW_C : bit;
145
signal RW_D : bit;
146
signal ADDRESS_C : bit_vector(1 downto 0);
147
signal ADDRESS_D : bit_vector(1 downto 0);
148
signal C_DATA_VALID_AUX : bit; -- signals for test mode
149
signal FINISHED_C_AUX : bit;
150
signal COMPRESSING_AUX : bit;
151
signal C_DATAOUT_AUX : std_logic_vector(31 downto 0);
152
signal C_DATAOUT_INT : bit_vector(31 downto 0);
153
signal C_DATAIN_AUX : bit_vector(31 downto 0);
154
signal BUS_REQUEST_DC_AUX : bit;
155
signal CRC_OUT_C,CRC_OUT_D : bit_vector(31 downto 0);
156
signal DECOMPRESSING_AUX : bit;
157
signal CRC_CHECK : bit;
158
signal CRC_ACTIVE: bit;
159
signal MODE: bit;
160
signal WAIT_DC_AUX : bit;
161
signal WAIT_DU_AUX : bit;
162
 
163
signal TEST_MODE : bit;
164
 
165
signal  DECODING_OVERFLOW_AUX : bit; -- ilegal => error condition
166
signal  CODING_OVERFLOW_AUX : bit; -- ilegal => error condition
167
signal  CRC_ERROR_AUX : bit; -- error condition in the compression or decompression channels
168
signal  FINISHED_D_AUX : bit;
169
signal STATUS_C : bit_vector(31 downto 0);
170
signal STATUS_D : bit_vector(31 downto 0);
171
signal ENABLE_INTERRUPT_C : bit;
172
signal ENABLE_INTERRUPT_D : bit;
173
signal INTERRUPT_C : bit;
174
signal INTERRUPT_D : bit;
175
 
176
 
177
signal OVERFLOW_CONTROL_DECODING_BUFFER : bit;
178
 
179
begin
180
 
181
 
182
 
183
level1_c : level1rc  port map(
184
  OVERFLOW_CONTROL => OVERFLOW_CONTROL_DECODING_BUFFER,
185
        CS => CS_C,
186
        RW => RW_C,
187
        ADDRESS => ADDRESS_C,
188
        CONTROL => CONTROL,
189
        CLK     => CLK,
190
        CLEAR => CLEAR,
191
        BUS_ACKNOWLEDGE_C => BUS_ACKNOWLEDGE_CC,
192
        BUS_ACKNOWLEDGE_U => BUS_ACKNOWLEDGE_CU,
193
        WAIT_U => WAIT_CU,
194
   WAIT_C => WAIT_CC,
195
        U_DATAIN => U_DATAIN,
196
        C_DATAOUT => C_DATAOUT,
197
  C_DATAOUT_TO_DECOMP => C_DATAOUT_AUX,
198
        FINISHED => FINISHED_C_AUX,
199
        COMPRESSING => COMPRESSING_AUX,
200
        MODE => MODE,
201
        FLUSHING => FLUSHING_C,
202
        CODING_OVERFLOW => CODING_OVERFLOW_AUX,
203
        C_DATA_VALID => C_DATA_VALID_AUX,
204
        CRC_OUT => CRC_OUT_C,
205
        BUS_REQUEST_C => BUS_REQUEST_CC,
206
        BUS_REQUEST_U => BUS_REQUEST_CU
207
);
208
 
209
COMPRESSING <= COMPRESSING_AUX;
210
FINISHED_C <= FINISHED_C_AUX;
211
C_DATA_VALID <= C_DATA_VALID_AUX;
212
WAIT_DC_AUX <= WAIT_DC or TEST_MODE;
213
WAIT_DU_AUX <= WAIT_DU or TEST_MODE; -- never wait in the decompression channel under test mode
214
 
215
 
216
level1_d : level1rd  port map(
217
        CS => CS_D,
218
        RW => RW_D,
219
        ADDRESS => ADDRESS_D,
220
        CONTROL => CONTROL,
221
        CLK     => CLK,
222
        CLEAR => CLEAR,
223
        BUS_ACKNOWLEDGE_C => BUS_ACKNOWLEDGE_DC,
224
        BUS_ACKNOWLEDGE_U => BUS_ACKNOWLEDGE_DU,
225
   WAIT_C => WAIT_DC_AUX,
226
   WAIT_U => WAIT_DU_AUX,
227
        C_DATA_VALID =>C_DATA_VALID_AUX,
228
        START_C => MODE,
229
        TEST_MODE => TEST_MODE,
230
        FINISHED_C =>FINISHED_C_AUX,
231
        C_DATAIN => C_DATAIN_AUX,
232
        U_DATAOUT => U_DATAOUT,
233
        FINISHED => CRC_CHECK,
234
        FLUSHING => FLUSHING_D,
235
        DECOMPRESSING => DECOMPRESSING_AUX,
236
        U_DATA_VALID => U_DATA_VALID,
237
        DECODING_OVERFLOW => DECODING_OVERFLOW_AUX,
238
        CRC_OUT => CRC_OUT_D,
239
        BUS_REQUEST_C => BUS_REQUEST_DC_AUX,
240
  OVERFLOW_CONTROL_DECODING_BUFFER => OVERFLOW_CONTROL_DECODING_BUFFER,
241
        BUS_REQUEST_U => BUS_REQUEST_DU
242
);
243
 
244
DECOMPRESSING <= DECOMPRESSING_AUX;
245
FINISHED_D <= CRC_CHECK;
246
FINISHED_D_AUX <= CRC_CHECK;
247
 
248
DELAY_C_DATAIN : process(CLK, CLEAR)   -- test mode delay c data
249
begin
250
 
251
if (CLEAR = '0') then
252
        C_DATAOUT_INT <= x"00000000";
253
elsif ((CLK'event) and (CLK = '1')) then
254
        C_DATAOUT_INT <= To_bitvector(C_DATAOUT_AUX);
255
end if;
256
 
257
end process;
258
 
259
 
260
CRC_CONTROL : process(CLK, CLEAR)   -- test mode delay c data
261
begin
262
 
263
if (CLEAR = '0') then
264
        CRC_ACTIVE <= '0';
265
elsif ((CLK'event) and (CLK = '1')) then
266
    if (CS = '0' and RW = '0') then --delete
267
                        CRC_ACTIVE <='0';
268
        elsif (CRC_CHECK = '0' and TEST_MODE = '1') then -- no activity in the engines
269
                        CRC_ACTIVE <='1';   -- active
270
        else
271
                        CRC_ACTIVE <=CRC_ACTIVE;
272
        end if;
273
end if;
274
 
275
end process;
276
 
277
MODE_CONTROL : process(CLK, CLEAR)   -- test mode delay c data
278
begin
279
 
280
if (CLEAR = '0') then
281
        TEST_MODE <= '0';
282
elsif ((CLK'event) and (CLK = '1')) then
283
      if (CS = '0' and RW = '0') then --delete
284
                        TEST_MODE <='0';
285
        elsif (MODE = '0') then
286
                        TEST_MODE <= '1'; --test mode active
287
        else
288
                        TEST_MODE <= TEST_MODE;
289
        end if;
290
end if;
291
 
292
end process;
293
 
294
 
295
STATUS_REGISTER_COMPRESSION : process(CLK, CLEAR)
296
 
297
begin
298
 
299
if (CLEAR = '0' ) then
300
        STATUS_C <= x"FFFFFFFF";
301
elsif ((CLK'event) and (CLK = '1')) then
302
                        if ( CS_C = '0' and RW = '0' ) then
303
                                STATUS_C <= x"FFFFFFFF";
304
                        elsif (CRC_ERROR_AUX = '0' and TEST_MODE = '1') then
305
                                STATUS_C(15) <= '0';
306
                        elsif CODING_OVERFLOW_AUX = '0' then
307
                                STATUS_C(14) <= '0';
308
                        elsif (DECODING_OVERFLOW_AUX = '0'and TEST_MODE = '1') then
309
                                STATUS_C(13) <= '0';
310
                        elsif (FINISHED_D_AUX = '0' and TEST_MODE = '1') then -- the decompression channel only affects this register in test mode
311
                                STATUS_C(1) <= '0';
312
                        elsif FINISHED_C_AUX = '0' then
313
                                STATUS_C(0) <= '0';
314
                        end if;
315
end if;
316
 
317
end process;
318
 
319
 
320
 
321
 
322
 
323
STATUS_REGISTER_DECOMPRESSION : process(CLK, CLEAR)
324
 
325
begin
326
 
327
if (CLEAR = '0' ) then
328
        STATUS_D <= x"FFFFFFFF";
329
elsif ((CLK'event) and (CLK = '1')) then
330
                        if ( CS_D = '0' and RW = '0' ) then
331
                                STATUS_D <= x"FFFFFFFF";
332
                        elsif (DECODING_OVERFLOW_AUX = '0' and TEST_MODE = '0') then
333
                                STATUS_D(13) <= '0';
334
                        elsif (FINISHED_D_AUX = '0' and TEST_MODE = '0') then
335
                                STATUS_D(1) <= '0';
336
                        end if;
337
end if;
338
 
339
end process;
340
 
341
 
342
ENABLE_INTERRUPT_PROCESS : process(CLK, CLEAR)
343
 
344
begin
345
 
346
if (CLEAR = '0' ) then
347
        ENABLE_INTERRUPT_C <= '0';
348
        ENABLE_INTERRUPT_D <= '0';
349
elsif ((CLK'event) and (CLK = '1')) then
350
                        if (CS_C = '0' and RW = '0' ) then
351
                                ENABLE_INTERRUPT_C <= '1';
352
       elsif (CS_D = '0' and RW = '0') then
353
                          ENABLE_INTERRUPT_D <= '1';
354
                        elsif (INTERRUPT_ACKNOWLEDGE = '0' and INTERRUPT_C = '0') then
355
                                ENABLE_INTERRUPT_C <= '0';
356
                        elsif (INTERRUPT_ACKNOWLEDGE = '0' and INTERRUPT_D = '0') then
357
                                ENABLE_INTERRUPT_D <= '0';
358
                        else
359
                                ENABLE_INTERRUPT_C <= ENABLE_INTERRUPT_C;
360
                                ENABLE_INTERRUPT_D <= ENABLE_INTERRUPT_D;
361
                        end if;
362
end if;
363
 
364
end process;
365
 
366
INTERRUPT_C <= '0' when ((STATUS_C(15) = '0' or STATUS_C(14) = '0' or STATUS_C(13) = '0'  or STATUS_C(1) = '0'  or (STATUS_C(0) = '0' and TEST_MODE = '0')) and ENABLE_INTERRUPT_C = '1') else '1';
367
 
368
INTERRUPT_D <= '0' when ((STATUS_D(13)= '0' or STATUS_D(1) = '0') and ENABLE_INTERRUPT_D = '1') else '1';
369
 
370
INTERRUPT_REQUEST <= '0' when (INTERRUPT_C = '0' or INTERRUPT_D = '0')  else '1';
371
 
372
 
373
 
374
 
375
 
376
CONTROL <= To_X01Z(STATUS_C) when ADDRESS = "0000" and CS = '0' and RW = '1' else "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
377
 
378
CONTROL <= To_X01Z(STATUS_D) when ADDRESS = "0001" and CS = '0' and RW = '1' else "ZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ";
379
 
380
 
381
 
382
 
383
CRC_ERROR <= CRC_ERROR_AUX;
384
CODING_OVERFLOW <= CODING_OVERFLOW_AUX;
385
DECODING_OVERFLOW <= DECODING_OVERFLOW_AUX;
386
 
387
 
388
 
389
 
390
CRC_ERROR_AUX <= '0' when CRC_OUT_D /= CRC_OUT_C and CRC_ACTIVE = '1' else '1';  -- 0 active 
391
 
392
 
393
 
394
 
395
BUS_REQUEST_DC <= BUS_REQUEST_DC_AUX;
396
 
397
C_DATAIN_AUX <= C_DATAIN when BUS_REQUEST_DC_AUX = '0' else C_DATAOUT_INT;
398
ADDRESS_C <= ADDRESS(1 downto 0);
399
ADDRESS_D <= ADDRESS(1 downto 0);
400
RW_D <= RW;
401
RW_C <= RW;
402
CS_D <= '0' when (CS = '0') and (ADDRESS(3 downto 2) = "10" or (ADDRESS(3) = '1' and ADDRESS(1 downto 0) = "01")) else '1';
403
CS_C <= '0' when (CS = '0' and ADDRESS(3 downto 2) = "11") else '1';
404
 
405
 
406
end level1_1;

powered by: WebSVN 2.1.0

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