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_brams_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_brams_7x.vhd
52
-- Version    : 1.9
53
--  Description : pcie bram wrapper
54
--                arrange and connect brams
55
--                implement address decoding, datapath muxing and pipeline stages
56
--
57
--                banks of brams are used for 1,2,4,8,18 brams
58
--                brams are stacked for other values of NUM_BRAMS
59
--
60
-------------------------------------------------------------------------------
61
 
62
library ieee;
63
use ieee.std_logic_1164.all;
64
use ieee.std_logic_misc.all;
65
use ieee.std_logic_unsigned.all;
66
 
67
entity cl_a7pcie_x4_pcie_brams_7x is
68
generic(
69
   LINK_CAP_MAX_LINK_SPEED : integer := 1;        -- PCIe Link Speed : 1 - 2.5 GT/s; 2 - 5.0 GT/s
70
   LINK_CAP_MAX_LINK_WIDTH : integer := 8;        -- PCIe Link Width : 1 / 2 / 4 / 8
71
   IMPL_TARGET             : string := "HARD";    -- the implementation target : HARD, SOFT
72
 
73
  -- the number of BRAMs to use
74
  -- supported values are:
75
  -- 1,2,4,8,18
76
   NUM_BRAMS               : integer := 0;
77
 
78
  -- BRAM read address latency
79
  --
80
  -- value     meaning
81
  -- ==========================
82
  --   0       BRAM read address port sample
83
  --   1       BRAM read address port sample and a pipeline stage on the address port
84
   RAM_RADDR_LATENCY       : integer := 1;
85
 
86
  -- BRAM read data latency
87
  --
88
  -- value     meaning
89
  -- ==========================
90
  --   1       no BRAM OREG
91
  --   2       use BRAM OREG
92
  --   3       use BRAM OREG and a pipeline stage on the data port
93
   RAM_RDATA_LATENCY       :integer := 1;
94
 
95
  -- BRAM write latency
96
  -- The BRAM write port is synchronous
97
  --
98
  -- value     meaning
99
  -- ==========================
100
  --   0       BRAM write port sample
101
  --   1       BRAM write port sample plus pipeline stage
102
   RAM_WRITE_LATENCY       :integer := 1
103
);
104
port (
105
    user_clk_i : in std_logic;                              -- user clock
106
    reset_i    : in std_logic;                              -- bram reset
107
    wen        : in std_logic;                              -- write enable
108
    waddr      : in std_logic_vector(12 downto 0);          -- write address
109
    wdata      : in std_logic_vector(71 downto 0);          -- write data
110
    ren        : in std_logic;                              -- read enable
111
    rce        : in std_logic;                              -- output register clock enable
112
    raddr      : in std_logic_vector(12 downto 0);          -- read address
113
    rdata      : out std_logic_vector(71 downto 0)          -- read data
114
);
115
end cl_a7pcie_x4_pcie_brams_7x;
116
 
117
architecture pcie_7x of cl_a7pcie_x4_pcie_brams_7x is
118
   component cl_a7pcie_x4_pcie_bram_7x is
119
      generic (
120
           LINK_CAP_MAX_LINK_SPEED : INTEGER := 1;             -- PCIe Link Speed : 1 - 2.5 GT/s; 2 - 5.0 GT/s
121
           LINK_CAP_MAX_LINK_WIDTH : INTEGER := 8;             -- PCIe Link Width : 1 / 2 / 4 / 8
122
           IMPL_TARGET             : STRING := "HARD";         -- the implementation target : HARD, SOFT
123
           DOB_REG                 : INTEGER := 0;             -- 1 - use the output register;
124
                                                               -- 0 - don't use the output register
125
           WIDTH                   : INTEGER := 0              -- supported WIDTH's : 4, 9, 18, 36 - uses RAMB36
126
                                                               --                     72 - uses RAMB36SDP
127
      );
128
      port (
129
           user_clk_i : in std_logic;                              -- user clock
130
           reset_i    : in std_logic;                              -- bram reset
131
           wen_i      : in std_logic;                              -- write enable
132
           waddr_i    : in std_logic_vector(12 downto 0);          -- write address
133
           wdata_i    : in std_logic_vector(WIDTH - 1 downto 0);   -- write data
134
           ren_i      : in std_logic;                              -- read enable
135
           rce_i      : in std_logic;                              -- output register clock enable
136
           raddr_i    : in std_logic_vector(12 downto 0);          -- read address
137
           rdata_o    : out std_logic_vector(WIDTH - 1 downto 0)   -- read data
138
      );
