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

Subversion Repositories mips_enhanced

[/] [mips_enhanced/] [trunk/] [grlib-gpl-1.0.19-b3188/] [lib/] [tech/] [ec/] [orca/] [ORCA_L.vhd] - Blame information for rev 2

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 dimamali
-- --------------------------------------------------------------------
2
-- >>>>>>>>>>>>>>>>>>>>>>>>> COPYRIGHT NOTICE <<<<<<<<<<<<<<<<<<<<<<<<<
3
-- --------------------------------------------------------------------
4
-- Copyright (c) 2005 by Lattice Semiconductor Corporation
5
-- --------------------------------------------------------------------
6
--
7
--
8
--                     Lattice Semiconductor Corporation
9
--                     5555 NE Moore Court
10
--                     Hillsboro, OR 97214
11
--                     U.S.A.
12
--
13
--                     TEL: 1-800-Lattice  (USA and Canada)
14
--                          1-408-826-6000 (other locations)
15
--
16
--                     web: http://www.latticesemi.com/
17
--                     email: techsupport@latticesemi.com
18
--
19
-- --------------------------------------------------------------------
20
--
21
-- Simulation Library File for EC/XP
22
--
23
-- $Header: G:\\CVS_REPOSITORY\\CVS_MACROS/LEON3SDE/ALTERA/grlib-eval-1.0.4/lib/tech/ec/ec/ORCA_L.vhd,v 1.1 2005/12/06 13:00:23 tame Exp $ 
24
--
25
library std;
26
use std.textio.all;
27
 
28
library ieee, std;
29
use ieee.std_logic_1164.all;
30
use ieee.std_logic_unsigned.all;
31
use std.textio.all;
32
 
33
 
34
-- ************************************************************************
35
-- Entity definition  
36
-- "generic" members 
37
-- ************************************************************************
38
 
39
entity SC_BRAM_16K_L is
40
 
41
  generic (
42
         AWRITE_MODE   : string  := "NORMAL";
43
         BWRITE_MODE   : string  := "NORMAL";
44
         WADDR_WIDTH_A : integer := 14;
45
         RADDR_WIDTH_A : integer := 12;
46
         WADDR_WIDTH_B : integer := 14;
47
         RADDR_WIDTH_B : integer := 12;
48
         WDATA_WIDTH_A : integer := 1;
49
         RDATA_WIDTH_A : integer := 4;
50
         WDATA_WIDTH_B : integer := 1;
51
         RDATA_WIDTH_B : integer := 4;
52
         ARRAY_SIZE    : integer := 262144;
53
         MEM_INIT_FLAG : integer := 0;
54
         MEM_INIT_FILE : string  := ""
55
 
56
          );
57
 
58
  port (
59
         WADA : in  STD_LOGIC_VECTOR (WADDR_WIDTH_A -1 downto 0);
60
         WEA  : in  STD_LOGIC ;
61
         WDA  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_A -1 downto 0);
62
         RADA : in  STD_LOGIC_VECTOR (RADDR_WIDTH_A -1 downto 0);
63
         REA  : in  STD_LOGIC ;
64
         RDA  : out STD_LOGIC_VECTOR (RDATA_WIDTH_A -1 downto 0);
65
 
66
         WADB : in  STD_LOGIC_VECTOR (WADDR_WIDTH_B -1 downto 0);
67
         WEB  : in  STD_LOGIC;
68
         WDB  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_B -1 downto 0);
69
         RADB : in  STD_LOGIC_VECTOR (RADDR_WIDTH_B -1 downto 0);
70
         REB  : in  STD_LOGIC;
71
         RDB  : out STD_LOGIC_VECTOR (RDATA_WIDTH_B -1 downto 0)
72
        );
73
 
74
end SC_BRAM_16K_L;
75
 
76
-- ************************************************************************
77
-- Architecture
78
-- ************************************************************************
79
 
80
architecture LATTICE_BEHAV of SC_BRAM_16K_L is
81
 
82
procedure READ_MEM_INIT_FILE(
83
                              f_name : IN    STRING;
84
                              v_MEM  : OUT   STD_LOGIC_VECTOR
85
                             ) IS
86
 
87
    file     f_INIT_FILE   : TEXT is MEM_INIT_FILE;
88
    variable v_WORD        : line;
89
    variable v_GOODFLAG    : boolean;
90
    variable v_WORD_BIT    : string (WDATA_WIDTH_A downto 1) ;
91
    variable v_CHAR        : character;
92
    variable v_OFFSET      : integer := 0;
93
    variable v_LINE        : integer := 0;
94
 
95
    begin
96
 
97
      while ( not(endfile(f_INIT_FILE)) and (v_LINE < 2**WADDR_WIDTH_A)) loop
98
 
99
      readline(f_INIT_FILE, v_WORD);
100
      read(v_WORD, v_WORD_BIT, v_GOODFLAG);
101
 
102
      for k in 0 to WDATA_WIDTH_A - 1 loop
103
        v_CHAR := v_WORD_BIT (k + 1);
104
        if (v_CHAR = '1') then
105
          v_MEM(v_OFFSET + k) := '1';
106
 
107
        elsif (v_CHAR = '0') then
108
          v_MEM(v_OFFSET + k) := '0';
109
 
110
--      else 
111
--          v_MEM(v_OFFSET + k) := 'X';
112
 
113
        end if;
114
      end loop;
115
 
116
      v_LINE := v_LINE + 1;
117
      v_OFFSET := v_OFFSET + WDATA_WIDTH_A;
118
 
119
    end loop;
120
 
121
  end READ_MEM_INIT_FILE;
122
 
123
--------------------------------------------------------------------------
124
-- Function: Valid_Address 
125
-- Description: 
126
--------------------------------------------------------------------------
127
function Valid_Address (
128
    IN_ADDR : in std_logic_vector
129
 ) return boolean is
130
 
131
    variable v_Valid_Flag : boolean := TRUE;
132
 
133
begin
134
 
135
    for i in IN_ADDR'high downto IN_ADDR'low loop
136
        if (IN_ADDR(i) /= '0' and IN_ADDR(i) /= '1') then
137
            v_Valid_Flag := FALSE;
138
        end if;
139
    end loop;
140
 
141
    return v_Valid_Flag;
142
end Valid_Address;
143
 
144
--------------------------------------------------------------------------
145
-- Signal Declaration
146
--------------------------------------------------------------------------
147
 
148
--------- Local signals used to propagate input wire delay ---------------
149
 
150
signal WADA_node   : std_logic_vector( WADDR_WIDTH_A -1 downto 0) := (others => '0');
151
signal WEA_node    : std_logic := 'X';
152
signal WDA_node    : std_logic_vector( WDATA_WIDTH_A -1 downto 0) := (others => 'X');
153
signal RADA_node   : std_logic_vector( RADDR_WIDTH_A -1 downto 0) := (others => '0');
154
signal REA_node    : std_logic := 'X';
155
signal RDA_node    : std_logic_vector( RDATA_WIDTH_A -1 downto 0) := (others => 'X');
156
signal RDA_temp    : std_logic_vector( RDATA_WIDTH_A -1 downto 0) := (others => 'X');
157
 
158
signal WADB_node   : std_logic_vector( WADDR_WIDTH_B -1 downto 0) := (others => '0');
159
signal WEB_node    : std_logic := 'X';
160
signal WDB_node    : std_logic_vector( WDATA_WIDTH_B -1 downto 0) := (others => 'X');
161
signal RADB_node   : std_logic_vector( RADDR_WIDTH_B -1 downto 0) := (others => '0');
162
signal REB_node    : std_logic := 'X';
163
signal RDB_node    : std_logic_vector( RDATA_WIDTH_B -1 downto 0) := (others => 'X');
164
signal RDB_temp    : std_logic_vector( RDATA_WIDTH_B -1 downto 0) := (others => 'X');
165
 
166
-- architecture
167
begin
168
 
169
 WADA_node <= WADA;
170
 WEA_node  <= WEA;
171
 WDA_node  <= WDA;
172
 RADA_node <= RADA;
173
 REA_node  <= REA;
174
 RDA       <= RDA_TEMP;
175
 
176
 WADB_node <= WADB;
177
 WEB_node  <= WEB;
178
 WDB_node  <= WDB;
179
 RADB_node <= RADB;
180
 REB_node  <= REB;
181
 RDB       <= RDB_TEMP;
182
 
183
RDB_process: process(RDB_node, WEB_node)
184
begin
185
   if (WEB_node = '1') then
186
      if (BWRITE_MODE = "WRITETHROUGH") then
187
        RDB_temp <= RDB_node;
188
      elsif (BWRITE_MODE = "NORMAL") then
189
        RDB_temp <= RDB_temp;
190
      end if;
191
   else
192
        RDB_temp <= RDB_node;
193
   end if;
194
end process;
195
 
196
RDA_process: process(RDA_node, WEA_node)
197
begin
198
   if (WEA_node = '1') then
199
      if (AWRITE_MODE = "WRITETHROUGH") then
200
        RDA_temp <= RDA_node;
201
      elsif (AWRITE_MODE = "NORMAL") then
202
        RDA_temp <= RDA_temp;
203
      end if;
204
   else
205
        RDA_temp <= RDA_node;
206
   end if;
207
end process;
208
 
209
 
210
-----------------------------------------
211
--------- Behavior process  -------------
212
-----------------------------------------
213
 
214
  KERNEL_BEHAV : process( WADA_node, WEA_node, WDA_node, RADA_node, REA_node, WADB_node, WEB_node, WDB_node, RADB_node, REB_node)
215
 
216
 
217
--TSPEC: A note about sram initial values and rom mode: 
218
--       If the user does not provide any values, ... default 0 
219
--       for all ram locations in JECED
220
--QQ 7_17 variable v_MEM         : std_logic_vector(ARRAY_SIZE - 1 downto 0) := ( others => '0' ); 
221
 
222
    variable v_MEM         : std_logic_vector(ARRAY_SIZE*WDATA_WIDTH_A + WDATA_WIDTH_A - 1 downto 0) := ( others => '0' );
223
    variable v_INI_DONE    : boolean := FALSE;
224
    variable v_WADDR_A     : integer;
225
    variable v_RADDR_A     : integer;
226
    variable v_WADDR_B     : integer;
227
    variable v_RADDR_B     : integer;
228
 
229
    variable v_WADDRA_Valid_Flag : boolean := TRUE;
230
    variable v_WADDRB_Valid_Flag : boolean := TRUE;
231
    variable v_RADDRA_Valid_Flag : boolean := TRUE;
232
    variable v_RADDRB_Valid_Flag : boolean := TRUE;
233
 
234
  begin -- Process
235
 
236
    if( MEM_INIT_FLAG = 1 and v_INI_DONE = FALSE) THEN
237
        READ_MEM_INIT_FILE(MEM_INIT_FILE, v_MEM);
238
        v_INI_DONE := TRUE;
239
    end if;
240
 
241
  -- Address Check    
242
    v_WADDRA_Valid_Flag := Valid_Address(WADA_node);
243
    v_WADDRB_Valid_Flag := Valid_Address(WADB_node);
244
    v_RADDRA_Valid_Flag := Valid_Address(RADA_node);
245
    v_RADDRB_Valid_Flag := Valid_Address(RADB_node);
246
 
247
    if ( v_WADDRA_Valid_Flag = TRUE ) then
248
        v_WADDR_A := CONV_INTEGER(WADA_node);
249
--    else      
250
--      assert (Now = 0 ps) 
251
--        report "Write AddressA of Port contains invalid bit!"
252
--        severity warning;
253
    end if;
254
 
255
    if (v_WADDRB_Valid_Flag = TRUE ) then
256
      v_WADDR_B := CONV_INTEGER(WADB_node);
257
--    else
258
--      assert (Now = 0 ps)
259
--        report "Write AddressB of Port contains invalid bit!"
260
--        severity warning;
261
    end if;
262
 
263
    if (v_RADDRA_Valid_Flag = TRUE ) then
264
      v_RADDR_A := CONV_INTEGER(RADA_node);
265
--    else
266
--      assert (Now = 0 ps)
267
--        report "Read AddressA of Port contains invalid bit!"
268
--        severity warning;
269
    end if;
270
 
271
    if (v_RADDRB_Valid_Flag = TRUE ) then
272
      v_RADDR_B := CONV_INTEGER(RADB_node);
273
--    else
274
--      assert (Now = 0 ps)
275
--        report "Read AddressB of Port contains invalid bit!"
276
--        severity warning;
277
    end if;
278
 
279
  -- CHECK Operation
280
    if (WEA = '1' and WEB = '1' and
281
         not(
282
          (v_WADDR_A*WDATA_WIDTH_A + WDATA_WIDTH_A -1) < (v_WADDR_B*WDATA_WIDTH_B)
283
                         or
284
          (v_WADDR_B*WDATA_WIDTH_B + WDATA_WIDTH_B -1) < (v_WADDR_A*WDATA_WIDTH_A)
285
         )
286
        ) then
287
      assert false
288
        report " Write collision! Writing in the same memory location using Port A and Port B will cause the memory content invalid."
289
        severity warning;
290
    end if;
291
 
292
  -- MEM Operation      
293
    if (WEA_node = '1') then
294
        v_MEM((v_WADDR_A*WDATA_WIDTH_A + WDATA_WIDTH_A -1) downto (v_WADDR_A*WDATA_WIDTH_A)) := WDA_node;
295
    end if;
296
 
297
    if (WEB_node = '1') then
298
        v_MEM((v_WADDR_B*WDATA_WIDTH_B + WDATA_WIDTH_B -1) downto (v_WADDR_B*WDATA_WIDTH_B)) := WDB_node;
299
    end if;
300
 
301
    if (REA_node = '1') then
302
       RDA_node <= v_MEM((v_RADDR_A*RDATA_WIDTH_A + RDATA_WIDTH_A -1) downto (v_RADDR_A*RDATA_WIDTH_A));
303
--    else
304
--       RDA_node <= ( others => 'X');
305
    end if;
306
 
307
    if (REB_node = '1') then
308
       RDB_node <= v_MEM((v_RADDR_B*RDATA_WIDTH_B + RDATA_WIDTH_B -1) downto (v_RADDR_B*RDATA_WIDTH_B));
309
--    else
310
--       RDB_node <= ( others => 'X');
311
    end if;
312
 
313
  end process KERNEL_BEHAV;
314
 
315
end LATTICE_BEHAV;
316
 
317
 
318
 
319
-- ************************************************************************
320
--
321
--  Block Memory: Behavioral Model
322
--  The kernel of other RAM applications  
323
-- ************************************************************************
324
--
325
--  Filename:  SC_BLOCK_RAM_L.vhd
326
--  Description: BRAM behavioral model. 
327
-- ************************************************************************
328
library std;
329
use std.textio.all;
330
 
331
library ieee, std;
332
use ieee.std_logic_1164.all;
333
use ieee.std_logic_unsigned.all;
334
use std.textio.all;
335
 
336
 
337
-- ************************************************************************
338
-- Entity definition  
339
-- "generic" members 
340
-- ************************************************************************
341
 
342
entity SC_BRAM_16K_L_SYNC is
343
 
344
  generic (
345
 
346
         WADDR_WIDTH_A : integer := 14;
347
         RADDR_WIDTH_A : integer := 12;
348
         WADDR_WIDTH_B : integer := 14;
349
         RADDR_WIDTH_B : integer := 12;
350
         WDATA_WIDTH_A : integer := 1;
351
         RDATA_WIDTH_A : integer := 4;
352
         WDATA_WIDTH_B : integer := 1;
353
         RDATA_WIDTH_B : integer := 4;
354
         ARRAY_SIZE    : integer := 262144;
355
         MEM_INIT_FLAG : integer := 0;
356
         MEM_INIT_FILE : string  := ""
357
 
358
          );
359
 
360
  port (
361
         WADA : in  STD_LOGIC_VECTOR (WADDR_WIDTH_A -1 downto 0);
362
         WEA  : in  STD_LOGIC ;
363
         WDA  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_A -1 downto 0);
364
         RADA : in  STD_LOGIC_VECTOR (RADDR_WIDTH_A -1 downto 0);
365
         REA  : in  STD_LOGIC ;
366
         RDA  : out STD_LOGIC_VECTOR (RDATA_WIDTH_A -1 downto 0);
367
 
368
         WADB : in  STD_LOGIC_VECTOR (WADDR_WIDTH_B -1 downto 0);
369
         WEB  : in  STD_LOGIC;
370
         WDB  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_B -1 downto 0);
371
         RADB : in  STD_LOGIC_VECTOR (RADDR_WIDTH_B -1 downto 0);
372
         REB  : in  STD_LOGIC;
373
         RDB  : out STD_LOGIC_VECTOR (RDATA_WIDTH_B -1 downto 0);
374
         WCLK : in  STD_LOGIC;
375
         RCLK : in  STD_LOGIC
376
        );
377
 
378
end SC_BRAM_16K_L_SYNC;
379
 
380
-- ************************************************************************
381
-- Architecture
382
-- ************************************************************************
383
 
384
architecture LATTICE_BEHAV of SC_BRAM_16K_L_SYNC is
385
 
386
procedure READ_MEM_INIT_FILE(
387
                              f_name : IN    STRING;
388
                              v_MEM  : OUT   STD_LOGIC_VECTOR
389
                             ) IS
390
 
391
    file     f_INIT_FILE   : TEXT is MEM_INIT_FILE;
392
    variable v_WORD        : line;
393
    variable v_GOODFLAG    : boolean;
394
    variable v_WORD_BIT    : string (WDATA_WIDTH_A downto 1) ;
395
    variable v_CHAR        : character;
396
    variable v_OFFSET      : integer := 0;
397
    variable v_LINE        : integer := 0;
398
 
399
    begin
400
 
401
      while ( not(endfile(f_INIT_FILE)) and (v_LINE < 2**WADDR_WIDTH_A)) loop
402
 
403
      readline(f_INIT_FILE, v_WORD);
404
      read(v_WORD, v_WORD_BIT, v_GOODFLAG);
405
 
406
      for k in 0 to WDATA_WIDTH_A - 1 loop
407
        v_CHAR := v_WORD_BIT (k + 1);
408
        if (v_CHAR = '1') then
409
          v_MEM(v_OFFSET + k) := '1';
410
 
411
        elsif (v_CHAR = '0') then
412
          v_MEM(v_OFFSET + k) := '0';
413
 
414
--      else 
415
--          v_MEM(v_OFFSET + k) := 'X';
416
 
417
        end if;
418
      end loop;
419
 
420
      v_LINE := v_LINE + 1;
421
      v_OFFSET := v_OFFSET + WDATA_WIDTH_A;
422
 
423
    end loop;
424
 
425
  end READ_MEM_INIT_FILE;
426
--------------------------------------------------------------------------
427
-- Function: Valid_Address 
428
-- Description: 
429
--------------------------------------------------------------------------
430
function Valid_Address (
431
    IN_ADDR : in std_logic_vector
432
 ) return boolean is
433
 
434
    variable v_Valid_Flag : boolean := TRUE;
435
 
436
begin
437
 
438
    for i in IN_ADDR'high downto IN_ADDR'low loop
439
        if (IN_ADDR(i) /= '0' and IN_ADDR(i) /= '1') then
440
            v_Valid_Flag := FALSE;
441
        end if;
442
    end loop;
443
 
444
    return v_Valid_Flag;
445
end Valid_Address;
446
 
447
--------------------------------------------------------------------------
448
-- Signal Declaration
449
--------------------------------------------------------------------------
450
 
451
--------- Local signals used to propagate input wire delay ---------------
452
 
453
signal WADA_node   : std_logic_vector( WADDR_WIDTH_A -1 downto 0) := (others => '0');
454
signal WEA_node    : std_logic := 'X';
455
signal WDA_node    : std_logic_vector( WDATA_WIDTH_A -1 downto 0) := (others => 'X');
456
signal RADA_node   : std_logic_vector( RADDR_WIDTH_A -1 downto 0) := (others => '0');
457
signal REA_node    : std_logic := 'X';
458
signal RDA_node    : std_logic_vector( RDATA_WIDTH_A -1 downto 0) := (others => 'X');
459
 
460
signal WADB_node   : std_logic_vector( WADDR_WIDTH_B -1 downto 0) := (others => '0');
461
signal WEB_node    : std_logic := 'X';
462
signal WDB_node    : std_logic_vector( WDATA_WIDTH_B -1 downto 0) := (others => 'X');
463
signal RADB_node   : std_logic_vector( RADDR_WIDTH_B -1 downto 0) := (others => '0');
464
signal REB_node    : std_logic := 'X';
465
signal RDB_node    : std_logic_vector( RDATA_WIDTH_B -1 downto 0) := (others => 'X');
466
signal WCLK_node   : std_logic := 'X';
467
signal RCLK_node   : std_logic := 'X';
468
-- architecture
469
begin
470
 
471
 WADA_node <= WADA;
472
 WEA_node  <= WEA;
