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

Subversion Repositories pcie_ds_dma

[/] [pcie_ds_dma/] [trunk/] [core/] [ds_dma64/] [pcie_src/] [pcie_core64_m1/] [source_artix7/] [cl_a7pcie_x4_pcie_bram_7x.vhd] - Blame information for rev 46

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 46 dsmv
-------------------------------------------------------------------------------
2
--
3
-- (c) Copyright 2010-2011 Xilinx, Inc. All rights reserved.
4
--
5
-- This file contains confidential and proprietary information
6
-- of Xilinx, Inc. and is protected under U.S. and
7
-- international copyright and other intellectual property
8
-- laws.
9
--
10
-- DISCLAIMER
11
-- This disclaimer is not a license and does not grant any
12
-- rights to the materials distributed herewith. Except as
13
-- otherwise provided in a valid license issued to you by
14
-- Xilinx, and to the maximum extent permitted by applicable
15
-- law: (1) THESE MATERIALS ARE MADE AVAILABLE "AS IS" AND
16
-- WITH ALL FAULTS, AND XILINX HEREBY DISCLAIMS ALL WARRANTIES
17
-- AND CONDITIONS, EXPRESS, IMPLIED, OR STATUTORY, INCLUDING
18
-- BUT NOT LIMITED TO WARRANTIES OF MERCHANTABILITY, NON-
19
-- INFRINGEMENT, OR FITNESS FOR ANY PARTICULAR PURPOSE; and
20
-- (2) Xilinx shall not be liable (whether in contract or tort,
21
-- including negligence, or under any other theory of
22
-- liability) for any loss or damage of any kind or nature
23
-- related to, arising under or in connection with these
24
-- materials, including for any direct, or any indirect,
25
-- special, incidental, or consequential loss or damage
26
-- (including loss of data, profits, goodwill, or any type of
27
-- loss or damage suffered as a result of any action brought
28
-- by a third party) even if such damage or loss was
29
-- reasonably foreseeable or Xilinx had been advised of the
30
-- possibility of the same.
31
--
32
-- CRITICAL APPLICATIONS
33
-- Xilinx products are not designed or intended to be fail-
34
-- safe, or for use in any application requiring fail-safe
35
-- performance, such as life-support or safety devices or
36
-- systems, Class III medical devices, nuclear facilities,
37
-- applications related to the deployment of airbags, or any
38
-- other applications that could lead to death, personal
39
-- injury, or severe property or environmental damage
40
-- (individually and collectively, "Critical
41
-- Applications"). Customer assumes the sole risk and
42
-- liability of any use of Xilinx products in Critical
43
-- Applications, subject only to applicable laws and
44
-- regulations governing limitations on product liability.
45
--
46
-- THIS COPYRIGHT NOTICE AND DISCLAIMER MUST BE RETAINED AS
47
-- PART OF THIS FILE AT ALL TIMES.
48
--
49
-------------------------------------------------------------------------------
50
-- Project    : Series-7 Integrated Block for PCI Express
51
-- File       : cl_a7pcie_x4_pcie_bram_7x.vhd
52
-- Version    : 1.9
53
--  Description : single bram wrapper for the mb pcie block
54
--                The bram A port is the write port
55
--                the      B port is the read port
56
--
57
--
58
---------------------------------------------------------------------------------
59
 
60
library ieee;
61
use ieee.std_logic_1164.all;
62
use ieee.std_logic_misc.all;
63
use ieee.std_logic_unsigned.all;
64
 
65
library unisim;
66
use unisim.vcomponents.all;
67
 
68
library unimacro;
69
use unimacro.vcomponents.all;
70
 
71
entity cl_a7pcie_x4_pcie_bram_7x      is
72
  generic(
73
    LINK_CAP_MAX_LINK_SPEED : INTEGER := 1;             -- PCIe Link Speed : 1 - 2.5 GT/s; 2 - 5.0 GT/s
74
    LINK_CAP_MAX_LINK_WIDTH : INTEGER := 8;             -- PCIe Link Width : 1 / 2 / 4 / 8
75
    IMPL_TARGET             : STRING := "HARD";         -- the implementation target : HARD, SOFT
76
    DOB_REG                 : INTEGER := 0;             -- 1 - use the output register;
77
                                                        -- 0 - don't use the output register
78
    WIDTH                   : INTEGER := 0              -- supported WIDTH's : 4, 9, 18, 36 - uses RAMB36
79
                                                        --                     72 - uses RAMB36SDP
80
  );
81
   port (
82
 
83
      user_clk_i                           : in std_logic;                              -- user clock
84
      reset_i                              : in std_logic;                              -- bram reset
85
      wen_i                                : in std_logic;                              -- write enable
86
      waddr_i                              : in std_logic_vector(12 downto 0);          -- write address
87
      wdata_i                              : in std_logic_vector(WIDTH - 1 downto 0);   -- write data
88
      ren_i                                : in std_logic;                              -- read enable
89
      rce_i                                : in std_logic;                              -- output register clock enable
90
      raddr_i                              : in std_logic_vector(12 downto 0);          -- read address
91
      rdata_o                              : out std_logic_vector(WIDTH - 1 downto 0)   -- read data
92
   );
93
end cl_a7pcie_x4_pcie_bram_7x;
94
 
95
architecture v7_pcie of cl_a7pcie_x4_pcie_bram_7x is
96
 
97
  -- map the address bits
98
  function msb_addr (
99
    constant wdt   : integer)
100
    return integer is
101
     variable addr_msb : integer := 8;
102
  begin  -- msb_addr
103
 
104
    if (wdt = 4) then
105
      addr_msb := 12;
106
    elsif (wdt = 9) then
107
      addr_msb := 11;
108
    elsif (wdt = 18) then
109
      addr_msb := 10;
110
    elsif (wdt = 36) then
111
      addr_msb := 9;
112
    else
113
      addr_msb := 8;
114
    end if;
115
    return addr_msb;
116
  end msb_addr;
117
 
118
      constant ADDR_MSB                    : integer := msb_addr(WIDTH);
119
 
120
      -- set the width of the tied off low address bits
121
  function alb (
122
    constant wdt   : integer)
123
    return integer is
124
     variable addr_lo_bit : integer := 8;
125
  begin  -- alb
126
 
127
    if (wdt = 4) then
128
      addr_lo_bit := 2;
129
    elsif (wdt = 9) then
130
      addr_lo_bit := 3;
131
    elsif (wdt = 18) then
132
      addr_lo_bit := 4;
133
    elsif (wdt = 36) then
134
      addr_lo_bit := 5;
135
    else
136
      addr_lo_bit := 0;      -- for WIDTH 72 use RAMB36SDP
137
    end if;
138
    return addr_lo_bit;
139
  end alb;
140
 
141
      constant ADDR_LO_BITS                : integer := alb(WIDTH);
142
 
143
      -- map the data bits
144
  function msb_d (
145
    constant wdt   : integer)
146
    return integer is
147
     variable dmsb : integer := 8;
148
  begin  -- msb_d
149
 
150
    if (wdt = 4) then
151
      dmsb := 3;
152
    elsif (wdt = 9) then
153
      dmsb := 7;
154
    elsif (wdt = 18) then
155
      dmsb := 15;
156
    elsif (wdt = 36) then
157
      dmsb := 31;
158
    else
159
      dmsb := 63;
160
    end if;
161
    return dmsb;
162
  end msb_d;
163
 
164
      constant D_MSB                       : integer :=  msb_d(WIDTH);
165
 
166
      -- map the data parity bits
167
      constant DP_LSB                      : integer := D_MSB + 1;
168
 
169
  function msb_dp (
170
    constant wdt   : integer)
171
    return integer is
172
     variable dpmsb : integer := 8;
173
  begin  -- msb_dp
174
 
175
    if (wdt = 4) then
176
      dpmsb := 4;
177
    elsif (wdt = 9) then
178
      dpmsb := 8;
179
    elsif (wdt = 18) then
180
      dpmsb := 17;
181
    elsif (wdt = 36) then
182
      dpmsb := 35;
183
    else
184
      dpmsb := 71;
185
    end if;
186
    return dpmsb;
187
  end msb_dp;
188
 
189
  function pad_val (
190
    in_vec   : std_logic_vector;
191
    range_hi : integer;
192
    range_lo : integer;
193
    pad      : std_logic;
194
    op_len   : integer)
195
    return std_logic_vector is
196
   variable ret : std_logic_vector(op_len-1 downto 0) := (others => '0');
197
  begin  -- pad_val
198
    for i in 0 to op_len-1 loop
199
      if ((i >= range_lo) and (i <= range_hi)) then
200
        ret(i) := in_vec(i - range_lo);
201
      else
202
        ret(i) := pad;
203
      end if;
204
    end loop;  -- i
205
    return ret;
206
  end pad_val;
207
 
208
  function device_val (
209
    impl_target   : string)
210
    return string is
211
  begin  -- dev
212
    if (impl_target = "HARD") then
213
      return "7SERIES";
214
    else
215
      return "VIRTEX6";
216
    end if;
217
  end device_val;
218
 
219
  function get_write_mode (
220
    link_width : integer;
221
    WIDTH      : integer;
222
    link_speed : integer)
223
    return string is
224
  begin  -- wr_mode
225
    if ((WIDTH = 72) and (not((link_width =8) and (link_speed = 2)))) then
226
      return "WRITE_FIRST";
227
    elsif ((link_width =8) and (link_speed = 2)) then
228
      return "WRITE_FIRST";
229
    else
230
      return "NO_CHANGE";
231
    end if;
232
  end get_write_mode;
233
 
234
  function get_we_width (
235
    DEVICE   : string;
236
    WIDTH  : integer)
237
    return integer is
238
  begin  -- wr_mode
239
    if ((DEVICE = "VIRTEX5") or (DEVICE = "VIRTEX6") or (DEVICE = "7SERIES")) then
240
      if (WIDTH <= 9) then
241
        return 1;
242
      elsif (WIDTH > 9 and WIDTH <= 18) then
243
        return 2;
244
      elsif (WIDTH > 18 and WIDTH <= 36) then
245
        return 4;
246
      elsif (WIDTH > 36 and WIDTH <= 72) then
247
        return 8;
248
      else
249
        return 8;
250
      end if;
251
    else
252
      return 8;
253
    end if;
254
  end get_we_width;
255
 
256
  constant DP_MSB                      : integer :=  msb_dp(WIDTH);
257
  constant DPW                         : integer := DP_MSB - DP_LSB + 1;
258
  constant WRITE_MODE                  : string  := get_write_mode(LINK_CAP_MAX_LINK_WIDTH,WIDTH,LINK_CAP_MAX_LINK_SPEED);
259
  constant BRAM_SIZE                   : string  := "36Kb";
260
  constant DEVICE                      : string  := device_val(IMPL_TARGET);
261
  constant WE_WIDTH                    : integer := get_we_width(DEVICE,WIDTH);
262
 
263
  signal DIB_dummy                     : std_logic_vector ((WIDTH-1) downto 0);
264
  signal WE_dummy_gnd                  : std_logic_vector ((WE_WIDTH-1) downto 0);
265
  signal WE_dummy_vcc                  : std_logic_vector ((WE_WIDTH-1) downto 0);
266
  signal rdata_o_dummy                 : std_logic_vector (WIDTH-1 downto 0);
267
 
268
  begin
269
    -- Tie off dummy vectors
270
    DIB_dummy     <= (others => '0');
271
    WE_dummy_gnd  <= (others => '0');
272
    WE_dummy_vcc  <= (others => '1');
273
 
274
   --synthesis translate_off
275
   process
276
   begin
277
      --$display("[%t] %m DOB_REG %0d WIDTH %0d ADDR_MSB %0d ADDR_LO_BITS %0d DP_MSB %0d DP_LSB %0d D_MSB %0d",
278
      --          $time, DOB_REG,   WIDTH,    ADDR_MSB,    ADDR_LO_BITS,    DP_MSB,    DP_LSB,    D_MSB);
279
 
280
      case WIDTH is
281
         when 4 | 9 | 18 | 36 | 72 =>
282
         when others =>  -- case (WIDTH)
283
            -- $display("[%t] %m Error WIDTH %0d not supported", now, to_stdlogic(WIDTH));
284
            -- $finish();
285
      end case;
286
      wait;
287
   end process;
288
 
289
   --synthesis translate_on
290
 
291
   use_sdp : if (((LINK_CAP_MAX_LINK_WIDTH = "001000") and (LINK_CAP_MAX_LINK_SPEED = "0010")) or ( WIDTH = 72)) generate
292
 
293
    --  v6pcie2 <= (others => wen_i);
294
    --  rdata_o_v6pcie0 <= v6pcie16((DP_MSB - DP_LSB) downto 0) & v6pcie15(D_MSB downto 0);
295
 
296
      -- use RAMB36SDP if the width is 72 or X8GEN2
297
      ramb36sdp : BRAM_SDP_MACRO
298
         generic map (
299
            DEVICE      => DEVICE,
300
            BRAM_SIZE   => BRAM_SIZE,
301
            DO_REG      => DOB_REG,
302
            READ_WIDTH  => WIDTH,
303
            WRITE_WIDTH => WIDTH,
304
            WRITE_MODE  => WRITE_MODE
305
         )
306
         port map (
307
            DO      => rdata_o(WIDTH-1 downto 0),
308
            DI      => wdata_i(WIDTH-1 downto 0),
309
            RDADDR  => raddr_i(ADDR_MSB downto 0),
310
            RDCLK   => user_clk_i,
311
            RDEN    => ren_i,
312
            REGCE   => rce_i,
313
            RST     => reset_i,
314
            WE      => WE_dummy_vcc,
315
            WRADDR  => waddr_i(ADDR_MSB downto 0),
316
            WRCLK   => user_clk_i,
317
            WREN    => wen_i
318
         );
319
 
320
      -- use RAMB36's if the width is 4, 9, 18, or 36
321
   end generate;
322
 
323
   use_tdp : if (( WIDTH <= 36) and (not((LINK_CAP_MAX_LINK_WIDTH = "001000") and (LINK_CAP_MAX_LINK_SPEED = "0010")))) generate
324
        -- use RAMB36SDP if the width is 72 or X8GEN2
325
      ramb36 : BRAM_TDP_MACRO
326
         generic map (
327
            DEVICE        => DEVICE,
328
            BRAM_SIZE     => BRAM_SIZE,
329
            DOA_REG       => 0,
330
            DOB_REG       => DOB_REG,
331
            READ_WIDTH_A  => WIDTH,
332
            READ_WIDTH_B  => WIDTH,
333
            WRITE_WIDTH_A => WIDTH,
334
            WRITE_WIDTH_B => WIDTH,
335
            WRITE_MODE_A  => WRITE_MODE
336
         )
337
         port map (
338
            DOA     => rdata_o_dummy(WIDTH-1 downto 0),
339
            DOB     => rdata_o(WIDTH-1 downto 0),
340
            ADDRA   => waddr_i(ADDR_MSB downto 0),
341
            ADDRB   => raddr_i(ADDR_MSB downto 0),
342
            CLKA    => user_clk_i,
343
            CLKB    => user_clk_i,
344
            DIA     => wdata_i(WIDTH-1 downto 0),
345
            DIB     => DIB_dummy,
346
            ENA     => wen_i,
347
            ENB     => ren_i,
348
            REGCEA  => '0',
349
            REGCEB  => rce_i,
350
            RSTA    => reset_i,
351
            RSTB    => reset_i,
352
            WEA     => WE_dummy_vcc,
353
            WEB     => WE_dummy_gnd
354
         );
355
 
356
    end generate;
357
end v7_pcie;
358
 

powered by: WebSVN 2.1.0

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