source: PlatformSupport/Deprecated/w3_ad_bridge_v3_00_f/hdl/verilog/w3_ad_bridge.v

Last change on this file was 1766, checked in by murphpo, 12 years ago
File size: 7.8 KB
Line 
1/* AD bridge customized for:
2    -Externally buffered clocks (0 and 90 degree versions, must match AD9512/AD9963 config)
3    -Explicit IDELAYCTRL for designs with no MPMC or TEMACs
4    -14-bit user I/Q IO
5   Created for testing early OFDM ref designs, before figuring out
6    proper timing constraints (to avoid cross-domain errors) and tweaking
7    gateways for 12-bit I/Q
8*/
9module w3_ad_bridge
10(
11    //Ref clk for IDELAYCTRL
12    input clk200,
13   
14    //BUF'd output for other blocks to use
15    input sys_samp_clk,
16    input sys_samp_clk_90,
17   
18    //RF Path A User Ports
19    output [0:11] user_RFA_RXD_I,
20    output [0:11] user_RFA_RXD_Q,
21
22    input [0:11] user_RFA_TXD_I,
23    input [0:11] user_RFA_TXD_Q,
24
25    input user_RFA_TXCLK,
26    input user_RFA_TXIQ,
27
28    //RF Path B User Ports
29    output [0:11] user_RFB_RXD_I,
30    output [0:11] user_RFB_RXD_Q,
31
32    input [0:11] user_RFB_TXD_I,
33    input [0:11] user_RFB_TXD_Q,
34
35    input user_RFB_TXCLK,
36    input user_RFB_TXIQ,
37
38    //RF Path A AD ports
39    output [0:11] ad_RFA_TXD,
40    output ad_RFA_TXIQ,
41    output ad_RFA_TXCLK,
42
43    input [0:11] ad_RFA_TRXD,
44    input ad_RFA_TRXIQ,
45    input ad_RFA_TRXCLK,
46
47    //RF Path B AD ports
48    output [0:11] ad_RFB_TXD,
49    output ad_RFB_TXIQ,
50    output ad_RFB_TXCLK,
51
52    input [0:11] ad_RFB_TRXD,
53    input ad_RFB_TRXIQ,
54    input ad_RFB_TRXCLK
55);
56
57parameter C_FAMILY = "virtex6";
58parameter INCLUDE_IDELAYCTRL = 1;
59
60wire user_RFA_TXCLK_ddr, user_RFB_TXCLK_ddr;
61
62assign ad_RFA_TXIQ = user_RFA_TXIQ;
63assign ad_RFB_TXIQ = user_RFB_TXIQ;
64
65generate
66if(INCLUDE_IDELAYCTRL==1) begin
67IDELAYCTRL IDELAYCTRL_inst (
68      .RDY(),       // 1-bit Ready output
69      .REFCLK(clk200), // 1-bit Reference clock input
70      .RST(1'b0)        // 1-bit Reset input
71   );
72end
73endgenerate
74
75//Use DDR primitives for cleanest output clock
76ODDR #(
77    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
78    .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
79    .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
80) OBUFDDR_RFA_TXCLK (
81    .Q(ad_RFA_TXCLK),   // 1-bit DDR output
82    .C(sys_samp_clk_90),   // 1-bit clock input
83    .CE(1'b1), // 1-bit clock enable input
84    .D1(1'b1), // 1-bit data input (positive edge)
85    .D2(1'b0), // 1-bit data input (negative edge)
86    .R(1'b0),   // 1-bit reset
87    .S(1'b0)    // 1-bit set
88);
89
90ODDR #(
91    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
92    .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
93    .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
94) OBUFDDR_RFB_TXCLK (
95    .Q(ad_RFB_TXCLK),   // 1-bit DDR output
96    .C(sys_samp_clk_90),   // 1-bit clock input
97    .CE(1'b1), // 1-bit clock enable input
98    .D1(1'b1), // 1-bit data input (positive edge)
99    .D2(1'b0), // 1-bit data input (negative edge)
100    .R(1'b0),   // 1-bit reset
101    .S(1'b0)    // 1-bit set
102);
103
104
105wire ad_RFA_TRXCLK_buf, ad_RFB_TRXCLK_buf;
106wire ad_RFA_TRXCLK_dly, ad_RFB_TRXCLK_dly;
107
108//Delay AD9963-generated TRXCLK, then drive BUFIO for latching TRXD DDR inputs
109IODELAYE1 #(
110    .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion ("TRUE"/"FALSE")
111    .DELAY_SRC("I"),                 // Delay input ("I", "CLKIN", "DATAIN", "IO", "O")
112    .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
113    .IDELAY_TYPE("FIXED"),           // "FIXED", "VARIABLE", or "VAR_LOADABLE"
114    .IDELAY_VALUE(31),                // Output delay tap setting (0-32)
115    .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz
116    .SIGNAL_PATTERN("CLOCK")          // "DATA" or "CLOCK" input signal
117) IDELAY_RFA_TRXCLK (
118    .IDATAIN(ad_RFA_TRXCLK),
119    .DATAOUT(ad_RFA_TRXCLK_dly),
120    .T(1'b0)                      // 1-bit input - 3-state input control. Tie high for input-only or internal delay or
121);
122
123IODELAYE1 #(
124    .CINVCTRL_SEL("FALSE"),          // Enable dynamic clock inversion ("TRUE"/"FALSE")
125    .DELAY_SRC("I"),                 // Delay input ("I", "CLKIN", "DATAIN", "IO", "O")
126    .HIGH_PERFORMANCE_MODE("FALSE"), // Reduced jitter ("TRUE"), Reduced power ("FALSE")
127    .IDELAY_TYPE("FIXED"),           // "FIXED", "VARIABLE", or "VAR_LOADABLE"
128    .IDELAY_VALUE(31),                // Output delay tap setting (0-32)
129    .REFCLK_FREQUENCY(200.0),        // IDELAYCTRL clock input frequency in MHz
130    .SIGNAL_PATTERN("CLOCK")          // "DATA" or "CLOCK" input signal
131) IDELAY_RFB_TRXCLK (
132    .IDATAIN(ad_RFB_TRXCLK),
133    .DATAOUT(ad_RFB_TRXCLK_dly),
134    .T(1'b0)                      // 1-bit input - 3-state input control. Tie high for input-only or internal delay or
135);
136
137BUFIO BUFIO_RFA_TRXCLK (
138    .O(ad_RFA_TRXCLK_buf),     // Clock buffer output
139    .I(ad_RFA_TRXCLK_dly)      // Clock buffer input
140);
141
142BUFIO BUFIO_RFB_TRXCLK (
143    .O(ad_RFB_TRXCLK_buf),     // Clock buffer output
144    .I(ad_RFB_TRXCLK_dly)      // Clock buffer input
145);
146
147wire [0:11] user_RFA_RXD_I_src;
148wire [0:11] user_RFA_RXD_Q_src;
149wire [0:11] user_RFB_RXD_I_src;
150wire [0:11] user_RFB_RXD_Q_src;
151
152//Instantiate all the DDR registers for TXD and TRXD I/O
153// Only selects bits [0:11] (12MSB) of 14-bit Tx I/Q samples provided by user logic
154genvar ii;
155generate
156    for(ii=0; ii<12; ii=ii+1) begin: DDR_REGS_RFA_RFB
157        ODDR #(
158            .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
159            .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
160            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
161        ) ODDR_RFA_TXD (
162            .Q(ad_RFA_TXD[ii]),   // 1-bit DDR output
163            .C(sys_samp_clk),   // 1-bit clock input
164            .CE(1'b1), // 1-bit clock enable input
165            .D1(user_RFA_TXD_I[ii]), // 1-bit data input (positive edge)
166            .D2(user_RFA_TXD_Q[ii]), // 1-bit data input (negative edge)
167            .R(1'b0),   // 1-bit reset
168            .S(1'b0)    // 1-bit set
169        );
170        ODDR #(
171            .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
172            .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
173            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
174        ) ODDR_RFB_TXD (
175            .Q(ad_RFB_TXD[ii]),   // 1-bit DDR output
176            .C(sys_samp_clk),   // 1-bit clock input
177            .CE(1'b1), // 1-bit clock enable input
178            .D1(user_RFB_TXD_I[ii]), // 1-bit data input (positive edge)
179            .D2(user_RFB_TXD_Q[ii]), // 1-bit data input (negative edge)
180            .R(1'b0),   // 1-bit reset
181            .S(1'b0)    // 1-bit set
182        );
183
184
185        IDDR #(
186            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
187            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
188            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
189            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
190        ) IDDR_RFA_TRXD (
191            .Q1(user_RFA_RXD_I_src[ii]), // 1-bit output for positive edge of clock
192            .Q2(user_RFA_RXD_Q_src[ii]), // 1-bit output for negative edge of clock
193            .C(ad_RFA_TRXCLK_buf),   // 1-bit clock input
194            .CE(1'b1), // 1-bit clock enable input
195            .D(ad_RFA_TRXD[ii]),   // 1-bit DDR data input
196            .R(1'b0),   // 1-bit reset
197            .S(1'b0)    // 1-bit set
198        );
199        IDDR #(
200            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
201            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
202            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
203            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
204        ) IDDR_RFB_TRXD (
205            .Q1(user_RFB_RXD_I_src[ii]), // 1-bit output for positive edge of clock
206            .Q2(user_RFB_RXD_Q_src[ii]), // 1-bit output for negative edge of clock
207            .C(ad_RFB_TRXCLK_buf),   // 1-bit clock input
208            .CE(1'b1), // 1-bit clock enable input
209            .D(ad_RFB_TRXD[ii]),   // 1-bit DDR data input
210            .R(1'b0),   // 1-bit reset
211            .S(1'b0)    // 1-bit set
212        );
213       
214        //D flip flops to connect source-syncronous inputs to samp_clk domain (TRXCLK and samp_clk have same rate, arbitrary phases)
215        FDSE #(.INIT(1'b0)) DFF2_RFA_I (.D(user_RFA_RXD_I_src[ii]), .Q(user_RFA_RXD_I[ii]), .C(sys_samp_clk), .S(1'b0), .CE(1'b1));
216        FDSE #(.INIT(1'b0)) DFF2_RFA_Q (.D(user_RFA_RXD_Q_src[ii]), .Q(user_RFA_RXD_Q[ii]), .C(sys_samp_clk), .S(1'b0), .CE(1'b1));
217        FDSE #(.INIT(1'b0)) DFF2_RFB_I (.D(user_RFB_RXD_I_src[ii]), .Q(user_RFB_RXD_I[ii]), .C(sys_samp_clk), .S(1'b0), .CE(1'b1));
218        FDSE #(.INIT(1'b0)) DFF2_RFB_Q (.D(user_RFB_RXD_Q_src[ii]), .Q(user_RFB_RXD_Q[ii]), .C(sys_samp_clk), .S(1'b0), .CE(1'b1));
219        end
220endgenerate
221
222endmodule
Note: See TracBrowser for help on using the repository browser.