473
 WDA_node  <= WDA;
474
 RADA_node <= RADA;
475
 REA_node  <= REA;
476
 RDA       <= RDA_node;
477
 
478
 WADB_node <= WADB;
479
 WEB_node  <= WEB;
480
 WDB_node  <= WDB;
481
 RADB_node <= RADB;
482
 REB_node  <= REB;
483
 RDB       <= RDB_node;
484
 
485
 WCLK_node <= WCLK;
486
 RCLK_node <= RCLK;
487
 
488
-----------------------------------------
489
--------- Behavior process  -------------
490
-----------------------------------------
491
 
492
 
493
  --KERNEL_BEHAV : process( WADA_node, WEA_node, WDA_node, RADA_node, REA_node, WADB_node, WEB_node, WDB_node, RADB_node, REB_node)
494
KERNEL_BEHAV : process( WCLK_node, RCLK_node)
495
 
496
--TSPEC: A note about sram initial values and rom mode: 
497
--       If the user does not provide any values, ... default 0 
498
--       for all ram locations in JECED
499
    variable v_MEM         : std_logic_vector(ARRAY_SIZE*WDATA_WIDTH_A - 1 downto 0) := ( others => '0' );
500
    variable v_INI_DONE    : boolean := FALSE;
501
    variable v_WADDR_A     : integer;
502
    variable v_RADDR_A     : integer;
503
    variable v_WADDR_B     : integer;
504
    variable v_RADDR_B     : integer;
505
 
506
    variable v_WADDRA_Valid_Flag : boolean := TRUE;
507
    variable v_WADDRB_Valid_Flag : boolean := TRUE;
508
    variable v_RADDRA_Valid_Flag : boolean := TRUE;
509
    variable v_RADDRB_Valid_Flag : boolean := TRUE;
510
 
511
  begin -- Process
512
 
513
    if( MEM_INIT_FLAG = 1 and v_INI_DONE = FALSE) THEN
514
        READ_MEM_INIT_FILE(MEM_INIT_FILE, v_MEM);
515
        v_INI_DONE := TRUE;
516
    end if;
517
 
518
  -- Address Check    
519
    v_WADDRA_Valid_Flag := Valid_Address(WADA_node);
520
    v_WADDRB_Valid_Flag := Valid_Address(WADB_node);
521
    v_RADDRA_Valid_Flag := Valid_Address(RADA_node);
522
    v_RADDRB_Valid_Flag := Valid_Address(RADB_node);
523
 
524
    if ( v_WADDRA_Valid_Flag = TRUE ) then
525
        v_WADDR_A := CONV_INTEGER(WADA_node);
526
--    else      
527
--      assert (Now = 0 ps) 
528
--        report "Write AddressA of Port contains invalid bit!"
529
--        severity warning;
530
    end if;
531
 
532
    if (v_WADDRB_Valid_Flag = TRUE ) then
533
      v_WADDR_B := CONV_INTEGER(WADB_node);
534
    else
535
--      assert (Now = 0 ps)
536
--        report "Write AddressB of Port contains invalid bit!"
537
--        severity warning;
538
    end if;
539
 
540
    if (v_RADDRA_Valid_Flag = TRUE ) then
541
      v_RADDR_A := CONV_INTEGER(RADA_node);
542
--    else
543
--      assert (Now = 0 ps)
544
--        report "Read AddressA of Port contains invalid bit!"
545
--        severity warning;
546
    end if;
547
 
548
    if (v_RADDRB_Valid_Flag = TRUE ) then
549
      v_RADDR_B := CONV_INTEGER(RADB_node);
550
--    else
551
--      assert (Now = 0 ps)
552
--        report "Read AddressB of Port contains invalid bit!"
553
--        severity warning;
554
    end if;
555
 
556
  -- CHECK Operation
557
    if (WEA = '1' and WEB = '1' and
558
         not(
559
          (v_WADDR_A*WDATA_WIDTH_A + WDATA_WIDTH_A -1) < (v_WADDR_B*WDATA_WIDTH_B)
560
                         or
561
          (v_WADDR_B*WDATA_WIDTH_B + WDATA_WIDTH_B -1) < (v_WADDR_A*WDATA_WIDTH_A)
562
         )
563
        ) then
564
      assert false
565
        report " Write collision! Writing in the same memory location using Port A and Port B will cause the memory content invalid."
566
        severity warning;
567
    end if;
568
 
569
  -- MEM Operation      
570
    if (WEA_node = '1' and WCLK_node'event and WCLK_node = '1' ) then
571
        v_MEM((v_WADDR_A*WDATA_WIDTH_A + WDATA_WIDTH_A -1) downto (v_WADDR_A*WDATA_WIDTH_A)) := WDA_node;
572
    end if;
573
 
574
    if (WEB_node = '1' and WCLK_node'event and WCLK_node = '1') then
575
        v_MEM((v_WADDR_B*WDATA_WIDTH_B + WDATA_WIDTH_B -1) downto (v_WADDR_B*WDATA_WIDTH_B)) := WDB_node;
576
    end if;
577
 
578
    if (REA_node = '1' and RCLK_node'event and RCLK_node = '1') then
579
       RDA_node <= v_MEM((v_RADDR_A*RDATA_WIDTH_A + RDATA_WIDTH_A -1) downto (v_RADDR_A*RDATA_WIDTH_A));
580
--    else
581
--       RDA_node <= ( others => 'X');
582
    end if;
583
 
584
    if (REB_node = '1' and RCLK_node'event and RCLK_node = '1') then
585
       RDB_node <= v_MEM((v_RADDR_B*RDATA_WIDTH_B + RDATA_WIDTH_B -1) downto (v_RADDR_B*RDATA_WIDTH_B));
586
--    else
587
--       RDB_node <= ( others => 'X');
588
    end if;
589
 
590
  end process KERNEL_BEHAV;
591
 
592
end LATTICE_BEHAV;
593
 
594
 
595
 
596
library std;
597
use std.textio.all;
598
 
599
library ieee, std;
600
use ieee.std_logic_1164.all;
601
use ieee.std_logic_unsigned.all;
602
use std.textio.all;
603
 
604
 
605
-- ************************************************************************
606
-- Entity definition  
607
-- "generic" members 
608
-- ************************************************************************
609
 
610
entity SC_BRAM_PDP_16K_L is
611
 
612
  generic (
613
         WADDR_WIDTH_A : integer := 14;
614
         RADDR_WIDTH_A : integer := 12;
615
         WADDR_WIDTH_B : integer := 14;
616
         RADDR_WIDTH_B : integer := 12;
617
         WDATA_WIDTH_A : integer := 1;
618
         RDATA_WIDTH_A : integer := 4;
619
         WDATA_WIDTH_B : integer := 1;
620
         RDATA_WIDTH_B : integer := 4;
621
         ARRAY_SIZE    : integer := 262144;
622
         MEM_INIT_FLAG : integer := 0;
623
         MEM_INIT_FILE : string  := ""
624
 
625
          );
626
 
627
  port (
628
         WADA : in  STD_LOGIC_VECTOR (WADDR_WIDTH_A -1 downto 0);
629
         WEA  : in  STD_LOGIC ;
630
         WDA  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_A -1 downto 0);
631
         RADA : in  STD_LOGIC_VECTOR (RADDR_WIDTH_A -1 downto 0);
632
         REA  : in  STD_LOGIC ;
633
         RDA  : out STD_LOGIC_VECTOR (RDATA_WIDTH_A -1 downto 0);
634
 
635
         WADB : in  STD_LOGIC_VECTOR (WADDR_WIDTH_B -1 downto 0);
636
         WEB  : in  STD_LOGIC;
637
         WDB  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_B -1 downto 0);
638
         RADB : in  STD_LOGIC_VECTOR (RADDR_WIDTH_B -1 downto 0);
639
         REB  : in  STD_LOGIC;
640
         RDB  : out STD_LOGIC_VECTOR (RDATA_WIDTH_B -1 downto 0)
641
        );
642
 
643
end SC_BRAM_PDP_16K_L;
644
 
645
-- ************************************************************************
646
-- Architecture
647
-- ************************************************************************
648
 
649
architecture LATTICE_BEHAV of SC_BRAM_PDP_16K_L is
650
 
651
procedure READ_MEM_INIT_FILE(
652
                              f_name : IN    STRING;
653
                              v_MEM  : OUT   STD_LOGIC_VECTOR
654
                             ) IS
655
 
656
    file     f_INIT_FILE   : TEXT is MEM_INIT_FILE;
657
    variable v_WORD        : line;
658
    variable v_GOODFLAG    : boolean;
659
    variable v_WORD_BIT    : string (WDATA_WIDTH_A downto 1) ;
660
    variable v_CHAR        : character;
661
    variable v_OFFSET      : integer := 0;
662
    variable v_LINE        : integer := 0;
663
 
664
    begin
665
 
666
      while ( not(endfile(f_INIT_FILE)) and (v_LINE < 2**WADDR_WIDTH_A)) loop
667
 
668
      readline(f_INIT_FILE, v_WORD);
669
      read(v_WORD, v_WORD_BIT, v_GOODFLAG);
670
 
671
      for k in 0 to WDATA_WIDTH_A - 1 loop
672
        v_CHAR := v_WORD_BIT (k + 1);
673
        if (v_CHAR = '1') then
674
          v_MEM(v_OFFSET + k) := '1';
675
 
676
        elsif (v_CHAR = '0') then
677
          v_MEM(v_OFFSET + k) := '0';
678
 
679
--      else 
680
--          v_MEM(v_OFFSET + k) := 'X';
681
 
682
        end if;
683
      end loop;
684
 
685
      v_LINE := v_LINE + 1;
686
      v_OFFSET := v_OFFSET + WDATA_WIDTH_A;
687
 
688
    end loop;
689
 
690
  end READ_MEM_INIT_FILE;
691
--------------------------------------------------------------------------
692
-- Function: Valid_Address 
693
-- Description: 
694
--------------------------------------------------------------------------
695
function Valid_Address (
696
    IN_ADDR : in std_logic_vector
697
 ) return boolean is
698
 
699
    variable v_Valid_Flag : boolean := TRUE;
700
 
701
begin
702
 
703
    for i in IN_ADDR'high downto IN_ADDR'low loop
704
        if (IN_ADDR(i) /= '0' and IN_ADDR(i) /= '1') then
705
            v_Valid_Flag := FALSE;
706
        end if;
707
    end loop;
708
 
709
    return v_Valid_Flag;
710
end Valid_Address;
711
 
712
--------------------------------------------------------------------------
713
-- Signal Declaration
714
--------------------------------------------------------------------------
715
 
716
--------- Local signals used to propagate input wire delay ---------------
717
 
718
signal WADA_node   : std_logic_vector( WADDR_WIDTH_A -1 downto 0) := (others => '0');
719
signal WEA_node    : std_logic := 'X';
720
signal WDA_node    : std_logic_vector( WDATA_WIDTH_A -1 downto 0) := (others => 'X');
721
signal RADA_node   : std_logic_vector( RADDR_WIDTH_A -1 downto 0) := (others => '0');
722
signal REA_node    : std_logic := 'X';
723
signal RDA_node    : std_logic_vector( RDATA_WIDTH_A -1 downto 0) := (others => 'X');
724
 
725
signal WADB_node   : std_logic_vector( WADDR_WIDTH_B -1 downto 0) := (others => '0');
726
signal WEB_node    : std_logic := 'X';
727
signal WDB_node    : std_logic_vector( WDATA_WIDTH_B -1 downto 0) := (others => 'X');
728
signal RADB_node   : std_logic_vector( RADDR_WIDTH_B -1 downto 0) := (others => '0');
729
signal REB_node    : std_logic := 'X';
730
signal RDB_node    : std_logic_vector( RDATA_WIDTH_B -1 downto 0) := (others => 'X');
731
 
732
-- architecture
733
begin
734
 
735
 WADA_node <= WADA;
736
 WEA_node  <= WEA;
737
 WDA_node  <= WDA;
738
 RADA_node <= RADA;
739
 REA_node  <= REA;
740
 RDA       <= RDA_node;
741
 
742
 WADB_node <= WADB;
743
 WEB_node  <= WEB;
744
 WDB_node  <= WDB;
745
 RADB_node <= RADB;
746
 REB_node  <= REB;
747
 RDB       <= RDB_node;
748
 
749
-----------------------------------------
750
--------- Behavior process  -------------
751
-----------------------------------------
752
 
753
  KERNEL_BEHAV : process( WADA_node, WEA_node, WDA_node, RADA_node, REA_node, WADB_node, WEB_node, WDB_node, RADB_node, REB_node)
754
 
755
 
756
--TSPEC: A note about sram initial values and rom mode: 
757
--       If the user does not provide any values, ... default 0 
758
--       for all ram locations in JECED
759
 
760
          variable v_MEM         : std_logic_vector(ARRAY_SIZE - 1 downto 0) := ( others => '0' );
761
 
762
    variable v_INI_DONE    : boolean := FALSE;
763
    variable v_WADDR_A     : integer;
764
    variable v_RADDR_A     : integer;
765
    variable v_WADDR_B     : integer;
766
    variable v_RADDR_B     : integer;
767
 
768
    variable v_WADDRA_Valid_Flag : boolean := TRUE;
769
    variable v_WADDRB_Valid_Flag : boolean := TRUE;
770
    variable v_RADDRA_Valid_Flag : boolean := TRUE;
771
    variable v_RADDRB_Valid_Flag : boolean := TRUE;
772
 
773
  begin -- Process
774
 
775
    if( MEM_INIT_FLAG = 1 and v_INI_DONE = FALSE) THEN
776
        READ_MEM_INIT_FILE(MEM_INIT_FILE, v_MEM);
777
        v_INI_DONE := TRUE;
778
    end if;
779
 
780
  -- Address Check    
781
    v_WADDRA_Valid_Flag := Valid_Address(WADA_node);
782
    v_WADDRB_Valid_Flag := Valid_Address(WADB_node);
783
    v_RADDRA_Valid_Flag := Valid_Address(RADA_node);
784
    v_RADDRB_Valid_Flag := Valid_Address(RADB_node);
785
 
786
    if ( v_WADDRA_Valid_Flag = TRUE ) then
787
        v_WADDR_A := CONV_INTEGER(WADA_node);
788
--    else      
789
--      assert (Now = 0 ps) 
790
--        report "Write AddressA of Port contains invalid bit!"
791
--        severity warning;
792
    end if;
793
 
794
    if (v_WADDRB_Valid_Flag = TRUE ) then
795
      v_WADDR_B := CONV_INTEGER(WADB_node);
796
--    else
797
--      assert (Now = 0 ps)
798
--        report "Write AddressB of Port contains invalid bit!"
799
--        severity warning;
800
    end if;
801
 
802
    if (v_RADDRA_Valid_Flag = TRUE ) then
803
      v_RADDR_A := CONV_INTEGER(RADA_node);
804
--    else
805
--      assert (Now = 0 ps)
806
--        report "Read AddressA of Port contains invalid bit!"
807
--        severity warning;
808
    end if;
809
 
810
    if (v_RADDRB_Valid_Flag = TRUE ) then
811
      v_RADDR_B := CONV_INTEGER(RADB_node);
812
--    else
813
--      assert (Now = 0 ps)
814
--        report "Read AddressB of Port contains invalid bit!"
815
--        severity warning;
816
    end if;
817
 
818
  -- CHECK Operation
819
    if (WEA = '1' and WEB = '1' and
820
         not(
821
          (v_WADDR_A*WDATA_WIDTH_A + WDATA_WIDTH_A -1) < (v_WADDR_B*WDATA_WIDTH_B)
822
                         or
823
          (v_WADDR_B*WDATA_WIDTH_B + WDATA_WIDTH_B -1) < (v_WADDR_A*WDATA_WIDTH_A)
824
         )
825
        ) then
826
      assert false
827
        report " Write collision! Writing in the same memory location using Port A and Port B will cause the memory content invalid."
828
        severity warning;
829
    end if;
830
 
831
  -- MEM Operation      
832
    if (WEA_node = '1') then
833
        v_MEM((v_WADDR_A*WDATA_WIDTH_A + WDATA_WIDTH_A -1) downto (v_WADDR_A*WDATA_WIDTH_A)) := WDA_node;
834
    end if;
835
 
836
    if (WEB_node = '1') then
837
        v_MEM((v_WADDR_B*WDATA_WIDTH_B + WDATA_WIDTH_B -1) downto (v_WADDR_B*WDATA_WIDTH_B)) := WDB_node;
838
    end if;
839
 
840
    if (REA_node = '1') then
841
       RDA_node <= v_MEM((v_RADDR_A*RDATA_WIDTH_A + RDATA_WIDTH_A -1) downto (v_RADDR_A*RDATA_WIDTH_A));
842
--    else
843
--       RDA_node <= ( others => 'X');
844
    end if;
845
 
846
    if (REB_node = '1') then
847
       RDB_node <= v_MEM((v_RADDR_B*RDATA_WIDTH_B + RDATA_WIDTH_B -1) downto (v_RADDR_B*RDATA_WIDTH_B));
848
--    else
849
--       RDB_node <= ( others => 'X');
850
    end if;
851
 
852
  end process KERNEL_BEHAV;
853
 
854
end LATTICE_BEHAV;
855
 
856
 
857
 
858
---*************  SC_FIFO_L **************************
859
library ieee;
860
use ieee.std_logic_1164.all;
861
--use ieee.std_logic_arith.all;
862
use ieee.std_logic_unsigned.all;
863
 
864
entity READ_POINTER_CTRL is
865
        generic (
866
              RPOINTER_WIDTH : integer := 9
867
                );
868
        port (
869
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(RPOINTER_WIDTH -1 downto 0);--QQ
870
                GLOBAL_RST   : in STD_LOGIC ;
871
                RESET_RP     : in STD_LOGIC ;
872
                READ_EN      : in STD_LOGIC ;
873
                READ_CLK     : in STD_LOGIC ;
874
                EMPTY_FLAG   : in STD_LOGIC ;
875
                READ_POINTER : out STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0)
876
             );
877
end READ_POINTER_CTRL;
878
 
879
architecture LATTICE_BEHAV of READ_POINTER_CTRL is
880
 
881
  signal s_READ_POINTER : STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0) := (others => '0');
882
 
883
begin
884
 
885
  READ_POINTER <= s_READ_POINTER;
886
 
887
process  (GLOBAL_RST, RESET_RP, READ_EN, READ_CLK)
888
 
889
        variable v_READ_POINTER: STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0):= (others => '0');
890
 
891
begin
892
 
893
        if GLOBAL_RST = '1'  or RESET_RP = '1' then
894
 
895
          s_READ_POINTER <= (others => '0');
896
 
897
        elsif (READ_CLK'EVENT and READ_CLK = '1') then
898
                if (READ_EN = '1' and EMPTY_FLAG = '1') then
899
                  v_READ_POINTER := s_READ_POINTER + '1';
900
                else
901
                  v_READ_POINTER := s_READ_POINTER;
902
                end if;
903
 
904
                if (v_READ_POINTER = TERMINAL_COUNT + 1) then
905
                   s_READ_POINTER <= (others => '0');
906
                else
907
                   s_READ_POINTER <= v_READ_POINTER;
908
                end if;
909
        end if;
910
 
911
end process;
912
end LATTICE_BEHAV;
913
 
914
-- ************************************************************************
915
-- FIFO COMPONENTS WRITE_POINTER_CTRL
916
-- ************************************************************************
917
library ieee;
918
use ieee.std_logic_1164.all;
919
--use IEEE.std_logic_arith.all;
920
use IEEE.std_logic_unsigned.all;
921
 
922
entity WRITE_POINTER_CTRL is
923
        generic (
924
                WPOINTER_WIDTH : integer := 9;
925
                WDATA_WIDTH : integer := 32
926
                );
927
        port (
928
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(WPOINTER_WIDTH -1 downto 0);--QQ
929
                GLOBAL_RST    : in STD_LOGIC ;
930
                WRITE_EN      : in STD_LOGIC ;
931
                WRITE_CLK     : in STD_LOGIC ;
932
                FULL_FLAG     : in STD_LOGIC ;
933
                WRITE_POINTER : out STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0)
934
 
935
             );
936
end WRITE_POINTER_CTRL;
937
 
938
architecture LATTICE_BEHAV of WRITE_POINTER_CTRL is
939
 
940
 signal s_WRITE_POINTER : STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0):= (others => '0');
941
 
942
begin
943
 
944
  WRITE_POINTER <= s_WRITE_POINTER;
945
 
946
  process  (GLOBAL_RST, WRITE_EN, WRITE_CLK)
947
 
948
    variable v_WRITE_POINTER: STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0):= (others => '0');
949
 
950
begin
951
        if GLOBAL_RST = '1'  then
952
                s_WRITE_POINTER <= (others => '0');
953
 