139
   end component;
140
 
141
  function get_dob_reg (
142
    constant rdata_lat   : integer)
143
    return integer is
144
  begin  -- get_dob_reg
145
    if (rdata_lat > 1) then
146
      return 1;
147
    else
148
      return 0;
149
    end if;
150
  end get_dob_reg;
151
 
152
  function get_width (
153
    constant num_brams   : integer)
154
    return integer is
155
  begin  -- msb_d
156
 
157
    if (num_brams = 1) then
158
      return 72;
159
    elsif (num_brams = 2) then
160
      return 36;
161
    elsif (num_brams = 4) then
162
      return 18;
163
    elsif (num_brams = 8) then
164
      return 9;
165
    else
166
      return 4;
167
    end if;
168
  end get_width;
169
 
170
  constant DOB_REG : integer :=  get_dob_reg(RAM_RDATA_LATENCY);
171
  constant WIDTH   : integer :=  get_width(NUM_BRAMS);
172
  constant TCQ     : integer := 1;
173
 
174
  signal wen_int   : std_logic;
175
  signal waddr_int : std_logic_vector(12 downto 0);
176
  signal wdata_int : std_logic_vector(71 downto 0);
177
 
178
  signal wen_q     : std_logic := '0';
179
  signal waddr_q   : std_logic_vector(12 downto 0) := (others => '0');
180
  signal wdata_q   : std_logic_vector(71 downto 0) := (others => '0');
181
 
182
  signal ren_int   : std_logic;
183
  signal raddr_int : std_logic_vector(12 downto 0);
184
  signal rdata_int : std_logic_vector(71 downto 0);
185
 
186
  signal ren_q     : std_logic := '0';
187
  signal raddr_q   : std_logic_vector(12 downto 0) := (others => '0');
188
  signal rdata_q   : std_logic_vector(71 downto 0) := (others => '0');
189
 
190
begin
191
 
192
   --synthesis translate_off
193
   process
194
   begin
195
      -- $display("[%t] %m NUM_BRAMS %0d  DOB_REG %0d WIDTH %0d RAM_WRITE_LATENCY %0d RAM_RADDR_LATENCY %0d RAM_RDATA_LATENCY %0d",
196
      -- now, to_stdlogic(NUM_BRAMS), to_stdlogicvector(DOB_REG, 13),
197
      -- ("00000000000000000000000000000000000000000000000000000000000000000" & WIDTH), to_stdlogic(RAM_WRITE_LATENCY),
198
      -- to_stdlogic(RAM_RADDR_LATENCY), to_stdlogicvector(RAM_RDATA_LATENCY, 13));
199
      case NUM_BRAMS is
200
         when 1 | 2 | 4 | 8 | 18 =>
201
         when others =>
202
            -- $display("[%t] %m Error NUM_BRAMS %0d not supported", now, to_stdlogic(NUM_BRAMS));
203
            -- $finish();
204
      end case;   -- case(NUM_BRAMS)
205
      case RAM_RADDR_LATENCY is
206
         when 0 | 1 =>
207
         when others =>
208
            -- $display("[%t] %m Error RAM_READ_LATENCY %0d not supported", now, to_stdlogic(RAM_RADDR_LATENCY));
209
            -- $finish();
210
      end case;   -- case (RAM_RADDR_LATENCY)
211
      case RAM_RDATA_LATENCY is
212
         when 1 | 2 | 3 =>
213
         when others =>
214
            -- $display("[%t] %m Error RAM_READ_LATENCY %0d not supported", now, to_stdlogic(RAM_RDATA_LATENCY));
215
            -- $finish();
216
      end case;   -- case (RAM_RDATA_LATENCY)
217
      case RAM_WRITE_LATENCY is
218
         when 0 | 1 =>
219
         when others =>
220
            -- $display("[%t] %m Error RAM_WRITE_LATENCY %0d not supported", now, to_stdlogic(RAM_WRITE_LATENCY));
221
            -- $finish();
222
      end case;   -- case(RAM_WRITE_LATENCY)
223
      wait;
224
   end process;
225
   --synthesis translate_on
226
 
227
  -- model the delays for ram write latency
