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

Last change on this file was 4716, checked in by murphpo, 9 years ago

New (dev only) version of ad_bridge with separate clock I/O for RF A/B

File size: 7.9 KB
Line 
1module w3_ad_bridge
2(
3    //Input sampling clocks - User design must provide these clock signals
4   
5    // sys_samp_clk_Tx requirements:
6    //  -Synchronous to and valid for capturing user_RFx_TXD ports
7    //  -Frequency must match AD9963 input data rate configuration (DAC clock / interpolation rate)
8    input sys_samp_clk_RFA_Tx,
9    input sys_samp_clk_RFB_Tx,
10
11    // sys_samp_clk_Tx_90 must be 90 degree phase shift of sys_samp_clk_Tx (used to generate TXCLK output)
12    input sys_samp_clk_RFA_Tx_90,
13    input sys_samp_clk_RFB_Tx_90,
14
15    // sys_samp_clk_Rx requirements:
16    //  -Synchronous to AD9963 ADC clock
17    //  -Frequency must match AD9963 output data rate configuration (ADC clock / decimation rate)
18    // user_RFx_RXD outputs are synchronous to sys_samp_clk_Rx
19    input sys_samp_clk_RFA_Rx,
20    input sys_samp_clk_RFB_Rx,
21   
22    // Enable (active-high) for AD_TXCLK output
23    // AD9963 TXCLK pin defaults to output, configured as input via SPI by ad_controller at boot
24    input ad_RFA_TXCLK_out_en,
25    input ad_RFB_TXCLK_out_en,
26   
27    //RF Path A User Ports
28    output [0:11] user_RFA_RXD_I,
29    output [0:11] user_RFA_RXD_Q,
30
31    input [0:11] user_RFA_TXD_I,
32    input [0:11] user_RFA_TXD_Q,
33
34    input user_RFA_TXIQ,
35
36    //RF Path B User Ports
37    output [0:11] user_RFB_RXD_I,
38    output [0:11] user_RFB_RXD_Q,
39
40    input [0:11] user_RFB_TXD_I,
41    input [0:11] user_RFB_TXD_Q,
42
43    input user_RFB_TXIQ,
44
45    //RF Path A AD ports
46    output [0:11] ad_RFA_TXD,
47    output ad_RFA_TXIQ,
48    output ad_RFA_TXCLK,
49
50    input [0:11] ad_RFA_TRXD,
51    input ad_RFA_TRXIQ,
52    input ad_RFA_TRXCLK,
53
54    //RF Path B AD ports
55    output [0:11] ad_RFB_TXD,
56    output ad_RFB_TXIQ,
57    output ad_RFB_TXCLK,
58
59    input [0:11] ad_RFB_TRXD,
60    input ad_RFB_TRXIQ,
61    input ad_RFB_TRXCLK
62);
63
64parameter C_FAMILY = "virtex6";
65
66assign ad_RFA_TXIQ = user_RFA_TXIQ;
67assign ad_RFB_TXIQ = user_RFB_TXIQ;
68
69wire ad_RFA_TXCLK_oddr;
70wire ad_RFB_TXCLK_oddr;
71wire ad_RFA_TXCLK_out_en_n;
72wire ad_RFB_TXCLK_out_en_n;
73
74//Use DDR primitives for cleanest output clock
75// The route for each clock output is:
76// sys_samp_clk_Tx_90 -> ODDR -> Tri-State OBUF -> PAD
77// The tools require the tri-state control signal (OBUFT.T port)
78//  be routed through an ODDR as well. See Figure 2.14 in UG361
79
80//RFA
81ODDR #(
82    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
83    .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
84    .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
85) OBUFDDR_RFA_TXCLK (
86    .Q(ad_RFA_TXCLK_oddr),   // 1-bit DDR output
87    .C(sys_samp_clk_RFA_Tx_90),   // 1-bit clock input
88    .CE(1'b1), // 1-bit clock enable input
89    .D1(1'b1), // 1-bit data input (positive edge)
90    .D2(1'b0), // 1-bit data input (negative edge)
91    .R(1'b0),   // 1-bit reset
92    .S(1'b0)    // 1-bit set
93);
94
95ODDR #(
96    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
97    .INIT(1'b1),    // Initial value of Q: 1'b0 or 1'b1
98    .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
99) OBUFDDR_RFA_TXCLK_T (
100    .Q(ad_RFA_TXCLK_out_en_n),   // 1-bit DDR output
101    .C(sys_samp_clk_RFA_Tx_90),   // 1-bit clock input
102    .CE(1'b1), // 1-bit clock enable input
103    .D1(~ad_RFA_TXCLK_out_en), // 1-bit data input (positive edge)
104    .D2(~ad_RFA_TXCLK_out_en), // 1-bit data input (negative edge)
105    .R(1'b0),   // 1-bit reset
106    .S(1'b0)    // 1-bit set
107);
108
109OBUFT OBUFT_RFA_TXCLK (
110    .I(ad_RFA_TXCLK_oddr),
111    .T(ad_RF_TXCLK_out_en_n),
112    .O(ad_RFA_TXCLK)
113);
114
115//RFB
116ODDR #(
117    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
118    .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
119    .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
120) OBUFDDR_RFB_TXCLK (
121    .Q(ad_RFB_TXCLK_oddr),   // 1-bit DDR output
122    .C(sys_samp_clk_RFB_Tx_90),   // 1-bit clock input
123    .CE(1'b1), // 1-bit clock enable input
124    .D1(1'b1), // 1-bit data input (positive edge)
125    .D2(1'b0), // 1-bit data input (negative edge)
126    .R(1'b0),   // 1-bit reset
127    .S(1'b0)    // 1-bit set
128);
129
130ODDR #(
131    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
132    .INIT(1'b1),    // Initial value of Q: 1'b0 or 1'b1
133    .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
134) OBUFDDR_RFB_TXCLK_T (
135    .Q(ad_RFB_TXCLK_out_en_n),   // 1-bit DDR output
136    .C(sys_samp_clk_RFB_Tx_90),   // 1-bit clock input
137    .CE(1'b1), // 1-bit clock enable input
138    .D1(~ad_RFB_TXCLK_out_en), // 1-bit data input (positive edge)
139    .D2(~ad_RFB_TXCLK_out_en), // 1-bit data input (negative edge)
140    .R(1'b0),   // 1-bit reset
141    .S(1'b0)    // 1-bit set
142);
143
144OBUFT OBUFT_RFB_TXCLK (
145    .I(ad_RFB_TXCLK_oddr),
146    .T(ad_RF_TXCLK_out_en_n),
147    .O(ad_RFB_TXCLK)
148);
149
150
151wire ad_RFA_TRXCLK_buf, ad_RFB_TRXCLK_buf;
152
153BUFIO BUFIO_RFA_TRXCLK (
154    .O(ad_RFA_TRXCLK_buf),     // Clock buffer output
155    .I(ad_RFA_TRXCLK)      // Clock buffer input
156);
157
158BUFIO BUFIO_RFB_TRXCLK (
159    .O(ad_RFB_TRXCLK_buf),     // Clock buffer output
160    .I(ad_RFB_TRXCLK)      // Clock buffer input
161);
162
163wire [0:11] user_RFA_RXD_I_src;
164wire [0:11] user_RFA_RXD_Q_src;
165wire [0:11] user_RFB_RXD_I_src;
166wire [0:11] user_RFB_RXD_Q_src;
167
168//Instantiate all the DDR registers for TXD and TRXD I/O
169// Only selects bits [0:11] (12MSB) of 14-bit Tx I/Q samples provided by user logic
170genvar ii;
171generate
172    for(ii=0; ii<12; ii=ii+1) begin: DDR_REGS_RFA_RFB
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_RFA_TXD (
178            .Q(ad_RFA_TXD[ii]),   // 1-bit DDR output
179            .C(sys_samp_clk_RFA_Tx),   // 1-bit clock input
180            .CE(1'b1), // 1-bit clock enable input
181            .D1(user_RFA_TXD_I[ii]), // 1-bit data input (positive edge)
182            .D2(user_RFA_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        ODDR #(
187            .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
188            .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
189            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
190        ) ODDR_RFB_TXD (
191            .Q(ad_RFB_TXD[ii]),   // 1-bit DDR output
192            .C(sys_samp_clk_RFB_Tx),   // 1-bit clock input
193            .CE(1'b1), // 1-bit clock enable input
194            .D1(user_RFB_TXD_I[ii]), // 1-bit data input (positive edge)
195            .D2(user_RFB_TXD_Q[ii]), // 1-bit data input (negative edge)
196            .R(1'b0),   // 1-bit reset
197            .S(1'b0)    // 1-bit set
198        );
199
200
201        IDDR #(
202            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
203            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
204            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
205            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
206        ) IDDR_RFA_TRXD (
207            .Q1(user_RFA_RXD_I_src[ii]), // 1-bit output for positive edge of clock
208            .Q2(user_RFA_RXD_Q_src[ii]), // 1-bit output for negative edge of clock
209            .C(ad_RFA_TRXCLK_buf),   // 1-bit clock input
210            .CE(1'b1), // 1-bit clock enable input
211            .D(ad_RFA_TRXD[ii]),   // 1-bit DDR data input
212            .R(1'b0),   // 1-bit reset
213            .S(1'b0)    // 1-bit set
214        );
215        IDDR #(
216            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
217            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
218            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
219            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
220        ) IDDR_RFB_TRXD (
221            .Q1(user_RFB_RXD_I_src[ii]), // 1-bit output for positive edge of clock
222            .Q2(user_RFB_RXD_Q_src[ii]), // 1-bit output for negative edge of clock
223            .C(ad_RFB_TRXCLK_buf),   // 1-bit clock input
224            .CE(1'b1), // 1-bit clock enable input
225            .D(ad_RFB_TRXD[ii]),   // 1-bit DDR data input
226            .R(1'b0),   // 1-bit reset
227            .S(1'b0)    // 1-bit set
228        );
229       
230        //D flip flops to connect source-syncronous inputs to samp_clk domain (TRXCLK and samp_clk have same rate, arbitrary phases)
231        FDSE #(.INIT(1'b0)) DFF2_RFA_I (.D(user_RFA_RXD_I_src[ii]), .Q(user_RFA_RXD_I[ii]), .C(sys_samp_clk_RFA_Rx), .S(1'b0), .CE(1'b1));
232        FDSE #(.INIT(1'b0)) DFF2_RFA_Q (.D(user_RFA_RXD_Q_src[ii]), .Q(user_RFA_RXD_Q[ii]), .C(sys_samp_clk_RFA_Rx), .S(1'b0), .CE(1'b1));
233        FDSE #(.INIT(1'b0)) DFF2_RFB_I (.D(user_RFB_RXD_I_src[ii]), .Q(user_RFB_RXD_I[ii]), .C(sys_samp_clk_RFB_Rx), .S(1'b0), .CE(1'b1));
234        FDSE #(.INIT(1'b0)) DFF2_RFB_Q (.D(user_RFB_RXD_Q_src[ii]), .Q(user_RFB_RXD_Q[ii]), .C(sys_samp_clk_RFB_Rx), .S(1'b0), .CE(1'b1));
235        end
236endgenerate
237
238endmodule
Note: See TracBrowser for help on using the repository browser.