954
        elsif (WRITE_CLK'EVENT and WRITE_CLK = '1') then
955
                if (WRITE_EN = '1' and FULL_FLAG /= '1') then
956
                   v_WRITE_POINTER := s_WRITE_POINTER + '1';
957
                else
958
                   v_WRITE_POINTER := s_WRITE_POINTER ;
959
                end if;
960
 
961
                if (v_WRITE_POINTER = TERMINAL_COUNT + 1) then
962
                   s_WRITE_POINTER <= (others => '0');
963
                else
964
                   s_WRITE_POINTER <= v_WRITE_POINTER;
965
                end if;
966
        end if;
967
end process;
968
end LATTICE_BEHAV;
969
 
970
-- ************************************************************************
971
-- FIFO COMPONENTS FLAG LOGIC
972
-- ************************************************************************
973
library ieee;
974
use ieee.std_logic_1164.all;
975
--use IEEE.std_logic_arith.all;
976
use IEEE.std_logic_unsigned.all;
977
 
978
entity FLAG_LOGIC is
979
        generic (
980
                WPOINTER_WIDTH : integer := 9;
981
                RPOINTER_WIDTH : integer := 9;
982
                WDATA_WIDTH    : integer := 32;
983
                RDATA_WIDTH    : integer := 32;
984
                AMFULL_X      : integer := 1;
985
                AMEMPTY_Y     : integer := 1
986
                );
987
        port (
988
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(WPOINTER_WIDTH -1 downto 0) := (others => '0');--QQ
989
                R_POINTER  : in STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0) := (others => '0');
990
                W_POINTER  : in STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0) := (others => '0');
991
                GLOBAL_RST : in STD_LOGIC ;
992
                READ_EN    : in STD_LOGIC ;
993
                READ_CLK   : in STD_LOGIC ;
994
                WRITE_EN   : in STD_LOGIC ;
995
                WRITE_CLK  : in STD_LOGIC ;
996
                FULL_D     : out STD_LOGIC ;
997
                EMPTY_D    : out STD_LOGIC ;
998
                AMFULL_D   : out STD_LOGIC ;
999
                AMEMPTY_D  : out STD_LOGIC
1000
        );
1001
end FLAG_LOGIC;
1002
 
1003
architecture LATTICE_BEHAV of FLAG_LOGIC is
1004
--------------------------------------------------------------------------
1005
-- Function: Valid_Address 
1006
-- Description: 
1007
--------------------------------------------------------------------------
1008
function Valid_Pointer (
1009
    IN_ADDR : in STD_LOGIC_VECTOR
1010
 ) return BOOLEAN is
1011
 
1012
    variable v_Valid_Flag : BOOLEAN := TRUE;
1013
 
1014
begin
1015
 
1016
    for i in IN_ADDR'high downto IN_ADDR'low loop
1017
        if (IN_ADDR(i) /= '0' and IN_ADDR(i) /= '1') then
1018
            v_Valid_Flag := FALSE;
1019
        end if;
1020
    end loop;
1021
 
1022
    return v_Valid_Flag;
1023
end Valid_Pointer;
1024
 
1025
--------------------------------------------------------------------------
1026
-- Function: Calculate_Offset 
1027
-- Description: 
1028
--------------------------------------------------------------------------
1029
function Calculate_Offset (
1030
    IN_TC : in  STD_LOGIC_VECTOR;
1031
    TC_LENGTH: in INTEGER
1032
 ) return STD_LOGIC_VECTOR is
1033
 
1034
    variable vTC_FULL: STD_LOGIC_VECTOR (TC_LENGTH -1 downto 0) := (others => '1');
1035
    variable vTC_TEMP: STD_LOGIC_VECTOR (TC_LENGTH -1 downto 0) := (others => '0');
1036
    variable vOFFSET : STD_LOGIC_VECTOR (TC_LENGTH -1 downto 0) := (others => '0');
1037
begin
1038
    vTC_TEMP := IN_TC;
1039
    vOFFSET := vTC_FULL-vTC_TEMP;
1040
    return vOFFSET;
1041
end Calculate_Offset;
1042
 
1043
begin
1044
 
1045
--------------------------------------------------------------------------
1046
-- Function: Main Process 
1047
-- Description: 
1048
--------------------------------------------------------------------------
1049
FULL_AMFULL: process  (GLOBAL_RST, WRITE_EN, WRITE_CLK, W_POINTER, R_POINTER)
1050
    variable v_WP_Valid_Flag : boolean := TRUE;
1051
    variable v_RP_Valid_Flag : boolean := TRUE;
1052
    --variable v_WP_Check_FULL_TMP : STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0):= (others => '0'); --QQ
1053
    variable v_WP_Check_AMFL_TMP : STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0) := (others => '0'); --QQ
1054
    variable v_WP_Check_AMFL_TMP1 : STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0) := (others => '0'); --QQ
1055
    variable v_WP_Check_FULL : STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0) := (others => '0'); --QQ
1056
    variable v_WP_Check_AMFL : STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0) := (others => '0'); --QQ
1057
 
1058
begin
1059
        v_WP_Valid_Flag := Valid_Pointer(W_POINTER);
1060
        v_RP_Valid_Flag := Valid_Pointer(R_POINTER);
1061
        if( v_WP_Valid_Flag = TRUE) then
1062
             v_WP_Check_AMFL_TMP := W_POINTER + AMFULL_X + 1;
1063
        end if;
1064
 
1065
        v_WP_Check_AMFL_TMP1 := v_WP_Check_AMFL_TMP + Calculate_Offset(TERMINAL_COUNT, WPOINTER_WIDTH);
1066
 
1067
        if ( v_WP_Valid_Flag = TRUE and W_POINTER = TERMINAL_COUNT ) then
1068
            v_WP_Check_FULL := (others => '0');
1069
        elsif( v_WP_Valid_Flag = TRUE ) then
1070
            v_WP_Check_FULL := W_POINTER + 1;
1071
        end if;
1072
 
1073
        if GLOBAL_RST = '1'  then
1074
            FULL_D <= '0';
1075
            AMFULL_D <= '0';
1076
 
1077
        elsif( v_WP_Valid_Flag = TRUE and v_RP_Valid_Flag = TRUE) then
1078
 
1079
            if R_POINTER = v_WP_Check_FULL then
1080
             FULL_D <= '1';
1081
            else
1082
             FULL_D <= '0';
1083
            end if;
1084
 
1085
            if (W_POINTER > R_POINTER) then
1086
              if (v_WP_Check_AMFL_TMP1 < W_POINTER) then
1087
                if v_WP_Check_AMFL_TMP1 >= R_POINTER then
1088
                 AMFULL_D <= '1';
1089
                else
1090
                 AMFULL_D <= '0';
1091
                end if;
1092
              else
1093
                 AMFULL_D <= '0';
1094
              end if;
1095
            elsif (W_POINTER < R_POINTER) then
1096
              if (v_WP_Check_AMFL_TMP1 < W_POINTER) then
1097
                 AMFULL_D <= '1';
1098
              elsif (v_WP_Check_AMFL_TMP >= R_POINTER) then
1099
                 AMFULL_D <= '1';
1100
              else
1101
                 AMFULL_D <= '0';
1102
              end if;
1103
            end if;
1104
 
1105
        end if;
1106
 
1107
end process FULL_AMFULL;
1108
 
1109
EMPTY_AMEMPTY: process  (GLOBAL_RST, READ_EN, READ_CLK, W_POINTER, R_POINTER)
1110
    variable v_WP_Valid_Flag : boolean := TRUE;
1111
    variable v_RP_Valid_Flag : boolean := TRUE;
1112
    variable v_RP_Check_EMPT_TMP : STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0):= (others => '0'); --QQ
1113
    variable v_RP_Check_AMET_TMP : STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0):= (others => '0'); --QQ
1114
    variable v_RP_Check_AMET_TMP1 : STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0):= (others => '0'); --QQ
1115
    --variable v_RP_Check_EMPT : STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0):= (others => '0'); --QQ
1116
    variable v_RP_Check_AMET : STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0):= (others => '0'); --QQ
1117
 
1118
begin
1119
        v_WP_Valid_Flag := Valid_Pointer(W_POINTER);
1120
        v_RP_Valid_Flag := Valid_Pointer(R_POINTER);
1121
        if( v_RP_Valid_Flag = TRUE and v_WP_Valid_Flag = TRUE) then
1122
            v_RP_Check_AMET_TMP := R_POINTER + AMEMPTY_Y ; -- Different from TSPEC QQ 07 17,2002
1123
        end if;
1124
        v_RP_Check_AMET_TMP1 := v_RP_Check_AMET_TMP + Calculate_Offset(TERMINAL_COUNT, RPOINTER_WIDTH);
1125
 
1126
        if GLOBAL_RST = '1'  then
1127
          EMPTY_D <= '0';
1128
          AMEMPTY_D <= '0';
1129
        elsif( v_WP_Valid_Flag = TRUE and v_RP_Valid_Flag = TRUE) then
1130
            if R_POINTER  = W_POINTER then   -- Different from TSPEC QQ 07 17,2002
1131
                    EMPTY_D <= '0';
1132
            else
1133
                    EMPTY_D <= '1';
1134
            end if;
1135
 
1136
 
1137
            if (W_POINTER < R_POINTER) then
1138
              if (v_RP_Check_AMET_TMP1 < R_POINTER) then
1139
                  v_RP_Check_AMET := v_RP_Check_AMET_TMP + Calculate_Offset(TERMINAL_COUNT, RPOINTER_WIDTH);
1140
                if v_RP_Check_AMET >= W_POINTER then
1141
                 AMEMPTY_D <= '0';
1142
                else
1143
                 AMEMPTY_D <= '1';
1144
                end if;
1145
              else
1146
                 AMEMPTY_D <= '1';
1147
              end if;
1148
            elsif (W_POINTER > R_POINTER) then
1149
              if (v_RP_Check_AMET_TMP1 < R_POINTER) then
1150
                 AMEMPTY_D <= '0';
1151
              elsif (v_RP_Check_AMET_TMP >= W_POINTER) then
1152
                 AMEMPTY_D <= '0';
1153
              else
1154
                 AMEMPTY_D <= '1';
1155
              end if;
1156
            elsif (W_POINTER = R_POINTER) then
1157
              AMEMPTY_D <= '0';
1158
            end if;
1159
       end if;
1160
end process EMPTY_AMEMPTY;
1161
 
1162
end LATTICE_BEHAV;
1163
 
1164
LIBRARY ieee;
1165
USE ieee.std_logic_1164.ALL;
1166
---USE ieee.std_logic_arith.ALL;
1167
USE ieee.std_logic_unsigned.ALL;
1168
 
1169
--LIBRARY SC_LIB;
1170
--USE SC_LIB.SC_FIFO_COMPS.ALL;
1171
 
1172
entity SC_FIFO_16K_L is
1173
  generic (
1174
        TERMINAL_COUNT : integer := 511; --QQ: Word number < 2**WADDR_WIDTH
1175
        WADDR_WIDTH    : integer :=   9;
1176
        WDATA_WIDTH    : integer :=  32;
1177
        RADDR_WIDTH    : integer :=   9;
1178
        RDATA_WIDTH    : integer :=  32;
1179
        ALMOST_FULL_X  : integer :=   1;
1180
        ALMOST_EMPTY_Y : integer :=   1;
1181
        MEM_INIT_FLAG  : integer :=   0;
1182
        MEM_INIT_FILE  : string  := "mem_init_file"
1183
 
1184
         );
1185
 
1186
  port (
1187
        WE      : in STD_LOGIC ;
1188
        WCLK    : in STD_LOGIC ;
1189
        RST     : in STD_LOGIC ;
1190
        RPRST   : in STD_LOGIC ;
1191
        RE      : in STD_LOGIC ;
1192
        RCLK    : in STD_LOGIC ;
1193
        FULLIN  : in STD_LOGIC ;
1194
        EMPTYIN : in STD_LOGIC ;
1195
        DI      : in STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0);
1196
 
1197
        FULL    : out STD_LOGIC ;
1198
        EMPTY   : out STD_LOGIC ;
1199
        AMFULL  : out STD_LOGIC ;
1200
        AMEMPTY : out STD_LOGIC ;
1201
        DO      : out STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0)
1202
 
1203
        );
1204
 
1205
end SC_FIFO_16K_L;
1206
 
1207
-- ************************************************************************
1208
-- architecture
1209
-- ************************************************************************
1210
 
1211
architecture LATTICE_BEHAV of SC_FIFO_16K_L is
1212
 
1213
---------------------------------------------------------
1214
-- Function: TO_STD_VECTOR
1215
---------------------------------------------------------
1216
 function TO_STD_VECTOR ( INPUT_STRING : string; INPUT_LENGTH: integer)
1217
 return std_logic_vector is
1218
 
1219
   variable vDATA_STD_VEC: std_logic_vector(INPUT_LENGTH -1 downto 0) := (others => '0');
1220
   variable vTRANS: string(INPUT_LENGTH downto 1) := (others => '0');
1221
 
1222
 begin
1223
    vTRANS := INPUT_STRING;
1224
 
1225
    for i in INPUT_LENGTH downto 1 loop
1226
      if (vTRANS(i) = '1') then
1227
        vDATA_STD_VEC(i-1) := '1';
1228
      elsif ( vTRANS(i) ='0') then
1229
        vDATA_STD_VEC(i-1) := '0';
1230
      end if;
1231
    end loop;
1232
  return vDATA_STD_VEC;
1233
 end TO_STD_VECTOR;
1234
 
1235
---------------------------------------------------------
1236
-- Function: INT_TO_VEC
1237
---------------------------------------------------------
1238
 function INT_TO_VEC ( INPUT_INT : integer; INPUT_LENGTH: integer)
1239
 return std_logic_vector is
1240
 
1241
   variable vDATA_STD_VEC: std_logic_vector(INPUT_LENGTH -1 downto 0) := (others => '0');
1242
   variable vTRANS: integer := 0;
1243
   variable vQUOTIENT: integer := 0;
1244
 
1245
 begin
1246
    vQUOTIENT := INPUT_INT;
1247
 
1248
    for i in 0 to INPUT_LENGTH -1 loop
1249
        vTRANS := 0;
1250
        while vQUOTIENT >1 loop
1251
            vQUOTIENT := vQUOTIENT - 2;
1252
            vTRANS := vTRANS + 1;
1253
        end loop;
1254
        case vQUOTIENT is
1255
              when 1 =>
1256
                 vDATA_STD_VEC(i) := '1';
1257
              when 0 =>
1258
                 vDATA_STD_VEC(i) := '0';
1259
              when others =>
1260
                 null;
1261
        end case;
1262
        vQUOTIENT := vTRANS;
1263
    end loop;
1264
  return vDATA_STD_VEC;
1265
 end INT_TO_VEC;
1266
---------------------------------------------------------
1267
-- Components Definition
1268
---------------------------------------------------------
1269
 
1270
component SC_BRAM_16K_L_SYNC
1271
 
1272
  generic (
1273
         WADDR_WIDTH_A : integer := 14;
1274
         RADDR_WIDTH_A : integer := 12;
1275
         WADDR_WIDTH_B : integer := 14;
1276
         RADDR_WIDTH_B : integer := 12;
1277
         WDATA_WIDTH_A : integer := 1;
1278
         RDATA_WIDTH_A : integer := 4;
1279
         WDATA_WIDTH_B : integer := 1;
1280
         RDATA_WIDTH_B : integer := 4;
1281
         ARRAY_SIZE    : integer := 16384;
1282
         MEM_INIT_FLAG : integer := 0;
1283
         MEM_INIT_FILE : string  := "mem_init_file"
1284
 
1285
          );
1286
 
1287
  port (
1288
         WADA : in  STD_LOGIC_VECTOR (WADDR_WIDTH_A -1 downto 0);
1289
         WEA  : in  STD_LOGIC ;
1290
         WDA  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_A -1 downto 0);
1291
         RADA : in  STD_LOGIC_VECTOR (RADDR_WIDTH_A -1 downto 0);
1292
         REA  : in  STD_LOGIC ;
1293
         RDA  : out STD_LOGIC_VECTOR (RDATA_WIDTH_A -1 downto 0);
1294
 
1295
         WADB : in  STD_LOGIC_VECTOR (WADDR_WIDTH_B -1 downto 0);
1296
         WEB  : in  STD_LOGIC;
1297
         WDB  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_B -1 downto 0);
1298
         RADB : in  STD_LOGIC_VECTOR (RADDR_WIDTH_B -1 downto 0);
1299
         REB  : in  STD_LOGIC;
1300
         RDB  : out STD_LOGIC_VECTOR (RDATA_WIDTH_B -1 downto 0);
1301
         WCLK : in  STD_LOGIC;
1302
         RCLK : in  STD_LOGIC
1303
        );
1304
 end component;
1305
 
1306
 component READ_POINTER_CTRL
1307
 
1308
        generic (
1309
                RPOINTER_WIDTH : integer := 9
1310
                );
1311
        port (
1312
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(RPOINTER_WIDTH -1 downto 0);--QQ
1313
                GLOBAL_RST   : in STD_LOGIC ;
1314
                RESET_RP     : in STD_LOGIC ;
1315
                READ_EN      : in STD_LOGIC ;
1316
                READ_CLK     : in STD_LOGIC ;
1317
                EMPTY_FLAG   : in STD_LOGIC ;
1318
                READ_POINTER : out STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0)
1319
             );
1320
 end component;
1321
 
1322
 component WRITE_POINTER_CTRL
1323
        generic (
1324
                WPOINTER_WIDTH : integer := 9;
1325
                WDATA_WIDTH : integer := 32
1326
                );
1327
        port (
1328
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(WPOINTER_WIDTH -1 downto 0);--QQ
1329
                GLOBAL_RST    : in STD_LOGIC ;
1330
                WRITE_EN      : in STD_LOGIC ;
1331
                WRITE_CLK     : in STD_LOGIC ;
1332
                FULL_FLAG    : in STD_LOGIC ;
1333
                WRITE_POINTER : out STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0)
1334
                );
1335
 end component;
1336
 
1337
 component FLAG_LOGIC
1338
        generic (
1339
                WPOINTER_WIDTH : integer := 9;
1340
                RPOINTER_WIDTH : integer := 9;
1341
                WDATA_WIDTH    : integer := 32;
1342
                RDATA_WIDTH    : integer := 32;
1343
                AMFULL_X      : integer := 1;
1344
                AMEMPTY_Y     : integer := 1
1345
                );
1346
        port (
1347
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(WPOINTER_WIDTH -1 downto 0);--QQ
1348
                R_POINTER  : in STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0);
1349
                W_POINTER  : in STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0);
1350
                GLOBAL_RST : in STD_LOGIC ;
1351
                READ_EN    : in STD_LOGIC ;
1352
                READ_CLK   : in STD_LOGIC ;
1353
                WRITE_EN   : in STD_LOGIC ;
1354
                WRITE_CLK  : in STD_LOGIC ;
1355
                FULL_D     : out STD_LOGIC ;
1356
                EMPTY_D    : out STD_LOGIC ;
1357
                AMFULL_D   : out STD_LOGIC ;
1358
                AMEMPTY_D  : out STD_LOGIC
1359
        );
1360
 end component;
1361
 -- Signal Declaration
1362
 
1363
 signal WE_node      :  STD_LOGIC := '0';
1364
 signal WCLK_node    :  STD_LOGIC := '0';
1365
 signal RST_node     :  STD_LOGIC := '0';
1366
 signal RPRST_node   :  STD_LOGIC := '0';
1367
 signal RE_node      :  STD_LOGIC := '0';
1368
 signal RCLK_node    :  STD_LOGIC := '0';
1369
 signal FULLIN_node  :  STD_LOGIC := '0';
1370
 signal EMPTYIN_node :  STD_LOGIC := '0';
1371
 signal DI_node      :  STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0) := (others => '0');
1372
 
1373
 signal DI_reg       :  STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0) := (others => '0');
1374
 signal FULLIN_reg   :  STD_LOGIC := '0';
1375
 signal EMPTYIN_reg  :  STD_LOGIC := '0';
1376
 
1377
 signal FULL_node    :  STD_LOGIC := '0';
1378
 signal EMPTY_node   :  STD_LOGIC := '0';
1379
 signal AMFULL_node  :  STD_LOGIC := '0';
1380
 signal AMEMPTY_node :  STD_LOGIC := '0';
1381
 signal DO_node      :  STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0) := (others => '0');
1382
 
1383
 signal TC_node      :  STD_LOGIC_VECTOR (WADDR_WIDTH -1 downto 0) := (others => '0');
1384
 
1385
 signal FULL_reg     :  STD_LOGIC := '0';
1386
 signal EMPTY_reg    :  STD_LOGIC := '0';
1387
 signal AMFULL_reg   :  STD_LOGIC := '0';
1388
 signal AMEMPTY_reg  :  STD_LOGIC := '0';
1389
 
1390
 signal RP_node      :  STD_LOGIC_VECTOR (RADDR_WIDTH -1 downto 0)  := (others => '0');
