source: ReferenceDesigns/w3_802.11/sysgen/wlan_phy_tx_pmd/blackboxes/interleaver_ram.v

Last change on this file was 5118, checked in by murphpo, 8 years ago

Better comments in black box wrapper

File size: 5.4 KB
Line 
1module interleaver_ram(
2  clk,
3  ce,
4  wea,
5  addra,
6  dina,
7  douta,
8  web,
9  addrb,
10  dinb,
11  doutb
12);
13
14//Sysgen blackboxes must have clk and ce ports
15// VHDL wrapper uses std_logic for these signals
16input clk;
17input ce;
18
19// Sysgen instantiates this module in a VHDL wrapper. The wrapper uses std_logic_vector(0:0) signals
20//  to connect to this module's ports. It's *very* important the scalar I/O below have dimensions [0:0].
21//  Without these XST bizarrely decides no connection is made and optimizes out the interleaver RAM.
22// Using Sysgen's "port.useHDLVector(false)" in the config.m would probably achieve the same thing.
23
24input  [0:0] dina;
25input  [0:0] wea;
26input  [8:0] addra;
27output [7:0] douta;
28
29input  [0:0] dinb;
30input  [0:0] web;
31input  [8:0] addrb;
32output [7:0] doutb;
33
34//Map sysgen clk to BRAM clks
35// This module does not use Sysgen's clock enbale (ce) signal
36// The Sysgen model must run this block at the system sample rate
37wire clka, clkb;
38assign clka = clk;
39assign clkb = clk;
40
41// dp_ram_wr_1b_rd_8b_512b is packaged as an ngc netlist cretaed with Coregen's Block Memory Generator
42//  The block memory is configured as:
43//   True dual port memory mode (required for different read/write widths)
44//   Write width A/B = 1 bit
45//   Write depth = 512 (512 bits total)
46//   Read width A/B = 8 bits
47//   Read depth = 64 (512 / 8)
48//   Always enbaled (no ena/enb ports)
49
50(* box_type = "black_box" *)
51dp_ram_wr_1b_rd_8b_512b ram_inst (
52  .clka(clka), // input clka
53  .wea(wea), // input [0 : 0] wea
54  .addra(addra), // input [8 : 0] addra
55  .dina(dina), // input [0 : 0] dina
56  .douta(douta), // output [7 : 0] douta
57  .clkb(clkb), // input clkb
58  .web(web), // input [0 : 0] web
59  .addrb(addrb), // input [8 : 0] addrb
60  .dinb(dinb), // input [0 : 0] dinb
61  .doutb(doutb) // output [7 : 0] doutb
62);
63
64endmodule
65
66//Define module for RAM blackbox - ngdbuild will substitute dp_ram_wr_1b_rd_8b_512b.ngc during implementation
67// Code inside translate_off/translate_on only used for simulation
68// Implementation will use NGC netlist for RAM block
69module dp_ram_wr_1b_rd_8b_512b(
70  clka,
71  wea,
72  addra,
73  dina,
74  douta,
75  clkb,
76  web,
77  addrb,
78  dinb,
79  doutb
80);
81
82input clka;
83input [0 : 0] wea;
84input [8 : 0] addra;
85input [0 : 0] dina;
86output [7 : 0] douta;
87input clkb;
88input [0 : 0] web;
89input [8 : 0] addrb;
90input [0 : 0] dinb;
91output [7 : 0] doutb;
92
93// synthesis translate_off
94//  BLK_MEM_GEN_V7_3 simulation model supplied by ISE - implementation will use coregen netlist
95  BLK_MEM_GEN_V7_3 #(
96    .C_ADDRA_WIDTH(9),
97    .C_ADDRB_WIDTH(9),
98    .C_ALGORITHM(1),
99    .C_AXI_ID_WIDTH(4),
100    .C_AXI_SLAVE_TYPE(0),
101    .C_AXI_TYPE(1),
102    .C_BYTE_SIZE(9),
103    .C_COMMON_CLK(1),
104    .C_DEFAULT_DATA("0"),
105    .C_DISABLE_WARN_BHV_COLL(0),
106    .C_DISABLE_WARN_BHV_RANGE(0),
107    .C_ENABLE_32BIT_ADDRESS(0),
108    .C_FAMILY("virtex6"),
109    .C_HAS_AXI_ID(0),
110    .C_HAS_ENA(0),
111    .C_HAS_ENB(0),
112    .C_HAS_INJECTERR(0),
113    .C_HAS_MEM_OUTPUT_REGS_A(0),
114    .C_HAS_MEM_OUTPUT_REGS_B(0),
115    .C_HAS_MUX_OUTPUT_REGS_A(0),
116    .C_HAS_MUX_OUTPUT_REGS_B(0),
117    .C_HAS_REGCEA(0),
118    .C_HAS_REGCEB(0),
119    .C_HAS_RSTA(0),
120    .C_HAS_RSTB(0),
121    .C_HAS_SOFTECC_INPUT_REGS_A(0),
122    .C_HAS_SOFTECC_OUTPUT_REGS_B(0),
123    .C_INIT_FILE("BlankString"),
124    .C_INIT_FILE_NAME("no_coe_file_loaded"),
125    .C_INITA_VAL("0"),
126    .C_INITB_VAL("0"),
127    .C_INTERFACE_TYPE(0),
128    .C_LOAD_INIT_FILE(0),
129    .C_MEM_TYPE(2),
130    .C_MUX_PIPELINE_STAGES(0),
131    .C_PRIM_TYPE(1),
132    .C_READ_DEPTH_A(64),
133    .C_READ_DEPTH_B(64),
134    .C_READ_WIDTH_A(8),
135    .C_READ_WIDTH_B(8),
136    .C_RST_PRIORITY_A("CE"),
137    .C_RST_PRIORITY_B("CE"),
138    .C_RST_TYPE("SYNC"),
139    .C_RSTRAM_A(0),
140    .C_RSTRAM_B(0),
141    .C_SIM_COLLISION_CHECK("ALL"),
142    .C_USE_BRAM_BLOCK(0),
143    .C_USE_BYTE_WEA(0),
144    .C_USE_BYTE_WEB(0),
145    .C_USE_DEFAULT_DATA(0),
146    .C_USE_ECC(0),
147    .C_USE_SOFTECC(0),
148    .C_WEA_WIDTH(1),
149    .C_WEB_WIDTH(1),
150    .C_WRITE_DEPTH_A(512),
151    .C_WRITE_DEPTH_B(512),
152    .C_WRITE_MODE_A("WRITE_FIRST"),
153    .C_WRITE_MODE_B("WRITE_FIRST"),
154    .C_WRITE_WIDTH_A(1),
155    .C_WRITE_WIDTH_B(1),
156    .C_XDEVICEFAMILY("virtex6")
157  )
158  inst (
159    .CLKA(clka),
160    .WEA(wea),
161    .ADDRA(addra),
162    .DINA(dina),
163    .DOUTA(douta),
164    .CLKB(clkb),
165    .WEB(web),
166    .ADDRB(addrb),
167    .DINB(dinb),
168    .DOUTB(doutb),
169    .RSTA(),
170    .ENA(),
171    .REGCEA(),
172    .RSTB(),
173    .ENB(),
174    .REGCEB(),
175    .INJECTSBITERR(),
176    .INJECTDBITERR(),
177    .SBITERR(),
178    .DBITERR(),
179    .RDADDRECC(),
180    .S_ACLK(),
181    .S_ARESETN(),
182    .S_AXI_AWID(),
183    .S_AXI_AWADDR(),
184    .S_AXI_AWLEN(),
185    .S_AXI_AWSIZE(),
186    .S_AXI_AWBURST(),
187    .S_AXI_AWVALID(),
188    .S_AXI_AWREADY(),
189    .S_AXI_WDATA(),
190    .S_AXI_WSTRB(),
191    .S_AXI_WLAST(),
192    .S_AXI_WVALID(),
193    .S_AXI_WREADY(),
194    .S_AXI_BID(),
195    .S_AXI_BRESP(),
196    .S_AXI_BVALID(),
197    .S_AXI_BREADY(),
198    .S_AXI_ARID(),
199    .S_AXI_ARADDR(),
200    .S_AXI_ARLEN(),
201    .S_AXI_ARSIZE(),
202    .S_AXI_ARBURST(),
203    .S_AXI_ARVALID(),
204    .S_AXI_ARREADY(),
205    .S_AXI_RID(),
206    .S_AXI_RDATA(),
207    .S_AXI_RRESP(),
208    .S_AXI_RLAST(),
209    .S_AXI_RVALID(),
210    .S_AXI_RREADY(),
211    .S_AXI_INJECTSBITERR(),
212    .S_AXI_INJECTDBITERR(),
213    .S_AXI_SBITERR(),
214    .S_AXI_DBITERR(),
215    .S_AXI_RDADDRECC()
216  );
217
218// synthesis translate_on
219endmodule
220
Note: See TracBrowser for help on using the repository browser.