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

Subversion Repositories xmatchpro

[/] [xmatchpro/] [trunk/] [xmw4-comdec/] [xmatch_sim7/] [coregen/] [DP_RAM_XILINX_256/] [simulation/] [bmg_stim_gen.vhd] - Blame information for rev 9

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 9 eejlny
 
2
 
3
 
4
--------------------------------------------------------------------------------
5
--
6
-- BLK MEM GEN v7_3 Core - Stimulus Generator For Simple Dual Port RAM
7
--
8
--------------------------------------------------------------------------------
9
--
10
-- (c) Copyright 2006_3010 Xilinx, Inc. All rights reserved.
11
--
12
-- This file contains confidential and proprietary information
13
-- of Xilinx, Inc. and is protected under U.S. and
14
-- international copyright and other intellectual property
15
-- laws.
16
--
17
-- DISCLAIMER
18
-- This disclaimer is not a license and does not grant any
19
-- rights to the materials distributed herewith. Except as
20
-- otherwise provided in a valid license issued to you by
21
-- Xilinx, and to the maximum extent permitted by applicable
22
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
23
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
24
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
25
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
26
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
27
-- (2) Xilinx shall not be liable (whether in contract or tort,
28
-- including negligence, or under any other theory of
29
-- liability) for any loss or damage of any kind or nature
30
-- related to, arising under or in connection with these
31
-- materials, including for any direct, or any indirect,
32
-- special, incidental, or consequential loss or damage
33
-- (including loss of data, profits, goodwill, or any type of
34
-- loss or damage suffered as a result of any action brought
35
-- by a third party) even if such damage or loss was
36
-- reasonably foreseeable or Xilinx had been advised of the
37
-- possibility of the same.
38
--
39
-- CRITICAL APPLICATIONS
40
-- Xilinx products are not designed or intended to be fail-
41
-- safe, or for use in any application requiring fail-safe
42
-- performance, such as life-support or safety devices or
43
-- systems, Class III medical devices, nuclear facilities,
44
-- applications related to the deployment of airbags, or any
45
-- other applications that could lead to death, personal
46
-- injury, or severe property or environmental damage
47
-- (individually and collectively, "Critical
48
-- Applications"). Customer assumes the sole risk and
49
-- liability of any use of Xilinx products in Critical
50
-- Applications, subject only to applicable laws and
51
-- regulations governing limitations on product liability.
52
--
53
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
54
-- PART OF THIS FILE AT ALL TIMES.
55
 
56
--------------------------------------------------------------------------------
57
--
58
-- Filename: bmg_stim_gen.vhd
59
--
60
-- Description:
61
--  Stimulus Generation For SDP Configuration
62
--  100 Writes and 100 Reads will be performed in a repeatitive loop till the 
63
--  simulation ends
64
--
65
--------------------------------------------------------------------------------
66
-- Author: IP Solutions Division
67
--
68
-- History: Sep 12, 2011 - First Release
69
--------------------------------------------------------------------------------
70
--
71
--------------------------------------------------------------------------------
72
-- Library Declarations
73
--------------------------------------------------------------------------------
74
LIBRARY IEEE;
75
USE IEEE.STD_LOGIC_1164.ALL;
76
USE IEEE.STD_LOGIC_ARITH.ALL;
77
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
78
USE IEEE.STD_LOGIC_MISC.ALL;
79
 
80
 LIBRARY work;
81
USE work.ALL;
82
USE work.BMG_TB_PKG.ALL;
83
 
84
 
85
ENTITY REGISTER_LOGIC IS
86
  PORT(
87
    Q   : OUT STD_LOGIC;
88
    CLK : IN STD_LOGIC;
89
    RST : IN STD_LOGIC;
90
    D   : IN STD_LOGIC
91
  );
92
END REGISTER_LOGIC;
93
 
94
ARCHITECTURE REGISTER_ARCH OF REGISTER_LOGIC IS
95
SIGNAL Q_O : STD_LOGIC :='0';
96
BEGIN
97
  Q <= Q_O;
98
  FF_BEH: PROCESS(CLK)
99
  BEGIN
100
     IF(RISING_EDGE(CLK)) THEN
101
        IF(RST ='1') THEN
102
           Q_O <= '0';
103
        ELSE
104
           Q_O <= D;
105
        END IF;
106
     END IF;
107
  END PROCESS;
108
END REGISTER_ARCH;
109
 
110
LIBRARY IEEE;
111
USE IEEE.STD_LOGIC_1164.ALL;
112
USE IEEE.STD_LOGIC_ARITH.ALL;
113
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
114
USE IEEE.STD_LOGIC_MISC.ALL;
115
 
116
LIBRARY work;
117
USE work.ALL;
118
USE work.BMG_TB_PKG.ALL;
119
 
120
 
121
ENTITY BMG_STIM_GEN IS
122
      PORT (
123
            CLKA : IN STD_LOGIC;
124
            CLKB : IN STD_LOGIC;
125
            TB_RST : IN STD_LOGIC;
126
            ADDRA: OUT  STD_LOGIC_VECTOR(7 DOWNTO 0) := (OTHERS => '0');
127
            DINA : OUT  STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
128
            WEA : OUT STD_LOGIC_VECTOR (0 DOWNTO 0) := (OTHERS => '0');
129
            ADDRB: OUT  STD_LOGIC_VECTOR(7 DOWNTO 0) := (OTHERS => '0');
130
            ENB : OUT STD_LOGIC :='0';
131
                CHECK_DATA: OUT STD_LOGIC:='0'
132
          );
133
END BMG_STIM_GEN;
134
 
135
 
136
ARCHITECTURE BEHAVIORAL OF BMG_STIM_GEN IS
137
 
138
CONSTANT ZERO                    : STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
139
SIGNAL   WRITE_ADDR              : STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
140
SIGNAL   READ_ADDR               : STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
141
SIGNAL   DINA_INT                : STD_LOGIC_VECTOR(31 DOWNTO 0) := (OTHERS => '0');
142
SIGNAL   DO_WRITE                : STD_LOGIC := '0';
143
SIGNAL   DO_READ                 : STD_LOGIC := '0';
144
SIGNAL   DO_READ_R               : STD_LOGIC := '0';
145
SIGNAL   DO_READ_REG             : STD_LOGIC_VECTOR(5 DOWNTO 0) :=(OTHERS => '0');
146
SIGNAL   PORTA_WR                : STD_LOGIC:='0';
147
SIGNAL   COUNT                   : INTEGER :=0;
148
SIGNAL   INCR_WR_CNT             : STD_LOGIC:='0';
149
SIGNAL   PORTA_WR_COMPLETE       : STD_LOGIC :='0';
150
SIGNAL   PORTB_RD                : STD_LOGIC:='0';
151
SIGNAL   COUNT_RD                : INTEGER :=0;
152
SIGNAL   INCR_RD_CNT             : STD_LOGIC:='0';
153
SIGNAL   PORTB_RD_COMPLETE       : STD_LOGIC :='0';
154
SIGNAL   LATCH_PORTA_WR_COMPLETE : STD_LOGIC :='0';
155
SIGNAL   PORTB_RD_HAPPENED       : STD_LOGIC := '0';
156
SIGNAL   PORTA_WR_L1             :STD_LOGIC  := '0';
157
SIGNAL   PORTA_WR_L2             :STD_LOGIC  := '0';
158
SIGNAL   PORTB_RD_R2             :STD_LOGIC  := '0';
159
SIGNAL   PORTB_RD_R1             :STD_LOGIC  := '0';
160
SIGNAL   LATCH_PORTB_RD_COMPLETE : STD_LOGIC :='0';
161
SIGNAL   PORTA_WR_HAPPENED       : STD_LOGIC := '0';
162
SIGNAL   PORTB_RD_L1             : STD_LOGIC  := '0';
163
SIGNAL   PORTB_RD_L2             : STD_LOGIC  := '0';
164
SIGNAL   PORTA_WR_R2             : STD_LOGIC  := '0';
165
SIGNAL   PORTA_WR_R1             : STD_LOGIC  := '0';
166
 
167
CONSTANT WR_RD_DEEP_COUNT :INTEGER :=8;
168
CONSTANT WR_DEEP_COUNT    : INTEGER := if_then_else((8 <= 8),WR_RD_DEEP_COUNT,
169
                                              ((32/32)*WR_RD_DEEP_COUNT));
170
CONSTANT RD_DEEP_COUNT    : INTEGER := if_then_else((8 <= 8),WR_RD_DEEP_COUNT,
171
                                              ((32/32)*WR_RD_DEEP_COUNT));
172
 
173
BEGIN
174
 
175
   ADDRA <= WRITE_ADDR(7 DOWNTO 0) ;
176
   DINA  <= DINA_INT ;
177
   ADDRB <= READ_ADDR(7 DOWNTO 0) when (DO_READ='1') else (OTHERS=>'0');
178
   CHECK_DATA <= DO_READ;
179
 
180
  RD_ADDR_GEN_INST:ENTITY work.ADDR_GEN
181
    GENERIC MAP(
182
      C_MAX_DEPTH => 256 ,
183
      RST_INC => 1    )
184
    PORT MAP(
185
       CLK        => CLKB,
186
       RST        => TB_RST,
187
       EN         => DO_READ,
188
       LOAD       => '0',
189
           LOAD_VALUE => ZERO,
190
       ADDR_OUT   => READ_ADDR
191
    );
192
 
193
  WR_ADDR_GEN_INST:ENTITY work.ADDR_GEN
194
    GENERIC MAP(
195
      C_MAX_DEPTH => 256,
196
      RST_INC => 1    )
197
    PORT MAP(
198
       CLK        => CLKA,
199
       RST        => TB_RST,
200
           EN         => DO_WRITE,
201
       LOAD       => '0',
202
       LOAD_VALUE => ZERO,
203
           ADDR_OUT   => WRITE_ADDR
204
      );
205
 
206
  WR_DATA_GEN_INST:ENTITY work.DATA_GEN
207
    GENERIC MAP (
208
       DATA_GEN_WIDTH => 32,
209
       DOUT_WIDTH     => 32 ,
210
       DATA_PART_CNT  => 1,
211
       SEED           => 2)
212
    PORT MAP (
213
       CLK      => CLKA,
214
           RST      => TB_RST,
215
       EN       => DO_WRITE,
216
       DATA_OUT => DINA_INT
217
    );
218
 
219
 
220
  PORTA_WR_PROCESS: PROCESS(CLKA)
221
  BEGIN
222
    IF(RISING_EDGE(CLKA)) THEN
223
      IF(TB_RST='1') THEN
224
        PORTA_WR<='1';
225
      ELSE
226
        PORTA_WR<=PORTB_RD_COMPLETE;
227
      END IF;
228
    END IF;
229
  END PROCESS;
230
 
231
  PORTB_RD_PROCESS: PROCESS(CLKB)
232
  BEGIN
233
    IF(RISING_EDGE(CLKB)) THEN
234
      IF(TB_RST='1') THEN
235
        PORTB_RD<='0';
236
      ELSE
237
        PORTB_RD<=PORTA_WR_L2;
238
      END IF;
239
    END IF;
240
  END PROCESS;
241
 
242
  PORTB_RD_COMPLETE_LATCH: PROCESS(CLKB)
243
    BEGIN
244
    IF(RISING_EDGE(CLKB)) THEN
245
      IF(TB_RST='1') THEN
246
        LATCH_PORTB_RD_COMPLETE<='0';
247
      ELSIF(PORTB_RD_COMPLETE='1') THEN
248
        LATCH_PORTB_RD_COMPLETE <='1';
249
      ELSIF(PORTA_WR_HAPPENED='1') THEN
250
        LATCH_PORTB_RD_COMPLETE<='0';
251
      END IF;
252
    END IF;
253
  END PROCESS;
254
 
255
  PROCESS(CLKA)
256
  BEGIN
257
    IF(RISING_EDGE(CLKA)) THEN
258
      IF(TB_RST='1') THEN
259
        PORTB_RD_L1 <='0';
260
        PORTB_RD_L2 <='0';
261
      ELSE
262
       PORTB_RD_L1 <= LATCH_PORTB_RD_COMPLETE;
263
       PORTB_RD_L2 <= PORTB_RD_L1;
264
      END IF;
265
   END IF;
266
  END PROCESS;
267
 
268
  PROCESS(CLKB)
269
  BEGIN
270
    IF(RISING_EDGE(CLKB)) THEN
271
      IF(TB_RST='1') THEN
272
        PORTA_WR_R1 <='0';
273
        PORTA_WR_R2 <='0';
274
      ELSE
275
       PORTA_WR_R1 <= PORTA_WR;
276
       PORTA_WR_R2 <= PORTA_WR_R1;
277
      END IF;
278
   END IF;
279
  END PROCESS;
280
 
281
  PORTA_WR_HAPPENED <= PORTA_WR_R2;
282
 
283
  PORTA_WR_COMPLETE_LATCH: PROCESS(CLKA)
284
    BEGIN
285
    IF(RISING_EDGE(CLKA)) THEN
286
      IF(TB_RST='1') THEN
287
        LATCH_PORTA_WR_COMPLETE<='0';
288
      ELSIF(PORTA_WR_COMPLETE='1') THEN
289
        LATCH_PORTA_WR_COMPLETE <='1';
290
      --ELSIF(PORTB_RD_HAPPENED='1') THEN
291
      ELSE
292
        LATCH_PORTA_WR_COMPLETE<='0';
293
      END IF;
294
    END IF;
295
  END PROCESS;
296
 
297
  PROCESS(CLKB)
298
  BEGIN
299
    IF(RISING_EDGE(CLKB)) THEN
300
      IF(TB_RST='1') THEN
301
        PORTA_WR_L1 <='0';
302
        PORTA_WR_L2 <='0';
303
      ELSE
304
       PORTA_WR_L1 <= LATCH_PORTA_WR_COMPLETE;
305
       PORTA_WR_L2 <= PORTA_WR_L1;
306
      END IF;
307
   END IF;
308
  END PROCESS;
309
 
310
  PROCESS(CLKA)
311
  BEGIN
312
    IF(RISING_EDGE(CLKA)) THEN
313
      IF(TB_RST='1') THEN
314
        PORTB_RD_R1 <='0';
315
        PORTB_RD_R2 <='0';
316
      ELSE
317
       PORTB_RD_R1 <= PORTB_RD;
318
       PORTB_RD_R2 <= PORTB_RD_R1;
319
      END IF;
320
   END IF;
321
  END PROCESS;
322
 
323
  PORTB_RD_HAPPENED <= PORTB_RD_R2;
324
 
325
  PORTB_RD_COMPLETE <= '1' when (count_rd=RD_DEEP_COUNT) else '0';
326
 
327
  start_rd_counter: process(clkb)
328
  begin
329
    if(rising_edge(clkb)) then
330
      if(tb_rst='1') then
331
         incr_rd_cnt <= '0';
332
       elsif(portb_rd ='1') then
333
         incr_rd_cnt <='1';
334
       elsif(portb_rd_complete='1') then
335
         incr_rd_cnt <='0';
336
       end if;
337
    end if;
338
  end process;
339
 
340
  RD_COUNTER: process(clkb)
341
  begin
342
    if(rising_edge(clkb)) then
343
      if(tb_rst='1') then
344
        count_rd <= 0;
345
      elsif(incr_rd_cnt='1') then
346
        count_rd<=count_rd+1;
347
      end if;
348
      --if(count_rd=(wr_rd_deep_count)) then
349
     if(count_rd=(RD_DEEP_COUNT)) then
350
        count_rd<=0;
351
      end if;
352
   end if;
353
  end process;
354
 
355
  DO_READ<='1' when (count_rd <RD_DEEP_COUNT and incr_rd_cnt='1') else '0';
356
 
357
  PORTA_WR_COMPLETE <= '1' when (count=WR_DEEP_COUNT) else '0';
358
 
359
  start_counter: process(clka)
360
  begin
361
    if(rising_edge(clka)) then
362
      if(tb_rst='1') then
363
         incr_wr_cnt <= '0';
364
       elsif(porta_wr ='1') then
365
         incr_wr_cnt <='1';
366
       elsif(porta_wr_complete='1') then
367
         incr_wr_cnt <='0';
368
       end if;
369
    end if;
370
  end process;
371
 
372
  COUNTER: process(clka)
373
  begin
374
    if(rising_edge(clka)) then
375
      if(tb_rst='1') then
376
        count <= 0;
377
      elsif(incr_wr_cnt='1') then
378
        count<=count+1;
379
      end if;
380
      if(count=(WR_DEEP_COUNT)) then
381
        count<=0;
382
      end if;
383
   end if;
384
  end process;
385
 
386
  DO_WRITE<='1' when (count <WR_DEEP_COUNT and incr_wr_cnt='1') else '0';
387
 
388
 
389
  BEGIN_SHIFT_REG: FOR I IN 0 TO 5 GENERATE
390
  BEGIN
391
    DFF_RIGHT: IF I=0 GENERATE
392
    BEGIN
393
      SHIFT_INST_0: ENTITY work.REGISTER_LOGIC
394
        PORT MAP(
395
           Q    => DO_READ_REG(0),
396
           CLK  => CLKB,
397
           RST  => TB_RST,
398
           D    => DO_READ
399
        );
400
     END GENERATE DFF_RIGHT;
401
 
402
    DFF_OTHERS: IF ((I>0) AND (I<=5)) GENERATE
403
    BEGIN
404
      SHIFT_INST: ENTITY work.REGISTER_LOGIC
405
        PORT MAP(
406
           Q   => DO_READ_REG(I),
407
           CLK =>CLKB,
408
           RST =>TB_RST,
409
           D   =>DO_READ_REG(I-1)
410
        );
411
    END GENERATE DFF_OTHERS;
412
 END GENERATE BEGIN_SHIFT_REG;
413
 
414
 REGCE_PROCESS: PROCESS(CLKB)
415
   BEGIN
416
     IF(RISING_EDGE(CLKB)) THEN
417
       IF(TB_RST='1') THEN
418
             DO_READ_R <= '0';
419
       ELSE
420
             DO_READ_R <= DO_READ;
421
       END IF;
422
     END IF;
423
 END PROCESS;
424
 
425
 
426
   ENB <= DO_READ;
427
 
428
   WEA(0) <= DO_WRITE ;
429
 
430
 
431
END ARCHITECTURE;
432
 
433
 
434
 
435
 
436
 

powered by: WebSVN 2.1.0

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