source: PlatformSupport/CustomPeripherals/pcores/w3_ad_bridge_v3_01_b/hdl/verilog/w3_ad_bridge.v

Last change on this file was 1878, checked in by murphpo, 12 years ago

Added IDELAY parameters to ad_bridge, so each instance can customize delay values per interface

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