1391
 signal WP_node      :  STD_LOGIC_VECTOR (WADDR_WIDTH -1 downto 0)  := (others => '0');
1392
 
1393
 signal GND_sig      :  STD_LOGIC := '0';
1394
-- architecture
1395
 
1396
 begin
1397
 
1398
  GND_sig      <= '0';
1399
  WE_node      <= WE and not(FULL_node);
1400
  WCLK_node    <= WCLK;
1401
  RST_node     <= RST;
1402
  RPRST_node   <= RPRST;
1403
  RE_node      <= RE and EMPTY_node;
1404
  RCLK_node    <= RCLK;
1405
  FULLIN_node  <= FULLIN;
1406
  EMPTYIN_node <= EMPTYIN;
1407
  DI_node      <= DI;
1408
  --TC_node      <= TO_STD_VECTOR(TERMINAL_COUNT,WADDR_WIDTH);
1409
  TC_node      <= INT_TO_VEC(TERMINAL_COUNT,WADDR_WIDTH);
1410
 
1411
  --FULL    <= FULL_node;
1412
  FULL    <= FULL_node when (RE_node = '0') else FULL_reg;
1413
  --AMFULL  <= AMFULL_node;
1414
  AMFULL  <= AMFULL_node when (RE_node = '0') else AMFULL_reg;
1415
  EMPTY   <= not EMPTY_node;
1416
  AMEMPTY <= not AMEMPTY_node;
1417
 
1418
  DO <= DO_node;
1419
 
1420
-- Register Port DI inputs
1421
  register_DI_inputs: process (RST_node, WCLK_node)
1422
  begin
1423
    if (RST_node = '1') then
1424
      DI_reg <= (others =>'0');
1425
    elsif (WCLK_node'event and WCLK_node = '1') then
1426
      if (WE_node = '1') then
1427
        DI_reg <= DI_node after 1 ps;
1428
      end if;
1429
    end if;
1430
  end process register_DI_inputs;
1431
 
1432
-- Register flag inputs
1433
  register_flag_inputs: process (RST_node, WCLK_node, RCLK_node)
1434
  begin
1435
    if (RST_node = '1') then
1436
      FULLIN_reg  <= '0';
1437
      EMPTYIN_reg <= '0';
1438
    else
1439
 
1440
      if (WCLK_node'event and WCLK_node = '1') then
1441
      --   WE_reg <= WE_node and not (FULL_reg);  --QQ
1442
        if (WE_node = '1') then
1443
          FULLIN_reg <= FULLIN_node;
1444
        end if;
1445
      end if;
1446
 
1447
      if (RCLK_node'event and RCLK_node = '1') then
1448
       --  RE_reg <= RE_node and EMPTY_reg;  --QQ
1449
        if (RE_node = '1') then
1450
          EMPTYIN_reg <= EMPTYIN_node;
1451
        end if;
1452
      end if;
1453
 
1454
    end if;
1455
  end process register_flag_inputs;
1456
 
1457
-- Register flag outputs
1458
  register_flag_outputs: process (RST_node, WCLK_node, RCLK_node)
1459
  begin
1460
    if (RST_node = '1') then
1461
      FULL_node    <= '0';
1462
      AMFULL_node  <= '0';
1463
      EMPTY_node   <= '0';
1464
      AMEMPTY_node <= '0';
1465
    else
1466
      if (WCLK_node'event and WCLK_node = '1') then
1467
        FULL_node <= FULL_reg;
1468
        AMFULL_node <= AMFULL_reg;
1469
      end if;
1470
      if (RCLK_node'event and RCLK_node = '1') then
1471
        EMPTY_node <= EMPTY_reg;
1472
        AMEMPTY_node <= AMEMPTY_reg;
1473
      end if;
1474
    end if;
1475
  end process register_flag_outputs;
1476
 
1477
-- READ_POINTER_CTRL instance for FIFO
1478
  FIFO_RPC_INST: READ_POINTER_CTRL
1479
        generic map (
1480
                RPOINTER_WIDTH => RADDR_WIDTH
1481
                )
1482
        port map (
1483
                TERMINAL_COUNT => TC_node,
1484
                GLOBAL_RST   => RST_node,
1485
                RESET_RP     => RPRST_node,
1486
                READ_EN      => RE_node,
1487
                READ_CLK     => RCLK_node,
1488
                EMPTY_FLAG   => EMPTY_reg,
1489
                READ_POINTER => RP_node
1490
             );
1491
 
1492
-- WRITE_POINTER_CTRL instance for FIFO
1493
  FIFO_WPC_INST: WRITE_POINTER_CTRL
1494
        generic map (
1495
                WPOINTER_WIDTH => WADDR_WIDTH,
1496
                WDATA_WIDTH    => WDATA_WIDTH
1497
                )
1498
        port map (
1499
                TERMINAL_COUNT => TC_node,
1500
                GLOBAL_RST     => RST_node,
1501
                WRITE_EN       => WE_node,
1502
                WRITE_CLK      => WCLK_node,
1503
                FULL_FLAG      => FULL_reg,
1504
                WRITE_POINTER  => WP_node
1505
                );
1506
 
1507
-- FLAG_LOGIC instance for FIFO
1508
  FIFO_FL_INST: FLAG_LOGIC
1509
           generic map (
1510
                WPOINTER_WIDTH => WADDR_WIDTH,
1511
                RPOINTER_WIDTH => RADDR_WIDTH,
1512
                WDATA_WIDTH    => WDATA_WIDTH,
1513
                RDATA_WIDTH    => RDATA_WIDTH,
1514
                AMFULL_X       => ALMOST_FULL_X,
1515
                AMEMPTY_Y      => ALMOST_EMPTY_Y
1516
                )
1517
           port map(
1518
                TERMINAL_COUNT => TC_node,
1519
                R_POINTER     => RP_node,
1520
                W_POINTER     => WP_node,
1521
                GLOBAL_RST    => RST_node,
1522
                READ_EN       => RE_node,
1523
                READ_CLK      => RCLK_node,
1524
                WRITE_EN      => WE_node,
1525
                WRITE_CLK     => WCLK_node,
1526
                FULL_D        => FULL_reg,
1527
                EMPTY_D       => EMPTY_reg,
1528
                AMFULL_D      => AMFULL_reg,
1529
                AMEMPTY_D     => AMEMPTY_reg
1530
        );
1531
 
1532
-- BRAM instance for FIFO 
1533
  FIFO_BRAM_INST: SC_BRAM_16K_L_SYNC
1534
 
1535
    generic map(
1536
         WADDR_WIDTH_A  => WADDR_WIDTH,
1537
         RADDR_WIDTH_A  => RADDR_WIDTH,
1538
         WADDR_WIDTH_B  => WADDR_WIDTH,
1539
         RADDR_WIDTH_B  => RADDR_WIDTH,
1540
         WDATA_WIDTH_A  => WDATA_WIDTH,
1541
         RDATA_WIDTH_A  => RDATA_WIDTH,
1542
         WDATA_WIDTH_B  => WDATA_WIDTH,
1543
         RDATA_WIDTH_B  => RDATA_WIDTH,
1544
         ARRAY_SIZE     => open,
1545
         MEM_INIT_FLAG  => MEM_INIT_FLAG,
1546
         MEM_INIT_FILE  => MEM_INIT_FILE
1547
 
1548
       )
1549
    port map (
1550
         WADA => WP_node,
1551
         WEA  => WE_node,
1552
         WDA  => DI_node,
1553
         RADA => RP_node,
1554
         REA  => RE_node,
1555
         RDA  => DO_node,
1556
 
1557
         WADB => WP_node,
1558
         WEB  => GND_sig,
1559
         WDB  => DI_node,
1560
         RADB => RP_node,
1561
         REB  => GND_sig,
1562
         RDB  => open,
1563
         WCLK => WCLK_node,
1564
         RCLK => RCLK_node
1565
      );
1566
 
1567
end LATTICE_BEHAV;
1568
 
1569
-- ************************************************************************
1570
--
1571
--  FIFO V2: Behavioral Model
1572
-- ************************************************************************
1573
--
1574
--  Filename:  SC_FIFO_V2.vhd
1575
--  Description: FIFO behavioral model. 
1576
 
1577
-- ************************************************************************
1578
-- FIFO COMPONENTS READ_POINTER_CTRL_V2
1579
-- ************************************************************************
1580
library ieee;
1581
use ieee.std_logic_1164.all;
1582
use ieee.std_logic_arith.all;
1583
use ieee.std_logic_unsigned.all;
1584
 
1585
entity READ_POINTER_CTRL_V2 is
1586
        generic (
1587
              RPOINTER_WIDTH : integer := 9
1588
                );
1589
        port (
1590
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(RPOINTER_WIDTH -1 downto 0);--QQ
1591
                GLOBAL_RST   : in STD_LOGIC ;
1592
                RESET_RP     : in STD_LOGIC ;
1593
                READ_EN      : in STD_LOGIC ;
1594
                READ_CLK     : in STD_LOGIC ;
1595
                EMPTY_FLAG   : in STD_LOGIC ;
1596
                READ_POINTER : out STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0)
1597
             );
1598
end READ_POINTER_CTRL_V2;
1599
 
1600
architecture LATTICE_BEHAV of READ_POINTER_CTRL_V2 is
1601
 
1602
  signal s_READ_POINTER : STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0) := (others => '0');
1603
 
1604
begin
1605
 
1606
  READ_POINTER <= s_READ_POINTER;
1607
 
1608
process  (GLOBAL_RST, RESET_RP, READ_EN, READ_CLK)
1609
 
1610
        variable v_READ_POINTER: STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0):= (others => '0');
1611
 
1612
begin
1613
 
1614
        if GLOBAL_RST = '1'  or RESET_RP = '1' then
1615
 
1616
        s_READ_POINTER <= TERMINAL_COUNT;
1617
 
1618
        elsif (READ_CLK'EVENT and READ_CLK = '1') then
1619
                if (READ_EN = '1' and EMPTY_FLAG = '1') then
1620
                  v_READ_POINTER := s_READ_POINTER + '1';
1621
 
1622
                else
1623
                  v_READ_POINTER := s_READ_POINTER;
1624
                end if;
1625
 
1626
                if (v_READ_POINTER = TERMINAL_COUNT + 1) then
1627
                   s_READ_POINTER <= (others => '0');
1628
                else
1629
                   s_READ_POINTER <= v_READ_POINTER;
1630
                end if;
1631
        end if;
1632
 
1633
end process;
1634
end LATTICE_BEHAV;
1635
 
1636
-- ************************************************************************
1637
-- FIFO COMPONENTS WRITE_POINTER_CTRL_V2
1638
-- ************************************************************************
1639
library ieee;
1640
use ieee.std_logic_1164.all;
1641
use IEEE.std_logic_arith.all;
1642
use IEEE.std_logic_unsigned.all;
1643
 
1644
entity WRITE_POINTER_CTRL_V2 is
1645
        generic (
1646
                WPOINTER_WIDTH : integer := 9;
1647
                WDATA_WIDTH : integer := 32
1648
                );
1649
        port (
1650
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(WPOINTER_WIDTH -1 downto 0);--QQ
1651
                GLOBAL_RST    : in STD_LOGIC ;
1652
                WRITE_EN      : in STD_LOGIC ;
1653
                WRITE_CLK     : in STD_LOGIC ;
1654
                FULL_FLAG     : in STD_LOGIC ;
1655
                WRITE_POINTER : out STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0)
1656
 
1657
             );
1658
end WRITE_POINTER_CTRL_V2;
1659
 
1660
architecture LATTICE_BEHAV of WRITE_POINTER_CTRL_V2 is
1661
 
1662
 signal s_WRITE_POINTER : STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0):= (others => '0');
1663
 
1664
begin
1665
 
1666
  WRITE_POINTER <= s_WRITE_POINTER;
1667
 
1668
  process  (GLOBAL_RST, WRITE_EN, WRITE_CLK)
1669
 
1670
    variable v_WRITE_POINTER: STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0):= (others => '0');
1671
 
1672
begin
1673
        if GLOBAL_RST = '1'  then
1674
                s_WRITE_POINTER <= TERMINAL_COUNT ;
1675
 
1676
        elsif (WRITE_CLK'EVENT and WRITE_CLK = '1') then
1677
                if (WRITE_EN = '1' and FULL_FLAG /= '1') then
1678
                   v_WRITE_POINTER := s_WRITE_POINTER + '1';
1679
                else
1680
                   v_WRITE_POINTER := s_WRITE_POINTER ;
1681
                end if;
1682
 
1683
                if (v_WRITE_POINTER = TERMINAL_COUNT + 1) then
1684
                   s_WRITE_POINTER <= (others => '0');
1685
                else
1686
                   s_WRITE_POINTER <= v_WRITE_POINTER ;
1687
                end if;
1688
        end if;
1689
end process;
1690
end LATTICE_BEHAV;
1691
 
1692
-- ************************************************************************
1693
-- FIFO V2 COMPONENTS FLAG LOGIC
1694
-- ************************************************************************
1695
library ieee;
1696
use ieee.std_logic_1164.all;
1697
use ieee.std_logic_arith.all;
1698
use ieee.std_logic_unsigned.all;
1699
use ieee.math_real.all;
1700
 
1701
entity FLAG_LOGIC_V2 is
1702
        generic (
1703
                WDATA_WIDTH    : integer := 32;
1704
                RDATA_WIDTH    : integer := 32;
1705
                AMFULL_X      : integer := 1;
1706
                AMEMPTY_Y     : integer := 1
1707
                );
1708
        port (
1709
                GLOBAL_RST : in STD_LOGIC ;
1710
                FIFO_CAP   : in integer ;
1711
                FIFO_PTR   : in integer ;
1712
                FULL_D     : out STD_LOGIC ;
1713
                EMPTY_D    : out STD_LOGIC ;
1714
                AMFULL_D   : out STD_LOGIC ;
1715
                AMEMPTY_D  : out STD_LOGIC
1716
        );
1717
end FLAG_LOGIC_V2;
1718
 
1719
architecture LATTICE_BEHAV of FLAG_LOGIC_V2 is
1720
 
1721
begin
1722
--------------------------------------------------------------------------
1723
-- Function: Main Process 
1724
-- Description: 
1725
--------------------------------------------------------------------------
1726
FULL_AMFULL_EMPTY_AMEMPTY: process  (GLOBAL_RST, FIFO_CAP, FIFO_PTR)
1727
 
1728
begin
1729
 
1730
        if GLOBAL_RST = '1'  then
1731
            FULL_D    <= '0';
1732
            AMFULL_D  <= '0';
1733
            EMPTY_D   <= '0';
1734
            AMEMPTY_D <= '0';
1735
        else
1736
                if (FIFO_CAP - FIFO_PTR < WDATA_WIDTH) then
1737
                     FULL_D <= '1';
1738
                else
1739
                     FULL_D <= '0';
1740
                end if;
1741
 
1742
                if (FIFO_CAP - FIFO_PTR < WDATA_WIDTH + AMFULL_X * WDATA_WIDTH) then
1743
                     AMFULL_D <= '1';
1744
                else
1745
                     AMFULL_D <= '0';
1746
                end if;
1747
 
1748
                if (FIFO_PTR < RDATA_WIDTH) then
1749
                     EMPTY_D <= '0';
1750
                else
1751
                     EMPTY_D <= '1';
1752
                end if;
1753
 
1754
                if (FIFO_PTR < RDATA_WIDTH + AMEMPTY_Y * RDATA_WIDTH) then
1755
                     AMEMPTY_D <= '0';
1756
                else
1757
                     AMEMPTY_D <= '1';
1758
                end if;
1759
        end if;
1760
 
1761
end process FULL_AMFULL_EMPTY_AMEMPTY;
1762
 
1763
end LATTICE_BEHAV;
1764
 
1765
 
1766
-- ************************************************************************
1767
-- FIFO V2 Main Body 
1768
-- READ_POINTER_CTRL_V2
1769
-- WRITE_POINTER_CTRL_V2
1770
-- FLAG_LOGIC_V2 
1771
-- SC_BRAM_16K
1772
-- ************************************************************************
1773
-- ************************************************************************
1774
-- Top Design Entity definition  
1775
-- ************************************************************************
1776
 
1777
library ieee;
1778
use ieee.std_logic_1164.all;
1779
use ieee.std_logic_arith.all;
1780
use ieee.std_logic_unsigned.all;
1781
 
1782
entity SC_FIFO_V2_16K_L is
1783
 
1784
  generic (
1785
        TERMINAL_COUNT : integer := 511; --QQ: Word number < 2**WADDR_WIDTH
1786
        WADDR_WIDTH    : integer :=   9;
1787
        WDATA_WIDTH    : integer :=  32;
1788
        RADDR_WIDTH    : integer :=   8;
1789
        RDATA_WIDTH    : integer :=  64;
1790
        ALMOST_FULL_X  : integer :=   2;
1791
        ALMOST_EMPTY_Y : integer :=   2;
1792
        MEM_INIT_FLAG  : integer :=   0;
1793
        MEM_INIT_FILE  : string  := "mem_init_file"
1794
 
1795
         );
1796
 
1797
  port (
1798
        WE      : in STD_LOGIC ;
1799
        WCLK    : in STD_LOGIC ;
1800
        RST     : in STD_LOGIC ;
1801
        RPRST   : in STD_LOGIC ;
1802
        RE      : in STD_LOGIC ;
1803
        RCLK    : in STD_LOGIC ;
1804
        FULLIN  : in STD_LOGIC ;
1805
        EMPTYIN : in STD_LOGIC ;
1806
        DI      : in STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0);
1807
 
1808
        FULL    : out STD_LOGIC ;
1809
        EMPTY   : out STD_LOGIC ;
1810
        AMFULL  : out STD_LOGIC ;
1811
        AMEMPTY : out STD_LOGIC ;
1812
        DO      : out STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0)
1813
 
1814
        );
1815
 
1816
end SC_FIFO_V2_16K_L ;
1817
 
1818
-- ************************************************************************
1819
-- architecture
1820
-- ************************************************************************
1821
 
1822
architecture LATTICE_BEHAV of SC_FIFO_V2_16K_L is
1823
 
1824
---------------------------------------------------------
1825
-- Function: TO_STD_VECTOR
1826
---------------------------------------------------------
1827
 function TO_STD_VECTOR ( INPUT_STRING : string; INPUT_LENGTH: integer)
1828
 return std_logic_vector is
1829
 
1830
   variable vDATA_STD_VEC: std_logic_vector(INPUT_LENGTH -1 downto 0) := (others => '0');
1831
   variable vTRANS: string(INPUT_LENGTH downto 1) := (others => '0');
1832
 
1833
 begin
1834
    vTRANS := INPUT_STRING;
1835
 
1836
    for i in INPUT_LENGTH downto 1 loop
1837
      if (vTRANS(i) = '1') then
1838
        vDATA_STD_VEC(i-1) := '1';
1839
      elsif ( vTRANS(i) ='0') then
1840
        vDATA_STD_VEC(i-1) := '0';
1841
      end if;
1842
    end loop;
1843
  return vDATA_STD_VEC;
1844
 end TO_STD_VECTOR;
1845
 
1846
---------------------------------------------------------
1847
-- Components Definition
1848
---------------------------------------------------------
1849
 
1850
component SC_BRAM_16K_L
1851
 
1852
  generic (
1853
         WADDR_WIDTH_A : integer := 14;
1854
         RADDR_WIDTH_A : integer := 12;
1855
         WADDR_WIDTH_B : integer := 14;
1856
         RADDR_WIDTH_B : integer := 12;
1857
         WDATA_WIDTH_A : integer := 1;
1858
         RDATA_WIDTH_A : integer := 4;
1859
         WDATA_WIDTH_B : integer := 1;
1860
         RDATA_WIDTH_B : integer := 4;
1861
         ARRAY_SIZE    : integer := 16384;
1862
         MEM_INIT_FLAG : integer := 0;
1863
         MEM_INIT_FILE : string  := "mem_init_file"
1864
 
1865
          );
1866
 
1867
  port (
1868
         WADA : in  STD_LOGIC_VECTOR (WADDR_WIDTH_A -1 downto 0);
1869
         WEA  : in  STD_LOGIC ;
1870
         WDA  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_A -1 downto 0);
1871
         RADA : in  STD_LOGIC_VECTOR (RADDR_WIDTH_A -1 downto 0);
1872
         REA  : in  STD_LOGIC ;
1873
         RDA  : out STD_LOGIC_VECTOR (RDATA_WIDTH_A -1 downto 0);
1874
 
1875
         WADB : in  STD_LOGIC_VECTOR (WADDR_WIDTH_B -1 downto 0);
1876
         WEB  : in  STD_LOGIC;
1877
         WDB  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_B -1 downto 0);
1878
         RADB : in  STD_LOGIC_VECTOR (RADDR_WIDTH_B -1 downto 0);
1879
         REB  : in  STD_LOGIC;