228
   wr_lat_2 : if (RAM_WRITE_LATENCY = 1) generate
229
      process (user_clk_i)
230
      begin
231
         if (user_clk_i'event and user_clk_i = '1') then
232
            if (reset_i = '1') then
233
               wen_q   <= '0' after (TCQ)*1 ps;
234
               waddr_q <= "0000000000000" after (TCQ)*1 ps;
235
               wdata_q <= "000000000000000000000000000000000000000000000000000000000000000000000000" after (TCQ)*1 ps;
236
            else
237
               wen_q   <= wen after (TCQ)*1 ps;
238
               waddr_q <= waddr after (TCQ)*1 ps;
239
               wdata_q <= wdata after (TCQ)*1 ps;
240
            end if;
241
         end if;
242
      end process;
243
 
244
      wen_int   <= wen_q;
245
      waddr_int <= waddr_q;
246
      wdata_int <= wdata_q;
247
   end generate;
248
 
249
   wr_lat_1 : if (RAM_WRITE_LATENCY = 0) generate
250
      wen_int   <= wen;
251
      waddr_int <= waddr;
252
      wdata_int <= wdata;
253
   end generate;
254
 
255
   raddr_lat_2 : if (RAM_RADDR_LATENCY = 1) generate
256
 
257
      process (user_clk_i)
258
      begin
259
         if (user_clk_i'event and user_clk_i = '1') then
260
            if (reset_i = '1') then
261
               ren_q   <= '0' after (TCQ)*1 ps;
262
               raddr_q <= "0000000000000" after (TCQ)*1 ps;
263
            else
264
               ren_q   <= ren after (TCQ)*1 ps;
265
               raddr_q <= raddr after (TCQ)*1 ps;
266
            end if;  -- else: !if(reset_i)
267
         end if;
268
      end process;
269
 
270
      ren_int   <= ren_q;
271
      raddr_int <= raddr_q;
272
 
273
   end generate;      -- block: rd_lat_addr_2
274
 
275
   raddr_lat_1 : if (not(RAM_RADDR_LATENCY = 1)) generate
276
      ren_int <= ren;
277
      raddr_int <= raddr;
278
   end generate;
279
 
280
   rdata_lat_3 : if (RAM_RDATA_LATENCY = 3) generate
281
 
282
      process (user_clk_i)
283
      begin
284
         if (user_clk_i'event and user_clk_i = '1') then
285
            if (reset_i = '1') then
286
               rdata_q <= "000000000000000000000000000000000000000000000000000000000000000000000000" after (TCQ)*1 ps;
287
            else
288
               rdata_q <= rdata_int after (TCQ)*1 ps;
289
            end if;  -- else: !if(reset_i)
290
         end if;
291
      end process;
292
 
293
      rdata <= rdata_q;
294
 
295
   end generate;      -- block: rd_lat_data_3
296
 
297
   rdata_lat_1_2 : if (not(RAM_RDATA_LATENCY = 3)) generate
298
      rdata <= rdata_int after (TCQ)*1 ps;
299
   end generate;
300
 
301
   -- instantiate the brams
302
   brams : for ii in 0 to  NUM_BRAMS - 1 generate
303
 
304
     ram : cl_a7pcie_x4_pcie_bram_7x
305
         generic map (
306
           LINK_CAP_MAX_LINK_WIDTH => LINK_CAP_MAX_LINK_WIDTH,
307
           LINK_CAP_MAX_LINK_SPEED => LINK_CAP_MAX_LINK_SPEED,
308
           IMPL_TARGET             => IMPL_TARGET,
309
           DOB_REG                 => DOB_REG,
310
           WIDTH                   => WIDTH
311
         )
312
         port map (
313
           user_clk_i => user_clk_i,
314
           reset_i    => reset_i,
315
           wen_i      => wen_int,
316
           waddr_i    => waddr_int,
317
           wdata_i    => wdata_int(((ii+1)*WIDTH-1) downto (ii * WIDTH)),
318
           ren_i      => ren_int,
319
           raddr_i    => raddr_int,
320
           rdata_o    => rdata_int(((ii+1)*WIDTH-1) downto (ii * WIDTH)),
321
           rce_i      => rce
322
         );
323
   end generate;
324
     -- pcie_brams_7x
325
end pcie_7x;
326
 
327
 

powered by: WebSVN 2.1.0

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