1880
         RDB  : out STD_LOGIC_VECTOR (RDATA_WIDTH_B -1 downto 0)
1881
        );
1882
 end component;
1883
 
1884
 component READ_POINTER_CTRL_V2
1885
 
1886
        generic (
1887
                RPOINTER_WIDTH : integer := 9
1888
                );
1889
        port (
1890
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(RPOINTER_WIDTH -1 downto 0);
1891
                GLOBAL_RST     : in STD_LOGIC ;
1892
                RESET_RP       : in STD_LOGIC ;
1893
                READ_EN        : in STD_LOGIC ;
1894
                READ_CLK       : in STD_LOGIC ;
1895
                EMPTY_FLAG     : in STD_LOGIC ;
1896
                READ_POINTER   : out STD_LOGIC_VECTOR (RPOINTER_WIDTH -1 downto 0)
1897
             );
1898
 end component;
1899
 
1900
 component WRITE_POINTER_CTRL_V2
1901
        generic (
1902
                WPOINTER_WIDTH : integer := 9;
1903
                WDATA_WIDTH    : integer := 32
1904
                );
1905
        port (
1906
                TERMINAL_COUNT : in STD_LOGIC_VECTOR(WPOINTER_WIDTH -1 downto 0);
1907
                GLOBAL_RST     : in STD_LOGIC ;
1908
                WRITE_EN       : in STD_LOGIC ;
1909
                WRITE_CLK      : in STD_LOGIC ;
1910
                FULL_FLAG      : in STD_LOGIC ;
1911
                WRITE_POINTER  : out STD_LOGIC_VECTOR (WPOINTER_WIDTH -1 downto 0)
1912
                );
1913
 end component;
1914
 
1915
 component FLAG_LOGIC_V2
1916
        generic (
1917
                WDATA_WIDTH    : integer := 32;
1918
                RDATA_WIDTH    : integer := 32;
1919
                AMFULL_X       : integer := 1;
1920
                AMEMPTY_Y      : integer := 1
1921
                );
1922
        port (
1923
                GLOBAL_RST : in STD_LOGIC ;
1924
                FIFO_CAP   : in integer ;
1925
                FIFO_PTR   : in integer ;
1926
                FULL_D     : out STD_LOGIC ;
1927
                EMPTY_D    : out STD_LOGIC ;
1928
                AMFULL_D   : out STD_LOGIC ;
1929
                AMEMPTY_D  : out STD_LOGIC
1930
        );
1931
 end component;
1932
 -- Signal Declaration
1933
 
1934
 signal WE_node      :  STD_LOGIC := 'X';
1935
 signal WCLK_node    :  STD_LOGIC := 'X';
1936
 signal RST_node     :  STD_LOGIC := 'X';
1937
 signal RPRST_node   :  STD_LOGIC := 'X';
1938
 signal RE_node      :  STD_LOGIC := 'X';
1939
 signal RCLK_node    :  STD_LOGIC := 'X';
1940
 signal FULLIN_node  :  STD_LOGIC := 'X';
1941
 signal EMPTYIN_node :  STD_LOGIC := 'X';
1942
 signal DI_node      :  STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0) := (others => 'X');
1943
 
1944
 signal DI_reg       :  STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0) := (others => 'X');
1945
 signal WE_reg       :  STD_LOGIC := 'X';
1946
 signal RE_reg       :  STD_LOGIC := 'X';
1947
 signal FULLIN_reg   :  STD_LOGIC := 'X';
1948
 signal EMPTYIN_reg  :  STD_LOGIC := 'X';
1949
 
1950
 signal FULL_node    :  STD_LOGIC := 'X';
1951
 signal EMPTY_node   :  STD_LOGIC := 'X';
1952
 signal AMFULL_node  :  STD_LOGIC := 'X';
1953
 signal AMEMPTY_node :  STD_LOGIC := 'X';
1954
 signal DO_node      :  STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0) := (others => 'X');
1955
 
1956
 signal TC_W_node      :  STD_LOGIC_VECTOR (WADDR_WIDTH -1 downto 0) := (others => 'X');
1957
 signal TC_R_node      :  STD_LOGIC_VECTOR (RADDR_WIDTH -1 downto 0) := (others => 'X');
1958
 
1959
 signal FULL_reg     :  STD_LOGIC := 'X';
1960
 signal EMPTY_reg    :  STD_LOGIC := 'X';
1961
 signal AMFULL_reg   :  STD_LOGIC := 'X';
1962
 signal AMEMPTY_reg  :  STD_LOGIC := 'X';
1963
 
1964
 signal RP_node      :  STD_LOGIC_VECTOR (RADDR_WIDTH -1 downto 0)  := (others => 'X');
1965
 signal WP_node      :  STD_LOGIC_VECTOR (WADDR_WIDTH -1 downto 0)  := (others => '0');
1966
 signal GND_sig      :  STD_LOGIC := 'X';
1967
 
1968
--QQ FIFOV2
1969
 signal FIFO_capacity : integer := 0;
1970
 signal FIFO_pointer  : integer := 0;
1971
-- architecture
1972
 
1973
 begin
1974
  FIFO_capacity <= (TERMINAL_COUNT + 1) * WDATA_WIDTH;
1975
 
1976
  GND_sig      <= '0';
1977
  WE_node      <= WE and not (FULL_node);
1978
  WCLK_node    <= WCLK;
1979
  RST_node     <= RST;
1980
  RPRST_node   <= RPRST;
1981
  RE_node      <= RE;
1982
  RCLK_node    <= RCLK;
1983
  FULLIN_node  <= FULLIN;
1984
  EMPTYIN_node <= EMPTYIN;
1985
  DI_node      <= DI;
1986
 
1987
  TC_W_node      <= CONV_STD_LOGIC_VECTOR(TERMINAL_COUNT,WADDR_WIDTH);
1988
  TC_R_node      <= CONV_STD_LOGIC_VECTOR((TERMINAL_COUNT+1)*(WDATA_WIDTH/RDATA_WIDTH)-1,RADDR_WIDTH);
1989
 
1990
 
1991
  --FULL    <= FULL_node;
1992
  FULL    <= FULL_node when (RE_node = '0') else FULL_reg;
1993
  --AMFULL  <= AMFULL_node;
1994
  AMFULL  <= AMFULL_node when (RE_node = '0') else AMFULL_reg;
1995
  EMPTY   <= not EMPTY_node;
1996
  AMEMPTY <= not AMEMPTY_node;
1997
 
1998
  DO <= DO_node;
1999
 
2000
-- Register Port DI inputs
2001
  register_DI_inputs: process (RST_node, WCLK_node)
2002
  begin
2003
    if (RST_node = '1') then
2004
      DI_reg <= (others =>'0');
2005
    elsif (WCLK_node'event and WCLK_node = '1') then
2006
      if (WE_node = '1') then
2007
        DI_reg <= DI_node after 1 ps;
2008
      end if;
2009
    end if;
2010
  end process register_DI_inputs;
2011
 
2012
-- Register flag inputs
2013
  register_flag_inputs: process (RST_node, WCLK_node, RCLK_node)
2014
  begin
2015
    if (RST_node = '1') then
2016
      FULLIN_reg  <= '0';
2017
      EMPTYIN_reg <= '0';
2018
      WE_reg <= '0';
2019
      RE_reg <= '0';
2020
    else
2021
 
2022
      if (WCLK_node'event and WCLK_node = '1') then
2023
          WE_reg <= WE_node and not FULL_reg;  --Fix DTS14659
2024
          --WE_reg <= WE_node;  
2025
        if (WE_node = '1') then
2026
          FULLIN_reg <= FULLIN_node;
2027
        end if;
2028
      end if;
2029
 
2030
      if (RCLK_node'event and RCLK_node = '1') then
2031
          RE_reg <= RE_node and EMPTY_reg;
2032
        if (RE_node = '1') then
2033
          EMPTYIN_reg <= EMPTYIN_node;
2034
        end if;
2035
      end if;
2036
 
2037
    end if;
2038
  end process register_flag_inputs;
2039
 
2040
-- Register flag outputs
2041
  register_flag_outputs: process (RST_node, WCLK_node, RCLK_node)
2042
  begin
2043
    if (RST_node = '1') then
2044
      FULL_node    <= '0';
2045
      AMFULL_node  <= '0';
2046
      EMPTY_node   <= '0';
2047
      AMEMPTY_node <= '0';
2048
    else
2049
      if (WCLK_node'event and WCLK_node = '1') then
2050
        FULL_node <= FULL_reg;
2051
        AMFULL_node <= AMFULL_reg;
2052
      end if;
2053
      if (RCLK_node'event and RCLK_node = '1') then
2054
        EMPTY_node <= EMPTY_reg;
2055
        AMEMPTY_node <= AMEMPTY_reg;
2056
      end if;
2057
    end if;
2058
  end process register_flag_outputs;
2059
 
2060
-- Set FIFO_pointer 
2061
  FIFO_CAP_POINTER: process ( RP_node, WP_node, RST_node, RPRST_node)
2062
  begin
2063
  --WP ++, FIFO_CAP --
2064
    if (WP_node'event and RP_node'event) then
2065
        FIFO_pointer <= FIFO_pointer + WDATA_WIDTH - RDATA_WIDTH;
2066
    elsif(WP_node'event) then
2067
        FIFO_pointer <= FIFO_pointer + WDATA_WIDTH;
2068
    end if;
2069
  --RPRST Active, FIFO_CAP --
2070
  --RP ++, FIFO_CAP ++
2071
    if (RST_node = '1') then
2072
        FIFO_pointer <= 0;
2073
    elsif (RPRST_node = '1') then
2074
        FIFO_pointer <= (CONV_INTEGER(WP_node)+1) * WDATA_WIDTH;
2075
    elsif (RP_node'event and not(WP_node'event)) then
2076
        FIFO_pointer <= FIFO_pointer - RDATA_WIDTH;
2077
    end if;
2078
  end process FIFO_CAP_POINTER;
2079
 
2080
 
2081
-- READ_POINTER_CTRL_V2 instance for FIFO
2082
  FIFO_RPC_INST: READ_POINTER_CTRL_V2
2083
        generic map (
2084
                RPOINTER_WIDTH => RADDR_WIDTH
2085
                )
2086
        port map (
2087
                TERMINAL_COUNT => TC_R_node,
2088
                GLOBAL_RST   => RST_node,
2089
                RESET_RP     => RPRST_node,
2090
                READ_EN      => RE_node,
2091
                READ_CLK     => RCLK_node,
2092
                EMPTY_FLAG   => EMPTY_reg,
2093
                READ_POINTER => RP_node
2094
             );
2095
 
2096
-- WRITE_POINTER_CTRL_V2 instance for FIFO
2097
  FIFO_WPC_INST: WRITE_POINTER_CTRL_V2
2098
        generic map (
2099
                WPOINTER_WIDTH => WADDR_WIDTH,
2100
                WDATA_WIDTH    => WDATA_WIDTH
2101
                )
2102
        port map (
2103
                TERMINAL_COUNT => TC_W_node,
2104
                GLOBAL_RST     => RST_node,
2105
                WRITE_EN       => WE_node,
2106
                WRITE_CLK      => WCLK_node,
2107
                FULL_FLAG      => FULL_reg,
2108
                WRITE_POINTER  => WP_node
2109
                );
2110
 
2111
-- FLAG_LOGIC_V2 instance for FIFO
2112
  FIFO_FL_INST: FLAG_LOGIC_V2
2113
           generic map (
2114
                WDATA_WIDTH    => WDATA_WIDTH,
2115
                RDATA_WIDTH    => RDATA_WIDTH,
2116
                AMFULL_X       => ALMOST_FULL_X,
2117
                AMEMPTY_Y      => ALMOST_EMPTY_Y
2118
                )
2119
           port map(
2120
                GLOBAL_RST    => RST_node,
2121
                FIFO_CAP      => FIFO_capacity,
2122
                FIFO_PTR      => FIFO_pointer,
2123
                FULL_D        => FULL_reg,
2124
                EMPTY_D       => EMPTY_reg,
2125
                AMFULL_D      => AMFULL_reg,
2126
                AMEMPTY_D     => AMEMPTY_reg
2127
        );
2128
 
2129
-- BRAM instance for FIFO 
2130
  FIFO_BRAM_INST: SC_BRAM_16K_L
2131
 
2132
    generic map(
2133
         WADDR_WIDTH_A  => WADDR_WIDTH,
2134
         RADDR_WIDTH_A  => RADDR_WIDTH,
2135
         WADDR_WIDTH_B  => WADDR_WIDTH,
2136
         RADDR_WIDTH_B  => RADDR_WIDTH,
2137
         WDATA_WIDTH_A  => WDATA_WIDTH,
2138
         RDATA_WIDTH_A  => RDATA_WIDTH,
2139
         WDATA_WIDTH_B  => WDATA_WIDTH,
2140
         RDATA_WIDTH_B  => RDATA_WIDTH,
2141
         ARRAY_SIZE     => open,
2142
         MEM_INIT_FLAG  => MEM_INIT_FLAG,
2143
         MEM_INIT_FILE  => MEM_INIT_FILE
2144
 
2145
       )
2146
    port map (
2147
         WADA => WP_node,
2148
         WEA  => WE_reg,
2149
         WDA  => DI_reg,
2150
         RADA => RP_node,
2151
         REA  => RE_reg,
2152
         RDA  => DO_node,
2153
 
2154
         WADB => WP_node,
2155
         WEB  => GND_sig,
2156
         WDB  => DI_reg,
2157
         RADB => RP_node,
2158
         REB  => GND_sig,
2159
         RDB  => open
2160
      );
2161
 
2162
end LATTICE_BEHAV;
2163
-- ************************************************************************
2164
--
2165
--  DPRAM: Behavioral Model
2166
-- ************************************************************************
2167
--
2168
--  Filename:  SC_DP_RAM.vhd
2169
--  Description: Single Port BRAM behavioral model. 
2170
--  History:
2171
--  May. 30, 2002 Read memory initialization file feature
2172
-- ************************************************************************
2173
 
2174
LIBRARY ieee, std;
2175
USE ieee.std_logic_1164.ALL;
2176
USE ieee.std_logic_unsigned.ALL;
2177
USE std.textio.all;
2178
USE work.components.all;
2179
 
2180
-- ************************************************************************
2181
--  Entity definition  
2182
--  Draft "generic" members 
2183
-- ************************************************************************
2184
 
2185
entity SC_DPRAM_16K_L is
2186
 
2187
  generic (
2188
        AWRITE_MODE    : string  := "NORMAL";
2189
        BWRITE_MODE    : string  := "NORMAL";
2190
        ADDR_WIDTH_A     : integer := 13;
2191
        DATA_WIDTH_A     : integer := 2;
2192
        ADDR_WIDTH_B     : integer := 14;
2193
        DATA_WIDTH_B     : integer := 1;
2194
        MEM_INIT_FLAG  : integer := 1;
2195
        ARRAY_SIZE       : integer := 16384;
2196
        MEM_INIT_FILE  : string  := "mem_init_file"
2197
 
2198
         );
2199
 
2200
  port (
2201
        CENA : in  STD_LOGIC ;
2202
        CLKA : in  STD_LOGIC ;
2203
        WRA  : in  STD_LOGIC ;
2204
        CSA  : in  STD_LOGIC_VECTOR (1 downto 0);
2205
        RSTA : in  STD_LOGIC ;
2206
        DIA  : in  STD_LOGIC_VECTOR (DATA_WIDTH_A -1 downto 0);
2207
        ADA  : in  STD_LOGIC_VECTOR (ADDR_WIDTH_A -1 downto 0);
2208
        DOA  : out STD_LOGIC_VECTOR (DATA_WIDTH_A -1 downto 0);
2209
 
2210
        CENB : in  STD_LOGIC ;
2211
        CLKB : in  STD_LOGIC ;
2212
        WRB  : in  STD_LOGIC ;
2213
        CSB  : in  STD_LOGIC_VECTOR (1 downto 0);
2214
        RSTB : in  STD_LOGIC ;
2215
        DIB  : in  STD_LOGIC_VECTOR (DATA_WIDTH_B -1 downto 0);
2216
        ADB  : in  STD_LOGIC_VECTOR (ADDR_WIDTH_B -1 downto 0);
2217
        DOB  : out STD_LOGIC_VECTOR (DATA_WIDTH_B -1 downto 0)
2218
 
2219
        );
2220
 
2221
end SC_DPRAM_16K_L ;
2222
 
2223
-- ************************************************************************
2224
-- architecture
2225
-- ************************************************************************
2226
 
2227
architecture LATTICE_BEHAV of SC_DPRAM_16K_L is
2228
 
2229
 component SC_BRAM_16K_L
2230
 
2231
  generic (
2232
         AWRITE_MODE   : string  := "NORMAL";
2233
         BWRITE_MODE   : string  := "NORMAL";
2234
         WADDR_WIDTH_A : integer := 14;
2235
         RADDR_WIDTH_A : integer := 12;
2236
         WADDR_WIDTH_B : integer := 14;
2237
         RADDR_WIDTH_B : integer := 12;
2238
         WDATA_WIDTH_A : integer := 1;
2239
         RDATA_WIDTH_A : integer := 4;
2240
         WDATA_WIDTH_B : integer := 1;
2241
         RDATA_WIDTH_B : integer := 4;
2242
         ARRAY_SIZE    : integer := 16384;
2243
         MEM_INIT_FLAG : integer := 0;
2244
         MEM_INIT_FILE : string  := "mem_init_file"
2245
 
2246
          );
2247
 
2248
  port (
2249
         WADA : in  STD_LOGIC_VECTOR (WADDR_WIDTH_A -1 downto 0);
2250
         WEA  : in  STD_LOGIC ;
2251
         WDA  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_A -1 downto 0);
2252
         RADA : in  STD_LOGIC_VECTOR (RADDR_WIDTH_A -1 downto 0);
2253
         REA  : in  STD_LOGIC ;
2254
         RDA  : out STD_LOGIC_VECTOR (RDATA_WIDTH_A -1 downto 0);
2255
 
2256
         WADB : in  STD_LOGIC_VECTOR (WADDR_WIDTH_B -1 downto 0);
2257
         WEB  : in  STD_LOGIC;
2258
         WDB  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_B -1 downto 0);
2259
         RADB : in  STD_LOGIC_VECTOR (RADDR_WIDTH_B -1 downto 0);
2260
         REB  : in  STD_LOGIC;
2261
         RDB  : out STD_LOGIC_VECTOR (RDATA_WIDTH_B -1 downto 0)
2262
        );
2263
 end component;
2264
 
2265
procedure READ_MEM_INIT_FILE(
2266
                              f_name : IN    STRING;
2267
                              v_MEM  : OUT   STD_LOGIC_VECTOR
2268
                             ) IS
2269
 
2270
    file     f_INIT_FILE   : TEXT is MEM_INIT_FILE;
2271
    variable v_WORD        : line;
2272
    variable v_GOODFLAG    : boolean;
2273
    variable v_WORD_BIT    : string (DATA_WIDTH_A downto 1) ;
2274
    variable v_CHAR        : character;
2275
    variable v_OFFSET      : integer := 0;
2276
    variable v_LINE        : integer := 0;
2277
 
2278
    begin
2279
 
2280
      while ( not(endfile(f_INIT_FILE)) and (v_LINE < 2**ADDR_WIDTH_A)) loop
2281
 
2282
      readline(f_INIT_FILE, v_WORD);
2283
      read(v_WORD, v_WORD_BIT, v_GOODFLAG);
2284
 
2285
      for k in 0 to DATA_WIDTH_A - 1 loop
2286
        v_CHAR := v_WORD_BIT (k + 1);
2287
        if (v_CHAR = '1') then
2288
          v_MEM(v_OFFSET + k) := '1';
2289
 
2290
        elsif (v_CHAR = '0') then
2291
          v_MEM(v_OFFSET + k) := '0';
2292
 
2293
--      else 
2294
--          v_MEM(v_OFFSET + k) := 'X';
2295
 
2296
        end if;
2297
      end loop;
2298
 
2299
      v_LINE := v_LINE + 1;
2300
      v_OFFSET := v_OFFSET + DATA_WIDTH_A;
2301
 
2302
    end loop;
2303
 
2304
  end READ_MEM_INIT_FILE;
2305
 
2306
 -- Signal Declaration
2307
 
2308
 signal CENA_node :  STD_LOGIC := 'X';
2309
 signal CLKA_node :  STD_LOGIC := 'X';
2310
 signal WRA_node  :  STD_LOGIC := 'X';
2311
 signal CSA_node  :  STD_LOGIC_VECTOR (1 downto 0) := (others => 'X');
2312
 signal RSTA_node :  STD_LOGIC := 'X';
2313
 signal DIA_node  :  STD_LOGIC_VECTOR (DATA_WIDTH_A -1 downto 0) := (others => 'X');
2314
 signal ADA_node  :  STD_LOGIC_VECTOR (ADDR_WIDTH_A -1 downto 0) := (others => '0');
2315
 signal DOA_node  :  STD_LOGIC_VECTOR (DATA_WIDTH_A -1 downto 0) := (others => 'X');
2316
 
2317
 signal DIA_reg   :  STD_LOGIC_VECTOR (DATA_WIDTH_A -1 downto 0) := (others => 'X');
2318
 signal ADA_reg   :  STD_LOGIC_VECTOR (ADDR_WIDTH_A -1 downto 0) := (others => 'X');
2319
 signal ENA_reg   :  STD_LOGIC := 'X';
2320
 signal RENA_reg  :  STD_LOGIC := 'X';
2321
 
2322
 signal CENB_node :  STD_LOGIC := 'X';
2323
 signal CLKB_node :  STD_LOGIC := 'X';
2324
 signal WRB_node  :  STD_LOGIC := 'X';
2325
 signal CSB_node  :  STD_LOGIC_VECTOR (1 downto 0) := (others => 'X');
2326
 signal RSTB_node :  STD_LOGIC := 'X';
2327
 signal DIB_node  :  STD_LOGIC_VECTOR (DATA_WIDTH_B -1 downto 0) := (others => 'X');
2328
 signal ADB_node  :  STD_LOGIC_VECTOR (ADDR_WIDTH_B -1 downto 0) := (others => 'X');
2329
 signal DOB_node  :  STD_LOGIC_VECTOR (DATA_WIDTH_B -1 downto 0) := (others => 'X');
2330
 
2331
 signal DIB_reg   :  STD_LOGIC_VECTOR (DATA_WIDTH_B -1 downto 0) := (others => 'X');
2332
 signal ADB_reg   :  STD_LOGIC_VECTOR (ADDR_WIDTH_B -1 downto 0) := (others => 'X');
2333
 signal ENB_reg   :  STD_LOGIC := 'X';
2334
 signal RENB_reg  :  STD_LOGIC := 'X';
2335
 signal v_MEM     :  STD_LOGIC_VECTOR(ARRAY_SIZE - 1 downto 0) := ( others => '0' );
2336
 signal v_ADA     :  INTEGER;
2337
 signal v_ADB     :  INTEGER;
2338
 
2339
 
2340
-- architecture
2341
 
2342
 begin
2343
 
2344
  CENA_node <= CENA;
2345
  CLKA_node <= CLKA;
2346
  WRA_node  <= WRA;
2347
  CSA_node  <= CSA;
2348
  RSTA_node <= RSTA;
2349
  DIA_node  <= DIA;
2350
  ADA_node  <= ADA;
2351
--  DOA       <= DOA_node; 
2352
 
2353
  CENB_node <= CENB;
2354
  CLKB_node <= CLKB;
2355
  WRB_node  <= WRB;
2356
  CSB_node  <= CSB;
2357
  RSTB_node <= RSTB;
2358
  DIB_node  <= DIB;
2359
  ADB_node  <= ADB;
2360
--  DOB       <= DOB_node;
2361
 
2362
init_process : process
2363
variable v_INI_DONE      : boolean := FALSE;
2364
variable v_MEM_i         : std_logic_vector(ARRAY_SIZE - 1 downto 0) := ( others => '0' );
2365
begin
2366
    if( MEM_INIT_FLAG = 1 and v_INI_DONE = FALSE) THEN
2367
        READ_MEM_INIT_FILE(MEM_INIT_FILE, v_MEM_i);
2368
        v_INI_DONE := TRUE;
2369
    end if;
2370
 
2371
    v_MEM <= v_MEM_i;
2372
    wait;
2373
end process;
2374
 
2375
process(ADA_node, ADB_node)
2376
begin
2377
  if (Valid_Address(ADA_node) = TRUE) then
2378
  v_ADA <= CONV_INTEGER(ADA_node);
2379
  end if;
2380
 
2381
  if (Valid_Address(ADB_node) = TRUE) then
2382
  v_ADB <= CONV_INTEGER(ADB_node);
2383
  end if;
2384
end process;
2385
 
2386
  -- Register Port A DI/ AD / Enable inputs
2387
  register_A_inputs: process (CLKA_node, RSTA_node)
2388
  begin
2389
    if (RSTA_node = '1') then
2390
      DIA_reg <= (others =>'0');
2391
      ADA_reg <= (others =>'0');
2392
      ENA_reg <= '0';
2393
      RENA_reg <= '1';
2394
    elsif (CLKA_node'event and CLKA_node = '1') then
2395
      if (CENA_node = '1') then
2396
        DIA_reg <= DIA_node;
2397
        ADA_reg <= ADA_node;
2398
        ENA_reg <= WRA_node  and CSA_node(0) and CSA_node(1);
2399
        RENA_reg <= '1';
2400
      end if;
2401
    end if;
2402
  end process register_A_inputs;
2403
 
2404
-- Register Port B DI/ AD / Enable inputs
2405
  register_B_inputs: process (CLKB_node, RSTB_node)
2406
  begin
2407
    if (RSTB_node = '1') then
2408
      DIB_reg <= (others =>'0');
2409
      ADB_reg <= (others =>'0');
2410
      ENB_reg <= '0';
2411
      RENB_reg <= '1';
2412
    elsif (CLKB_node'event and CLKB_node = '1') then
2413
      if (CENB_node = '1') then
2414
        DIB_reg <= DIB_node;
2415
        ADB_reg <= ADB_node;
2416
        ENB_reg <= WRB_node  and CSB_node(0) and CSB_node(1);
2417
        RENB_reg <= '1';
2418
      end if;
2419
    end if;
2420
  end process register_B_inputs;
2421
 
2422
  v_MEM_process: process (CLKA_node, CLKB_node)
2423
  begin
2424
      if (ENA_reg = '1' and CENA_node = '1') then
2425
          if (CLKA_node'event and CLKA_node = '1') then
2426
              for i in 0 to DATA_WIDTH_A - 1 loop
2427
               v_MEM(v_ADA*DATA_WIDTH_A+i) <= DIA_node(i) after 1 ps;
2428
              end loop;
2429
          end if;
2430
      end if;
2431
      if (ENB_reg = '1' and CENB_node = '1') then
2432
          if (CLKB_node'event and CLKB_node = '1') then
2433
              for i in 0 to DATA_WIDTH_B - 1 loop
2434
               v_MEM(v_ADB*DATA_WIDTH_B+i) <= DIB_node(i) after 1 ps;
2435
              end loop;
2436
          end if;
2437
      end if;
2438
  end process;
2439
 
2440
  DOA_output_process: process (RSTA_node, ENA_reg, CENA_node, DOA_node, CLKA_node)
2441
  begin
2442
     if (RSTA_node = '1') then
2443
         DOA <= (others => '0');
2444
     elsif (CLKA_node = '1' and CENA_node = '1') then
2445
         if (ENA_reg = '1') then
2446
            if (AWRITE_MODE = "RD_BEFORE_WR") then
2447
                for j in 0 to DATA_WIDTH_A - 1 loop
2448
                    DOA(j) <= v_MEM(v_ADA*DATA_WIDTH_A+j);
2449
                end loop;
2450
            else
2451
                DOA <= DOA_node;
2452
            end if;
2453
         else
2454
           DOA <= DOA_node;
2455
         end if;
2456
     end if;
2457
  end process;
2458
 
2459
  DOB_output_process: process (RSTB_node, ENB_reg, CENB_node, DOB_node, CLKB_node)
2460
  begin
2461
     if (RSTB_node = '1') then
2462
         DOB <= (others => '0');
2463
     elsif (CLKB_node = '1' and CENB_node = '1') then
2464
         if (ENB_reg = '1') then
2465
            if (BWRITE_MODE = "RD_BEFORE_WR") then
2466
                for j in 0 to DATA_WIDTH_B - 1 loop
2467
                    DOB(j) <= v_MEM(v_ADB*DATA_WIDTH_B+j);
2468
                end loop;
2469
            else
2470
                DOB <= DOB_node;
2471
            end if;
2472
         else
2473
           DOB <= DOB_node;
2474
         end if;
2475
     end if;
2476
  end process;
2477
 
2478
  -- BRAM instance for SPRAM 
2479
  DPRAM_INST: SC_BRAM_16K_L
2480
 
2481
    generic map(
2482
         AWRITE_MODE    => AWRITE_MODE,
2483
         BWRITE_MODE    => BWRITE_MODE,
2484
         WADDR_WIDTH_A  => ADDR_WIDTH_A,
2485
         RADDR_WIDTH_A  => ADDR_WIDTH_A,
2486
         WADDR_WIDTH_B  => ADDR_WIDTH_B,
2487
         RADDR_WIDTH_B  => ADDR_WIDTH_B,
2488
         WDATA_WIDTH_A  => DATA_WIDTH_A,
2489
         RDATA_WIDTH_A  => DATA_WIDTH_A,
2490
         WDATA_WIDTH_B  => DATA_WIDTH_B,
2491
         RDATA_WIDTH_B  => DATA_WIDTH_B,
2492
         ARRAY_SIZE     => ARRAY_SIZE,
2493
         MEM_INIT_FLAG  => MEM_INIT_FLAG,
2494
         MEM_INIT_FILE  => MEM_INIT_FILE
2495
 
2496
       )
2497
    port map (
2498
         WADA => ADA_reg,
2499
         WEA  => ENA_reg,
2500
         WDA  => DIA_reg,
2501
         RADA => ADA_reg,
2502
         REA  => RENA_reg,
2503
         RDA  => DOA_node,
2504
 
2505
         WADB => ADB_reg,
2506
         WEB  => ENB_reg,
2507
         WDB  => DIB_reg,
2508
         RADB => ADB_reg,
2509
         REB  => RENB_reg,
2510
         RDB  => DOB_node
2511
      );
2512
 
2513
end LATTICE_BEHAV;
2514
 
2515
 
2516
 
2517
 
2518
-- ************************************************************************
2519
--
2520
--  PseudoDPRAM: Behavioral Model
2521
-- ************************************************************************
2522
--
2523
--  Filename:  SC_PDP_RAM.vhd
2524
--  Description: Pseudo Dual Port BRAM behavioral model. 
2525
--  History:
2526
--  May. 30, 2002 Read memory initialization file feature
2527
-- ************************************************************************
2528
 
2529
LIBRARY ieee;
2530
USE ieee.std_logic_1164.ALL;
2531
USE ieee.std_logic_unsigned.ALL;
2532
 
2533
-- ************************************************************************
2534
--  Entity definition  
2535
--  Draft "generic" members 
2536
-- ************************************************************************
2537
 
2538
entity SC_PDPRAM_16K_L is
2539
 
2540
  generic (
2541
        WADDR_WIDTH    : integer := 13;
2542
        WDATA_WIDTH    : integer := 2;
2543
        RADDR_WIDTH    : integer := 13;
2544
        RDATA_WIDTH    : integer := 2;
2545
        MEM_INIT_FLAG  : integer := 1;
2546
        ARRAY_SIZE     : integer := 16384;
2547
        MEM_INIT_FILE  : string  := "mem_init_file"
2548
 
2549
        );
2550
 
2551
  port (
2552
        WCEN : in  STD_LOGIC ;
2553
        WCLK : in  STD_LOGIC ;
2554
        WE   : in  STD_LOGIC ;
2555
        WCS  : in  STD_LOGIC_VECTOR (1 downto 0);
2556
        RCLK : in  STD_LOGIC;
2557
        RCEN : in  STD_LOGIC;
2558
        RST  : in  STD_LOGIC ;
2559
 
2560
        WD   : in  STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0);
2561
        WAD  : in  STD_LOGIC_VECTOR (WADDR_WIDTH -1 downto 0);
2562
        RAD  : in  STD_LOGIC_VECTOR (RADDR_WIDTH -1 downto 0);
2563
        RD   : out STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0)
2564
       );
2565
 
2566
end SC_PDPRAM_16K_L ;
2567
 
2568
-- ************************************************************************
2569
-- architecture
2570
-- ************************************************************************
2571
 
2572
architecture LATTICE_BEHAV of SC_PDPRAM_16K_L is
2573
 
2574
 component SC_BRAM_16K_L
2575
 
2576
  generic (
2577
         WADDR_WIDTH_A : integer := 14;
2578
         RADDR_WIDTH_A : integer := 12;
2579
         WADDR_WIDTH_B : integer := 14;
2580
         RADDR_WIDTH_B : integer := 12;
2581
         WDATA_WIDTH_A : integer := 1;
2582
         RDATA_WIDTH_A : integer := 4;
2583
         WDATA_WIDTH_B : integer := 1;
2584
         RDATA_WIDTH_B : integer := 4;
2585
         ARRAY_SIZE    : integer := 16384;
2586
         MEM_INIT_FLAG : integer := 0;
2587
         MEM_INIT_FILE : string  := "mem_init_file"
2588
 
2589
          );
2590
 
2591
  port (
2592
         WADA : in  STD_LOGIC_VECTOR (WADDR_WIDTH_A -1 downto 0);
2593
         WEA  : in  STD_LOGIC ;
2594
         WDA  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_A -1 downto 0);
2595
         RADA : in  STD_LOGIC_VECTOR (RADDR_WIDTH_A -1 downto 0);
2596
         REA  : in  STD_LOGIC ;
2597
         RDA  : out STD_LOGIC_VECTOR (RDATA_WIDTH_A -1 downto 0);
2598
 
2599
         WADB : in  STD_LOGIC_VECTOR (WADDR_WIDTH_B -1 downto 0);
2600
         WEB  : in  STD_LOGIC;
2601
         WDB  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_B -1 downto 0);
2602
         RADB : in  STD_LOGIC_VECTOR (RADDR_WIDTH_B -1 downto 0);
2603
         REB  : in  STD_LOGIC;
2604
         RDB  : out STD_LOGIC_VECTOR (RDATA_WIDTH_B -1 downto 0)
2605
        );
2606
 end component;
2607
 
2608
 -- Signal Declaration
2609
 
2610
 signal WCEN_node :  STD_LOGIC := 'X';
2611
 signal WCLK_node :  STD_LOGIC := 'X';
2612
 signal WE_node   :  STD_LOGIC := 'X';
2613
 signal WCS_node  :  STD_LOGIC_VECTOR (1 downto 0) := (others => 'X');
2614
 signal RCEN_node :  STD_LOGIC := 'X';
2615
 signal RCLK_node :  STD_LOGIC := 'X';
2616
 signal RST_node  :  STD_LOGIC := 'X';
2617
 signal WD_node   :  STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0) := (others => 'X');
2618
 signal WAD_node  :  STD_LOGIC_VECTOR (WADDR_WIDTH -1 downto 0) := (others => 'X');
2619
 signal RD_node   :  STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0) := (others => 'X');
2620
 signal RAD_node  :  STD_LOGIC_VECTOR (RADDR_WIDTH -1 downto 0) := (others => 'X');
2621
 
2622
 
2623
 signal WD_reg    :  STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0) := (others => 'X');
2624
 signal WAD_reg   :  STD_LOGIC_VECTOR (WADDR_WIDTH -1 downto 0) := (others => 'X');
2625
 signal RAD_reg   :  STD_LOGIC_VECTOR (RADDR_WIDTH -1 downto 0) := (others => 'X');
2626
 signal EN_reg    :  STD_LOGIC := 'X';
2627
 signal REN_reg    :  STD_LOGIC := 'X';
2628
 signal GND_sig   :  STD_LOGIC;
2629
 signal VCC_sig   :  STD_LOGIC;
2630
 
2631
 -- architecture
2632
 
2633
 begin
2634
  GND_sig <= '0';
2635
  VCC_sig <= '1';
2636
  WCEN_node <= WCEN;
2637
  WCLK_node <= WCLK;
2638
  WE_node   <= WE;
2639
  WCS_node  <= WCS;
2640
  RCEN_node <= RCEN;
2641
  RCLK_node <= RCLK;
2642
  RST_node  <= RST;
2643
  WD_node   <= WD;
2644
  WAD_node  <= WAD;
2645
  RAD_node  <= RAD;
2646
--  RD        <= RD_node;
2647
 
2648
  RD_output : process (RD_node, RST_node)
2649
  begin
2650
    if (RST_node = '1') then
2651
       RD <= (others => '0');
2652
    else
2653
       RD <= RD_node;
2654
    end if;
2655
  end process;
2656
 
2657
  -- Register WD/WAD/ Enable inputs
2658
  register_write_inputs: process (WCLK_node, RST_node)
2659
  begin
2660
    if (RST_node = '1') then
2661
      WD_reg <= (others =>'0');
2662
      WAD_reg <= (others =>'0');
2663
      EN_reg <= '0';
2664
      REN_reg <= '1';
2665
    elsif (WCLK_node'event and WCLK_node = '1') then
2666
      if (WCEN_node = '1') then
2667
        WD_reg  <= WD_node;
2668
        WAD_reg <= WAD_node;
2669
        EN_reg  <= WE_node  and WCS_node(0) and WCS_node(1);
2670
        REN_reg  <= '1';
2671
      end if;
2672
    end if;
2673
  end process register_write_inputs;
2674
 
2675
-- Register RAD inputs
2676
  register_read_inputs: process (RCLK_node, RST_node)
2677
  begin
2678
    if (RST_node = '1') then
2679
      RAD_reg <= (others =>'0');
2680
    elsif (RCLK_node'event and RCLK_node = '1') then
2681
      if (RCEN_node = '1') then
2682
        RAD_reg <= RAD_node;
2683
      end if;
2684
    end if;
2685
  end process register_read_inputs;
2686
 
2687
-- BRAM instance for SPRAM 
2688
  PDPRAM_INST: SC_BRAM_16K_L
2689
 
2690
    generic map(
2691
         WADDR_WIDTH_A  => WADDR_WIDTH,
2692
         RADDR_WIDTH_A  => RADDR_WIDTH,
2693
         WADDR_WIDTH_B  => WADDR_WIDTH,
2694
         RADDR_WIDTH_B  => RADDR_WIDTH,
2695
         WDATA_WIDTH_A  => WDATA_WIDTH,
2696
         RDATA_WIDTH_A  => RDATA_WIDTH,
2697
         WDATA_WIDTH_B  => WDATA_WIDTH,
2698
         RDATA_WIDTH_B  => RDATA_WIDTH,
2699
         ARRAY_SIZE     => ARRAY_SIZE,
2700
         MEM_INIT_FLAG  => MEM_INIT_FLAG,
2701
         MEM_INIT_FILE  => MEM_INIT_FILE
2702
       )
2703
    port map (
2704
         WADA => WAD_reg,
2705
         WEA  => EN_reg,
2706
         WDA  => WD_reg,
2707
         RADA => RAD_reg,
2708
         REA  => REN_reg,
2709
         RDA  => RD_node,
2710
 
2711
         WADB => WAD_reg,
2712
         WEB  => GND_sig,
2713
         WDB  => WD_reg,
2714
         RADB => RAD_reg,
2715
         REB  => GND_sig,
2716
         RDB  => open
2717
      );
2718
 
2719
end LATTICE_BEHAV;
2720
 
2721
 
2722
 
2723
-- ************************************************************************
2724
--
2725
--  SPRAM: Behavioral Model
2726
-- ************************************************************************
2727
--
2728
--  Filename:  SC_SP_RAM.vhd
2729
--  Description: Single Port BRAM behavioral model. 
2730
--  History:
2731
--  May. 30, 2002 Read memory initialization file feature
2732
-- ************************************************************************
2733
 
2734
LIBRARY ieee, std;
2735
USE ieee.std_logic_1164.ALL;
2736
USE ieee.std_logic_unsigned.ALL;
2737
USE std.textio.all;
2738
USE work.components.all;
2739
 
2740
-- ************************************************************************
2741
--  Entity definition  
2742
--  Draft "generic" members 
2743
-- ************************************************************************
2744
 
2745
entity SC_SPRAM_16K_L is
2746
 
2747
  generic (
2748
        WRITE_MODE     : string  := "NORMAL";
2749
        ADDR_WIDTH     : integer := 13;
2750
        DATA_WIDTH     : integer := 2;
2751
        MEM_INIT_FLAG  : integer := 1;
2752
        ARRAY_SIZE     : integer := 16384;
2753
        MEM_INIT_FILE  : string  := "qq.dat"
2754
 
2755
        );
2756
 
2757
  port (
2758
        CEN : in  STD_LOGIC ;
2759
        CLK : in  STD_LOGIC ;
2760
         WR : in  STD_LOGIC ;
2761
         CS : in  STD_LOGIC_VECTOR (1 downto 0);
2762
        RST : in  STD_LOGIC ;
2763
         DI : in  STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0);
2764
         AD : in  STD_LOGIC_VECTOR (ADDR_WIDTH-1 downto 0);
2765
         DO : out STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0)
2766
       );
2767
 
2768
end SC_SPRAM_16K_L ;
2769
 
2770
-- ************************************************************************
2771
-- architecture
2772
-- ************************************************************************
2773
 
2774
architecture LATTICE_BEHAV of SC_SPRAM_16K_L is
2775
 
2776
 component SC_BRAM_16K_L
2777
 
2778
  generic (
2779
         AWRITE_MODE   : string  := "NORMAL";
2780
         BWRITE_MODE   : string  := "NORMAL";
2781
         WADDR_WIDTH_A : integer := 14;
2782
         RADDR_WIDTH_A : integer := 12;
2783
         WADDR_WIDTH_B : integer := 14;
2784
         RADDR_WIDTH_B : integer := 12;
2785
         WDATA_WIDTH_A : integer := 1;
2786
         RDATA_WIDTH_A : integer := 4;
2787
         WDATA_WIDTH_B : integer := 1;
2788
         RDATA_WIDTH_B : integer := 4;
2789
         ARRAY_SIZE    : integer := 16384;
2790
         MEM_INIT_FLAG : integer := 1;
2791
         MEM_INIT_FILE : string  := "mem_init_file"
2792
 
2793
          );
2794
 
2795
  port (
2796
         WADA : in  STD_LOGIC_VECTOR (WADDR_WIDTH_A -1 downto 0);
2797
         WEA  : in  STD_LOGIC ;
2798
         WDA  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_A -1 downto 0);
2799
         RADA : in  STD_LOGIC_VECTOR (RADDR_WIDTH_A -1 downto 0);
2800
         REA  : in  STD_LOGIC ;
2801
         RDA  : out STD_LOGIC_VECTOR (RDATA_WIDTH_A -1 downto 0);
2802
 
2803
         WADB : in  STD_LOGIC_VECTOR (WADDR_WIDTH_B -1 downto 0);
2804
         WEB  : in  STD_LOGIC;
2805
         WDB  : in  STD_LOGIC_VECTOR (WDATA_WIDTH_B -1 downto 0);
2806
         RADB : in  STD_LOGIC_VECTOR (RADDR_WIDTH_B -1 downto 0);
2807
         REB  : in  STD_LOGIC;
2808
         RDB  : out STD_LOGIC_VECTOR (RDATA_WIDTH_B -1 downto 0)
2809
        );
2810
 end component;
2811
 
2812
procedure READ_MEM_INIT_FILE(
2813
                              f_name : IN    STRING;
2814
                              v_MEM  : OUT   STD_LOGIC_VECTOR
2815
                             ) IS
2816
 
2817
    file     f_INIT_FILE   : TEXT is MEM_INIT_FILE;
2818
    variable v_WORD        : line;
2819
    variable v_GOODFLAG    : boolean;
2820
    variable v_WORD_BIT    : string (DATA_WIDTH downto 1) ;
2821
    variable v_CHAR        : character;
2822
    variable v_OFFSET      : integer := 0;
2823
    variable v_LINE        : integer := 0;
2824
 
2825
    begin
2826
 
2827
      while ( not(endfile(f_INIT_FILE)) and (v_LINE < 2**ADDR_WIDTH)) loop
2828
 
2829
      readline(f_INIT_FILE, v_WORD);
2830
      read(v_WORD, v_WORD_BIT, v_GOODFLAG);
2831
 
2832
      for k in 0 to DATA_WIDTH - 1 loop
2833
        v_CHAR := v_WORD_BIT (k + 1);
2834
        if (v_CHAR = '1') then
2835
          v_MEM(v_OFFSET + k) := '1';
2836
 
2837
        elsif (v_CHAR = '0') then
2838
          v_MEM(v_OFFSET + k) := '0';
2839
 
2840
--      else 
2841
--          v_MEM(v_OFFSET + k) := 'X';
2842
 
2843
        end if;
2844
      end loop;
2845
 
2846
      v_LINE := v_LINE + 1;
2847
      v_OFFSET := v_OFFSET + DATA_WIDTH;
2848
 
2849
    end loop;
2850
 
2851
  end READ_MEM_INIT_FILE;
2852
 
2853
 -- Signal Declaration
2854
 
2855
 signal CEN_node :  STD_LOGIC := 'X';
2856
 signal CLK_node :  STD_LOGIC := 'X';
2857
 signal WR_node  :  STD_LOGIC := 'X';
2858
 signal CS_node  :  STD_LOGIC_VECTOR (1 downto 0) := (others => 'X');
2859
 signal RST_node :  STD_LOGIC := 'X';
2860
 signal DI_node  :  STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0) := (others => 'X');
2861
 signal AD_node  :  STD_LOGIC_VECTOR (ADDR_WIDTH-1 downto 0) := (others => '0');
2862
 signal DO_node  :  STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0) := (others => 'X');
2863
 
2864
 signal DI_reg   :  STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0) := (others => 'X');
2865
 signal AD_reg   :  STD_LOGIC_VECTOR (ADDR_WIDTH-1 downto 0) := (others => 'X');
2866
 signal EN_reg   :  STD_LOGIC := 'X';
2867
 signal REN_reg   :  STD_LOGIC := 'X';
2868
 
2869
 signal GND_sig   :  STD_LOGIC;
2870
 signal VCC_sig   :  STD_LOGIC;
2871
 
2872
 signal v_MEM     :  STD_LOGIC_VECTOR((2**ADDR_WIDTH) * DATA_WIDTH-1 downto 0) := (others => '0');
2873
 signal v_AD      : integer;
2874
 
2875
 -- architecture
2876
 
2877
 begin
2878
  GND_sig <= '0';
2879
  VCC_sig <= '1';
2880
 
2881
  CEN_node <= CEN;
2882
  CLK_node <= CLK;
2883
  WR_node  <= WR;
2884
  CS_node  <= CS;
2885
  RST_node <= RST;
2886
  DI_node  <= DI;
2887
  AD_node  <= AD;
2888
--  DO       <= DO_node;
2889
 
2890
init_process : process
2891
variable v_INI_DONE      : boolean := FALSE;
2892
variable v_MEM_i         : std_logic_vector(ARRAY_SIZE - 1 downto 0) := ( others => '0' );
2893
begin
2894
    if( MEM_INIT_FLAG = 1 and v_INI_DONE = FALSE) THEN
2895
        READ_MEM_INIT_FILE(MEM_INIT_FILE, v_MEM_i);
2896
        v_INI_DONE := TRUE;
2897
    end if;
2898
    v_MEM <= v_MEM_i;
2899
wait;
2900
end process;
2901
 
2902
process(AD_node)
2903
begin
2904
  if (Valid_Address(AD_node) = TRUE) then
2905
  v_AD <= CONV_INTEGER(AD_node);
2906
  end if;
2907
end process;
2908
 
2909
  -- Register DI/ AD / Enable inputs
2910
  register_inputs: process (CLK_node, RST_node)
2911
  begin
2912
    if (RST_node = '1') then
2913
      DI_reg <= (others =>'0');
2914
      AD_reg <= (others =>'0');
2915
      EN_reg <= '0';
2916
      REN_reg <= '1';
2917
    elsif (CLK_node'event and CLK_node = '1') then
2918
      if (CEN_node = '1') then
2919
        DI_reg <= DI_node;
2920
        AD_reg <= AD_node;
2921
        EN_reg <= WR_node  and CS_node(0) and CS_node(1);
2922
        REN_reg <= '1';
2923
      end if;
2924
    end if;
2925
  end process register_inputs;
2926
 
2927
  v_MEM_process: process (EN_reg, DI_node, v_AD, CLK_node)
2928
  begin
2929
    if (CLK_node'event and CLK_node = '1') then
2930
      if (EN_reg = '1' and CEN_node = '1') then
2931
           for i in 0 to DATA_WIDTH - 1 loop
2932
               v_MEM(v_AD*DATA_WIDTH+i) <= DI_node(i) after 1 ps;
2933
           end loop;
2934
      end if;
2935
    end if;
2936
  end process;
2937
 
2938
  DO_output_process: process (RST_node, EN_reg, DO_node, CLK_node)
2939
  begin
2940
     if (RST_node = '1') then
2941
         DO <= (others => '0');
2942
     elsif (CLK_node = '1' and CEN_node = '1') then
2943
         if (EN_reg = '1') then
2944
            if (WRITE_MODE = "RD_BEFORE_WR") then
2945
                for j in 0 to DATA_WIDTH - 1 loop
2946
                    DO(j) <= v_MEM(v_AD*DATA_WIDTH+j);
2947
                end loop;
2948
            else
2949
                DO <= DO_node;
2950
            end if;
2951
         else
2952
           DO <= DO_node;
2953
         end if;
2954
     end if;
2955
  end process;
2956
 
2957
  -- BRAM instance for SPRAM 
2958
  SPRAM_INST: SC_BRAM_16K_L
2959
 
2960
    generic map(
2961
         AWRITE_MODE    => WRITE_MODE,
2962
         WADDR_WIDTH_A  => ADDR_WIDTH,
2963
         RADDR_WIDTH_A  => ADDR_WIDTH,
2964
         WADDR_WIDTH_B  => ADDR_WIDTH,
2965
         RADDR_WIDTH_B  => ADDR_WIDTH,
2966
         WDATA_WIDTH_A  => DATA_WIDTH,
2967
         RDATA_WIDTH_A  => DATA_WIDTH,
2968
         WDATA_WIDTH_B  => DATA_WIDTH,
2969
         RDATA_WIDTH_B  => DATA_WIDTH,
2970
         ARRAY_SIZE     => open,
2971
         MEM_INIT_FLAG  => MEM_INIT_FLAG,
2972
         MEM_INIT_FILE  => MEM_INIT_FILE
2973
       )
2974
    port map (
2975
         WADA => AD_reg,
2976
         WEA  => EN_reg,
2977
         WDA  => DI_reg,
2978
         RADA => AD_reg,
2979
         REA  => REN_reg,
2980
         RDA  => DO_node,
2981
 
2982
         WADB => AD_reg,
2983
         WEB  => GND_sig,
2984
         WDB  => DI_reg,
2985
         RADB => AD_reg,
2986
         REB  => GND_sig,
2987
         RDB  => open
2988
      );
2989
 
2990
end LATTICE_BEHAV;
2991
 
2992
 
2993
 
2994
library IEEE;
2995
use IEEE.STD_LOGIC_1164.all;
2996
library IEEE;
2997
use IEEE.VITAL_Timing.all;
2998
 
2999
entity fifo_dc is
3000
  generic (
3001
         module_type      : string  := "FIFO_DC";
3002
         module_width     : integer := 1;
3003
         module_widthu    : integer := 1;
3004
         module_numwords  : integer := 2;
3005
         module_amfull_flag : integer := 1;
3006
         module_amempty_flag : integer := 1;
3007
         module_hint      : string  := "UNUSED");
3008
 
3009
  port (
3010
         Data          :  in  std_logic_vector (module_width-1 downto 0);
3011
         WrClock       :  in  std_logic;
3012
         WrEn          :  in  std_logic;
3013
         RdClock       :  in  std_logic;
3014
         RdEn          :  in  std_logic;
3015
         Reset          :  in  std_logic;
3016
         RPReset       :  in  std_logic;
3017
         Q             :  out std_logic_vector (module_width-1 downto 0);
3018
         Full          :  out std_logic;
3019
         Empty         :  out std_logic;
3020
         AlmostFull    :  out std_logic;
3021
         AlmostEmpty   :  out std_logic);
3022
 
3023
end fifo_dc;
3024
 
3025
architecture fun_simulation of fifo_dc is
3026
 
3027
  component SC_FIFO_16K_L
3028
 
3029
    generic (
3030
        WADDR_WIDTH    : integer :=  9;
3031
        WDATA_WIDTH    : integer := 32;
3032
        RADDR_WIDTH    : integer :=  9;
3033
        RDATA_WIDTH    : integer := 32;
3034
        ALMOST_FULL_X  : integer :=  1;
3035
        ALMOST_EMPTY_Y  : integer := 1;
3036
        MEM_INIT_FLAG  : integer := 0;
3037
        TERMINAL_COUNT : integer := 511;
3038
        MEM_INIT_FILE  : string  := "mem_init_file"
3039
 
3040
         );
3041
 
3042
    port (
3043
        WE      : in STD_LOGIC ;
3044
        WCLK    : in STD_LOGIC ;
3045
        RST     : in STD_LOGIC ;
3046
        RPRST   : in STD_LOGIC ;
3047
        RE      : in STD_LOGIC ;
3048
        RCLK    : in STD_LOGIC ;
3049
        FULLIN  : in STD_LOGIC ;
3050
        EMPTYIN : in STD_LOGIC ;
3051
        DI      : in STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0);
3052
 
3053
        FULL    : out STD_LOGIC ;
3054
        EMPTY   : out STD_LOGIC ;
3055
        AMFULL  : out STD_LOGIC ;
3056
        AMEMPTY : out STD_LOGIC ;
3057
        DO      : out STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0)
3058
 
3059
        );
3060
 
3061
end component;
3062
 
3063
     signal Rst, FullIn, EmptyIn : std_logic;
3064
 
3065
 
3066
  begin
3067
 
3068
      Rst     <= '1';
3069
      FullIn  <= '0';
3070
      EmptyIn <= '1';
3071
 
3072
 
3073
  SC_FIFO_inst : SC_FIFO_16K_L
3074
 
3075
    generic map (
3076
        WADDR_WIDTH     =>  module_widthu,
3077
        WDATA_WIDTH     =>  module_width,
3078
        RADDR_WIDTH     =>  module_widthu,
3079
        RDATA_WIDTH     =>  module_width,
3080
        ALMOST_FULL_X   =>  module_amfull_flag,
3081
        ALMOST_EMPTY_Y  =>  module_amempty_flag,
3082
        MEM_INIT_FLAG   =>  0,
3083
        TERMINAL_COUNT  =>  module_numwords - 1,
3084
        MEM_INIT_FILE   => open )
3085
 
3086
    port map (
3087
        WE         => WrEn,
3088
        WCLK       => WrClock,
3089
        RST        => Reset,
3090
        RPRST      => RPReset,
3091
        RE         => RdEn,
3092
        RCLK       => RdClock,
3093
        FULLIN     => FullIn,
3094
        EMPTYIN    => EmptyIn,
3095
        DI         => Data,
3096
 
3097
        FULL       => Full,
3098
        EMPTY      => Empty,
3099
        AMFULL     => AlmostFull,
3100
        AMEMPTY    => AlmostEmpty,
3101
        DO         => Q
3102
        );
3103
 
3104
end;library IEEE;
3105
use IEEE.STD_LOGIC_1164.all;
3106
library IEEE;
3107
use IEEE.VITAL_Timing.all;
3108
 
3109
entity fifo_dcx is
3110
  generic (
3111
         module_type      : string  := "FIFO_DCX";
3112
         module_widthw     : integer := 1;
3113
         module_widthr     : integer := 1;
3114
         module_widthuw    : integer := 1;
3115
         module_widthur    : integer := 1;
3116
         module_numwordsw  : integer := 2;
3117
         module_numwordsr  : integer := 2;
3118
         module_amfull_flag : integer := 1;
3119
         module_amempty_flag : integer := 1;
3120
         module_hint      : string  := "UNUSED");
3121
 
3122
  port (
3123
         Data          :  in  std_logic_vector (module_widthw-1 downto 0);
3124
         WrClock       :  in  std_logic;
3125
         WrEn          :  in  std_logic;
3126
         RdClock       :  in  std_logic;
3127
         RdEn          :  in  std_logic;
3128
         Reset          :  in  std_logic;
3129
         RPReset       :  in  std_logic;
3130
         Q             :  out std_logic_vector (module_widthr-1 downto 0);
3131
         Full          :  out std_logic;
3132
         Empty         :  out std_logic;
3133
         AlmostFull    :  out std_logic;
3134
         AlmostEmpty   :  out std_logic);
3135
 
3136
end fifo_dcx;
3137
 
3138
architecture fun_simulation of fifo_dcx is
3139
 
3140
  component SC_FIFO_V2_16K_L
3141
 
3142
    generic (
3143
        WADDR_WIDTH    : integer :=  9;
3144
        WDATA_WIDTH    : integer := 32;
3145
        RADDR_WIDTH    : integer :=  9;
3146
        RDATA_WIDTH    : integer := 32;
3147
        ALMOST_FULL_X  : integer :=  1;
3148
        ALMOST_EMPTY_Y  : integer := 1;
3149
        MEM_INIT_FLAG  : integer := 0;
3150
        TERMINAL_COUNT : integer := 511;
3151
        MEM_INIT_FILE  : string  := "mem_init_file"
3152
 
3153
         );
3154
 
3155
    port (
3156
        WE      : in STD_LOGIC ;
3157
        WCLK    : in STD_LOGIC ;
3158
        RST     : in STD_LOGIC ;
3159
        RPRST   : in STD_LOGIC ;
3160
        RE      : in STD_LOGIC ;
3161
        RCLK    : in STD_LOGIC ;
3162
        FULLIN  : in STD_LOGIC ;
3163
        EMPTYIN : in STD_LOGIC ;
3164
        DI      : in STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0);
3165
 
3166
        FULL    : out STD_LOGIC ;
3167
        EMPTY   : out STD_LOGIC ;
3168
        AMFULL  : out STD_LOGIC ;
3169
        AMEMPTY : out STD_LOGIC ;
3170
        DO      : out STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0)
3171
 
3172
        );
3173
 
3174
end component;
3175
 
3176
     signal FullIn, EmptyIn : std_logic;
3177
 
3178
 
3179
  begin
3180
 
3181
      FullIn  <= '0';
3182
      EmptyIn <= '1';
3183
 
3184
 
3185
  SC_FIFO_inst : SC_FIFO_V2_16K_L
3186
 
3187
    generic map (
3188
        WADDR_WIDTH     =>  module_widthuw,
3189
        WDATA_WIDTH     =>  module_widthw,
3190
        RADDR_WIDTH     =>  module_widthur,
3191
        RDATA_WIDTH     =>  module_widthr,
3192
        ALMOST_FULL_X   =>  module_amfull_flag,
3193
        ALMOST_EMPTY_Y  =>  module_amempty_flag,
3194
        MEM_INIT_FLAG   =>  0,
3195
        TERMINAL_COUNT  =>  module_numwordsw - 1,
3196
        MEM_INIT_FILE   => open )
3197
 
3198
    port map (
3199
        WE         => WrEn,
3200
        WCLK       => WrClock,
3201
        RST        => Reset,
3202
        RPRST      => RPReset,
3203
        RE         => RdEn,
3204
        RCLK       => RdClock,
3205
        FULLIN     => FullIn,
3206
        EMPTYIN    => EmptyIn,
3207
        DI         => Data,
3208
 
3209
        FULL       => Full,
3210
        EMPTY      => Empty,
3211
        AMFULL     => AlmostFull,
3212
        AMEMPTY    => AlmostEmpty,
3213
        DO         => Q
3214
        );
3215
 
3216
end;
3217
library IEEE;
3218
use IEEE.STD_LOGIC_1164.all;
3219
library IEEE;
3220
use IEEE.VITAL_Timing.all;
3221
 
3222
use work.components.all;
3223
 
3224
entity ram_dp is
3225
  generic(
3226
           module_type             : string := "RAM_DP";
3227
           module_widthw           : integer := 1;
3228
           module_widthr           : integer := 1;
3229
           module_numwordsw        : integer := 1;
3230
           module_widthadw         : integer := 1;
3231
           module_widthadr         : integer := 1;
3232
           module_numwordsr        : integer := 1;
3233
           module_indata           : string := "REGISTERED";
3234
           module_outdata          : string := "UNREGISTERED";
3235
           module_addressw_control : string := "REGISTERED";
3236
           module_addressr_control : string := "REGISTERED";
3237
           module_gsr              : string := "DISABLED";
3238
           module_hint             : string := "UNUSED";
3239
           module_init_file        : string := "");
3240
 
3241
 
3242
  port(
3243
           Data        : in  std_logic_vector (module_widthw-1 downto 0);
3244
           WrAddress   : in  std_logic_vector (module_widthadw-1 downto 0);
3245
           RdAddress   : in  std_logic_vector (module_widthadr-1 downto 0);
3246
           WrClock     : in std_logic;
3247
           WrClockEn   : in std_logic;
3248
           RdClock     : in std_logic;
3249
           RdClockEn   : in std_logic;
3250
           WE          : in std_logic;
3251
           Reset       : in std_logic;
3252
           Q           : out std_logic_vector (module_widthr-1 downto 0));
3253
 
3254
end ram_dp;
3255
 
3256
architecture fun_simulation of ram_dp is
3257
 
3258
component SC_PDPRAM_16K_L
3259
 
3260
  generic (
3261
        WADDR_WIDTH    : integer := 13;
3262
        WDATA_WIDTH    : integer := 2;
3263
        RADDR_WIDTH    : integer := 13;
3264
        RDATA_WIDTH    : integer := 2;
3265
        ARRAY_SIZE     : integer := 511;
3266
        MEM_INIT_FLAG  : integer := 0;
3267
        MEM_INIT_FILE  : string  := "mem_init_file"
3268
 
3269
        );
3270
 
3271
  port (
3272
        WCEN : in  STD_LOGIC ;
3273
        WCLK : in  STD_LOGIC ;
3274
        WE   : in  STD_LOGIC ;
3275
        WCS  : in  STD_LOGIC_VECTOR (1 downto 0);
3276
        RCLK : in  STD_LOGIC;
3277
        RCEN : in  STD_LOGIC;
3278
        RST  : in  STD_LOGIC ;
3279
 
3280
        WD   : in  STD_LOGIC_VECTOR (WDATA_WIDTH -1 downto 0);
3281
        WAD  : in  STD_LOGIC_VECTOR (WADDR_WIDTH -1 downto 0);
3282
        RAD  : in  STD_LOGIC_VECTOR (RADDR_WIDTH -1 downto 0);
3283
        RD   : out STD_LOGIC_VECTOR (RDATA_WIDTH -1 downto 0)
3284
       );
3285
 
3286
end component;
3287
 
3288
     signal cs        : std_logic_vector ( 1 downto 0);
3289
     signal Q_K       : std_logic_vector (module_widthr-1 downto 0);
3290
     signal Q_K_reg   : std_logic_vector (module_widthr-1 downto 0);
3291
     CONSTANT  module_init_flag       :  integer := init_flag(module_init_file);
3292
 
3293
  begin
3294
 
3295
     cs <= "11";
3296
 
3297
      OutRegister : process(RdClock, Reset)
3298
       begin
3299
           if (Reset = '1') then
3300
                Q_K_reg <= (others => '0');
3301
           elsif (RdClock'EVENT and RdClock = '1') then
3302
              if (RdClockEn = '1') then
3303
                Q_K_reg <= Q_K;
3304
              elsif (RdClockEn /= '0') then
3305
                Q_K_reg <= (others => 'X');
3306
              end if;
3307
           end if;
3308
       end process;
3309
 
3310
      SelectOut  : process (Q_K , Q_K_reg)
3311
        begin
3312
              if(module_outdata = "UNREGISTERED" and module_addressr_control = "REGISTERED") then
3313
                     Q <= Q_K;
3314
              elsif(module_outdata = "REGISTERED" and module_addressr_control = "REGISTERED") then
3315
                     Q <= Q_K_reg;
3316
              elsif(module_indata = "UNREGISTERED") then
3317
                    assert false report "Error: module_indata should be REGISTERED" severity ERROR;
3318
              elsif(module_addressw_control = "UNREGISTERED") then
3319
                    assert false report "Error: module_addressw_control should be REGISTERED" severity ERROR;
3320
              elsif(module_addressr_control = "UNREGISTERED") then
3321
                    assert false report "Error: module_addressr_control should be REGISTERED" severity ERROR;
3322
              end if;
3323
        end process;
3324
 
3325
 
3326
   PDPRAM_inst : SC_PDPRAM_16K_L
3327
 
3328
  generic map(
3329
        WADDR_WIDTH    => module_widthadw,
3330
        WDATA_WIDTH    => module_widthw,
3331
        RADDR_WIDTH    => module_widthadr,
3332
        RDATA_WIDTH    => module_widthr,
3333
        MEM_INIT_FLAG  => module_init_flag,
3334
        ARRAY_SIZE     => module_numwordsw*module_widthw,
3335
        MEM_INIT_FILE  => module_init_file)
3336
 
3337
  port map(
3338
        WCEN =>  WrClockEn,
3339
        WCLK =>  WrClock,
3340
        WE   =>  WE,
3341
        WCS  =>  cs,
3342
        RCLK =>  RdClock,
3343
        RCEN =>  RdClockEn,
3344
        RST  =>  Reset,
3345
 
3346
        WD   =>  Data,
3347
        WAD  =>  WrAddress,
3348
        RAD  =>  RdAddress,
3349
        RD   => Q_K
3350
       );
3351
end;library IEEE;
3352
use IEEE.STD_LOGIC_1164.all;
3353
library IEEE;
3354
use IEEE.VITAL_Timing.all;
3355
 
3356
use work.components.all;
3357
 
3358
entity ram_dp_true is
3359
generic (
3360
              module_type               : string := "RAM_DP_TRUE";
3361
              module_widtha             : positive;
3362
              module_widthada           : positive;
3363
              module_numwordsa          : positive;
3364
              module_widthb             : positive;
3365
              module_widthadb           : positive;
3366
              module_numwordsb          : positive;
3367
              module_indata             : string :="REGISTERED";
3368
              module_outdata            : string :="UNREGISTERED";
3369
              module_addressa_control   : string :="REGISTERED";
3370
              module_addressb_control   : string :="REGISTERED";
3371
              module_init_file          : string := "";
3372
              module_hint               : string :="UNUSED";
3373
              module_gsr                : string := "DISABLED";
3374
              module_writemode_a        : string := "NORMAL";
3375
              module_writemode_b        : string := "NORMAL");
3376
      port (
3377
              DataInA       : in std_logic_vector(module_widtha-1 downto 0);
3378
              AddressA      : in std_logic_vector(module_widthada-1 downto 0);
3379
              DataInB       : in std_logic_vector(module_widthb-1 downto 0);
3380
              AddressB      : in std_logic_vector(module_widthadb-1 downto 0);
3381
              ClockA        : in std_logic := '0';
3382
              ClockEnA      : in std_logic := '0';
3383
              ClockB        : in std_logic := '0';
3384
              ClockEnB      : in std_logic := '0';
3385
              WrA           : in std_logic;
3386
              WrB           : in std_logic;
3387
              ResetA        : in std_logic;
3388
              ResetB        : in std_logic;
3389
              QA            : out std_logic_vector(module_widtha-1 downto 0);
3390
              QB            : out std_logic_vector(module_widthb-1 downto 0));
3391
end ram_dp_true;
3392
 
3393
architecture fun_simulation of ram_dp_true is
3394
 
3395
component SC_DPRAM_16K_L
3396
  generic (
3397
        AWRITE_MODE    : string  := "NORMAL";
3398
        BWRITE_MODE    : string  := "NORMAL";
3399
        ADDR_WIDTH_A     : integer := 13;
3400
        DATA_WIDTH_A     : integer := 2;
3401
        ADDR_WIDTH_B     : integer := 14;
3402
        DATA_WIDTH_B     : integer := 1;
3403
        MEM_INIT_FLAG  : integer := 0;
3404
        ARRAY_SIZE     : integer := 511;
3405
        MEM_INIT_FILE  : string  := "mem_init_file"
3406
        );
3407
  port (
3408
        CENA : in  STD_LOGIC ;
3409
        CLKA : in  STD_LOGIC ;
3410
        WRA  : in  STD_LOGIC ;
3411
        CSA  : in  STD_LOGIC_VECTOR (1 downto 0);
3412
        RSTA : in  STD_LOGIC ;
3413
        DIA  : in  STD_LOGIC_VECTOR (DATA_WIDTH_A -1 downto 0);
3414
        ADA  : in  STD_LOGIC_VECTOR (ADDR_WIDTH_A -1 downto 0);
3415
        DOA  : out STD_LOGIC_VECTOR (DATA_WIDTH_A -1 downto 0);
3416
 
3417
        CENB : in  STD_LOGIC ;
3418
        CLKB : in  STD_LOGIC ;
3419
        WRB  : in  STD_LOGIC ;
3420
        CSB  : in  STD_LOGIC_VECTOR (1 downto 0);
3421
        RSTB : in  STD_LOGIC ;
3422
        DIB  : in  STD_LOGIC_VECTOR (DATA_WIDTH_B -1 downto 0);
3423
        ADB  : in  STD_LOGIC_VECTOR (ADDR_WIDTH_B -1 downto 0);
3424
        DOB  : out STD_LOGIC_VECTOR (DATA_WIDTH_B -1 downto 0)
3425
        );
3426
 
3427
end component;
3428
 
3429
      signal CS : std_logic_vector ( 1 downto 0);
3430
      signal QA_int, QA_int_reg  : std_logic_vector(module_widtha-1 downto 0);
3431
      signal QB_int, QB_int_reg  : std_logic_vector(module_widthb-1 downto 0);
3432
     CONSTANT  module_init_flag       :  integer := init_flag(module_init_file);
3433
 
3434
begin
3435
 
3436
      CS <= "11";
3437
 
3438
      OutRegisterA : process(ClockA, ResetA)
3439
       begin
3440
           if(ResetA = '1') then QA_int_reg <= (others => '0');
3441
           elsif (ClockA'EVENT and ClockA = '1') then
3442
              if (ClockEnA = '1') then
3443
               QA_int_reg <= QA_int;
3444
              elsif (ClockEnA /= '0') then
3445
               QA_int_reg <= (others => 'X');
3446
              end if;
3447
           end if;
3448
       end process;
3449
 
3450
      OutRegisterB : process(ClockB, ResetB)
3451
       begin
3452
           if(ResetB = '1') then QB_int_reg <= (others => '0');
3453
           elsif (ClockB'EVENT and ClockB = '1') then
3454
              if (ClockEnB = '1') then
3455
               QB_int_reg <= QB_int;
3456
              elsif (ClockEnB /= '0') then
3457
               QB_int_reg <= (others => 'X');
3458
              end if;
3459
           end if;
3460
       end process;
3461
 
3462
      SelectA   : process (QA_int , QA_int_reg)
3463
        begin
3464
              if(module_outdata = "UNREGISTERED" and module_addressa_control = "REGISTERED") then
3465
                     QA <= QA_int;
3466
              elsif(module_outdata = "REGISTERED" and module_addressa_control = "REGISTERED") then
3467
                     QA <= QA_int_reg;
3468
              elsif(module_indata = "UNREGISTERED") then
3469
                    assert false report "Error: module_indata should be REGISTERED" severity ERROR;
3470
              elsif(module_addressa_control = "UNREGISTERED") then
3471
                    assert false report "Error: module_addressa_control should be REGISTERED" severity ERROR;
3472
              end if;
3473
        end process;
3474
 
3475
      SelectB   : process (QB_int , QB_int_reg)
3476
        begin
3477
              if(module_outdata = "UNREGISTERED" and module_addressb_control = "REGISTERED") then
3478
                     QB <= QB_int;
3479
              elsif(module_outdata = "REGISTERED" and module_addressb_control = "REGISTERED") then
3480
                     QB <= QB_int_reg;
3481
              elsif(module_addressa_control = "UNREGISTERED") then
3482
                    assert false report "Error: module_addressa_control should be REGISTERED" severity ERROR;
3483
              end if;
3484
       end process;
3485
 
3486
RAM_DP_INST : SC_DPRAM_16K_L
3487
 
3488
    generic map(
3489
         ADDR_WIDTH_A  => module_widthada,
3490
         DATA_WIDTH_A  => module_widtha,
3491
         ADDR_WIDTH_B  => module_widthadb,
3492
         DATA_WIDTH_B  => module_widthb,
3493
         MEM_INIT_FLAG => module_init_flag,
3494
         ARRAY_SIZE    => module_numwordsa*module_widtha,
3495
         MEM_INIT_FILE => module_init_file,
3496
         AWRITE_MODE   => module_writemode_a,
3497
         BWRITE_MODE   => module_writemode_b
3498
       )
3499
    port map (
3500
         CENA => ClockEnA,
3501
         CLKA => ClockA,
3502
         WRA  => WrA,
3503
         CSA  => CS,
3504
         RSTA => ResetA,
3505
         DIA  => DataInA,
3506
         ADA  => AddressA,
3507
         DOA  => QA_int,
3508
 
3509
         CENB => ClockEnB,
3510
         CLKB => ClockB,
3511
         WRB  => WrB,
3512
         CSB  => CS,
3513
         RSTB => ResetB,
3514
         DIB  => DataInB,
3515
         ADB  => AddressB,
3516
         DOB  => QB_int
3517
      );
3518
end;
3519
library IEEE;
3520
use IEEE.STD_LOGIC_1164.all;
3521
library IEEE;
3522
use IEEE.VITAL_Timing.all;
3523
 
3524
use work.components.all;
3525
 
3526
entity ram_dq  is
3527
  generic(
3528
           module_type            : string  := "RAM_DQ";
3529
           module_width           : integer := 1;
3530
           module_numwords        : integer := 1;
3531
           module_widthad         : integer := 1;
3532
           module_indata          : string  := "REGISTERED";
3533
           module_outdata         : string  := "UNREGISTERED";
3534
           module_address_control : string  := "REGISTERED";
3535
           module_init_file       : string := "";
3536
           module_hint            : string  := "UNUSED";
3537
           module_gsr             : string := "DISABLED";
3538
           module_writemode       : string  := "NORMAL");
3539
 
3540
  port(
3541
 
3542
           Data                : in  std_logic_vector (module_width-1 downto 0);
3543
           Address             : in  std_logic_vector (module_widthad-1 downto 0);
3544
           Clock               : in  std_logic;
3545
           ClockEn             : in  std_logic;
3546
           WE                  : in  std_logic;
3547
           Reset               : in  std_logic;
3548
           Q                   : out std_logic_vector (module_width-1 downto 0));
3549
  end ram_dq;
3550
 
3551
 
3552
architecture fun_simulation of ram_dq is
3553
 
3554
 
3555
  component SC_SPRAM_16K_L
3556
 
3557
  generic (
3558
        WRITE_MODE     : string  := "NORMAL";
3559
        ADDR_WIDTH     : integer := 13;
3560
        DATA_WIDTH     : integer := 2;
3561
        MEM_INIT_FLAG  : integer := 1;
3562
        ARRAY_SIZE     : integer := 511;
3563
        MEM_INIT_FILE  : string  := "qq.dat"
3564
 
3565
        );
3566
 
3567
  port (
3568
        CEN : in  STD_LOGIC ;
3569
        CLK : in  STD_LOGIC ;
3570
         WR : in  STD_LOGIC ;
3571
         CS : in  STD_LOGIC_VECTOR (1 downto 0);
3572
        RST : in  STD_LOGIC ;
3573
         DI : in  STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0);
3574
         AD : in  STD_LOGIC_VECTOR (ADDR_WIDTH-1 downto 0);
3575
         DO : out STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0)
3576
       );
3577
 
3578
end component;
3579
 
3580
    signal cs   : std_logic_vector (1 downto 0);
3581
    signal Q_K       : std_logic_vector (module_width-1 downto 0);
3582
    signal Q_K_reg   : std_logic_vector (module_width-1 downto 0);
3583
    CONSTANT  module_init_flag       :  integer := init_flag(module_init_file);
3584
 
3585
  begin
3586
 
3587
      cs <= "11";
3588
 
3589
      OutRegister : process(Clock, Reset)
3590
       begin
3591
           if (Reset = '1') then
3592
               Q_K_reg <= (others => '0');
3593
           elsif (Clock'EVENT and Clock = '1') then
3594
              if (ClockEn = '1') then
3595
               Q_K_reg <= Q_K;
3596
              elsif (ClockEn /= '0') then
3597
               Q_K_reg <= (others => 'X');
3598
              end if;
3599
           end if;
3600
       end process;
3601
 
3602
      SelectOut  : process (Q_K , Q_K_reg)
3603
        begin
3604
              if(module_outdata = "UNREGISTERED" and module_address_control = "REGISTERED") then
3605
                     Q <= Q_K;
3606
              elsif(module_outdata = "REGISTERED" and module_address_control = "REGISTERED") then
3607
                     Q <= Q_K_reg;
3608
              elsif(module_indata = "UNREGISTERED") then
3609
                    assert false report "Error: module_indata should be REGISTERED" severity ERROR;
3610
              elsif(module_address_control = "UNREGISTERED") then
3611
                    assert false report "Error: module_address_control should be REGISTERED" severity ERROR;
3612
              end if;
3613
        end process;
3614
 
3615
  SPRAM_inst : SC_SPRAM_16K_L
3616
 
3617
  generic map (
3618
        ADDR_WIDTH     => module_widthad,
3619
        DATA_WIDTH     => module_width,
3620
        MEM_INIT_FLAG  => module_init_flag,
3621
        ARRAY_SIZE     => module_numwords * module_width,
3622
        MEM_INIT_FILE  => module_init_file,
3623
        WRITE_MODE     => module_writemode)
3624
 
3625
  port map (
3626
        CEN  => ClockEn,
3627
        CLK  => Clock,
3628
         WR  => WE,
3629
         CS  => cs,
3630
        RST  => Reset,
3631
         DI  => Data,
3632
         AD  => Address,
3633
         DO  => Q_K
3634
       );
3635
end;
3636
library IEEE;
3637
use IEEE.STD_LOGIC_1164.all;
3638
library IEEE;
3639
use IEEE.VITAL_Timing.all;
3640
 
3641
entity rom is
3642
  generic (
3643
            module_type               : string  := "ROM";
3644
            module_width              : integer := 1;
3645
            module_numwords           : integer := 1;
3646
            module_widthad            : integer := 1;
3647
            module_outdata            : string  := "REGISTERED";
3648
            module_address_control    : string  := "REGISTERED";
3649
            module_init_file          : string := "init_file";
3650
            module_gsr                : string := "DISABLED";
3651
            module_hint               : string  := "UNUSED");
3652
  port (
3653
            Address       : in  std_logic_vector (module_widthad-1 downto 0);
3654
            OutClock      : in  std_logic;
3655
            OutClockEn    : in  std_logic;
3656
            Reset         : in  std_logic;
3657
            Q             : out std_logic_vector (module_width-1 downto 0));
3658
end rom;
3659
 
3660
architecture fun_simulation of rom is
3661
 
3662
  component  SC_SPRAM_16K_L
3663
 
3664
    generic (
3665
        ADDR_WIDTH     : integer := 13;
3666
        DATA_WIDTH     : integer := 2;
3667
        ARRAY_SIZE     : integer := 511;
3668
        MEM_INIT_FLAG  : integer := 1;
3669
        MEM_INIT_FILE  : string  := "qq.dat"
3670
 
3671
        );
3672
 
3673
    port (
3674
        CEN : in  STD_LOGIC ;
3675
        CLK : in  STD_LOGIC ;
3676
         WR : in  STD_LOGIC ;
3677
         CS : in  STD_LOGIC_VECTOR (1 downto 0);
3678
        RST : in  STD_LOGIC ;
3679
         DI : in  STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0);
3680
         AD : in  STD_LOGIC_VECTOR (ADDR_WIDTH-1 downto 0);
3681
         DO : out STD_LOGIC_VECTOR (DATA_WIDTH-1 downto 0)
3682
       );
3683
 
3684
  end component;
3685
 
3686
        signal cs : std_logic_vector ( 1 downto 0);
3687
        signal DI_sig : std_logic_vector (module_width-1 downto 0);
3688
        signal WE_sig : std_logic;
3689
 
3690
        signal Q_K       : std_logic_vector (module_width-1 downto 0);
3691
        signal Q_K_reg   : std_logic_vector (module_width-1 downto 0);
3692
 
3693
  begin
3694
 
3695
        cs <= "11";
3696
        WE_sig <= '0';
3697
 
3698
      OutRegister : process(OutClock, Reset)
3699
       begin
3700
           if (Reset = '1') then
3701
               Q_K_reg <= (others => '0');
3702
           elsif (OutClock'EVENT and OutClock = '1') then
3703
              if(OutClockEn = '1') then
3704
               Q_K_reg <= Q_K;
3705
              elsif(OutClockEn /= '0') then
3706
               Q_K_reg <= (others => 'X' );
3707
              end if;
3708
           end if;
3709
       end process;
3710
 
3711
      SelectOut  : process (Q_K , Q_K_reg)
3712
        begin
3713
              if(module_outdata = "UNREGISTERED" and module_address_control = "REGISTERED") then
3714
                     Q <= Q_K;
3715
              elsif(module_outdata = "REGISTERED" and module_address_control = "REGISTERED") then
3716
                     Q <= Q_K_reg;
3717
              elsif(module_address_control = "UNREGISTERED") then
3718
                    assert false report "Error: module_address_control should be REGISTERED" severity ERROR;
3719
              end if;
3720
        end process;
3721
 
3722
    SPRAM_inst :  SC_SPRAM_16K_L
3723
 
3724
      generic map(
3725
           ADDR_WIDTH     =>  module_widthad,
3726
           DATA_WIDTH     =>  module_width,
3727
           MEM_INIT_FLAG  =>  1,
3728
           ARRAY_SIZE     =>  module_numwords * module_width,
3729
           MEM_INIT_FILE  =>  module_init_file)
3730
 
3731
      port map(
3732
           CEN    =>  OutClockEn,
3733
           CLK    =>  OutClock,
3734
           WR     =>  WE_sig,
3735
           CS     =>  cs,
3736
           RST    =>  Reset,
3737
           DI     =>  DI_sig,
3738
           AD     =>  Address,
3739
           DO     =>  Q_K
3740
       );
3741
end;

powered by: WebSVN 2.1.0

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