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

Last change on this file was 2443, checked in by murphpo, 10 years ago
File size: 6.0 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_Tx,
9
10    // sys_samp_clk_Tx_90 must be 90 degree phase shift of sys_samp_clk_Tx (used to generate TXCLK output)
11    input sys_samp_clk_Tx_90,
12
13    // sys_samp_clk_Rx requirements:
14    //  -Synchronous to AD9963 ADC clock
15    //  -Frequency must match AD9963 output data rate configuration (ADC clock / decimation rate)
16    // user_RFx_RXD outputs are synchronous to sys_samp_clk_Rx
17    input sys_samp_clk_Rx,
18   
19    //RF Path A User Ports
20    output [0:11] user_RFA_RXD_I,
21    output [0:11] user_RFA_RXD_Q,
22
23    input [0:11] user_RFA_TXD_I,
24    input [0:11] user_RFA_TXD_Q,
25
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_TXIQ,
36
37    //RF Path A AD ports
38    output [0:11] ad_RFA_TXD,
39    output ad_RFA_TXIQ,
40    output ad_RFA_TXCLK,
41
42    input [0:11] ad_RFA_TRXD,
43    input ad_RFA_TRXIQ,
44    input ad_RFA_TRXCLK,
45
46    //RF Path B AD ports
47    output [0:11] ad_RFB_TXD,
48    output ad_RFB_TXIQ,
49    output ad_RFB_TXCLK,
50
51    input [0:11] ad_RFB_TRXD,
52    input ad_RFB_TRXIQ,
53    input ad_RFB_TRXCLK
54);
55
56parameter C_FAMILY = "virtex6";
57
58assign ad_RFA_TXIQ = user_RFA_TXIQ;
59assign ad_RFB_TXIQ = user_RFB_TXIQ;
60
61//Use DDR primitives for cleanest output clock
62ODDR #(
63    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
64    .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
65    .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
66) OBUFDDR_RFA_TXCLK (
67    .Q(ad_RFA_TXCLK),   // 1-bit DDR output
68    .C(sys_samp_clk_Tx_90),   // 1-bit clock input
69    .CE(1'b1), // 1-bit clock enable input
70    .D1(1'b1), // 1-bit data input (positive edge)
71    .D2(1'b0), // 1-bit data input (negative edge)
72    .R(1'b0),   // 1-bit reset
73    .S(1'b0)    // 1-bit set
74);
75
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_RFB_TXCLK (
81    .Q(ad_RFB_TXCLK),   // 1-bit DDR output
82    .C(sys_samp_clk_Tx_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
90
91wire ad_RFA_TRXCLK_buf, ad_RFB_TRXCLK_buf;
92
93BUFIO BUFIO_RFA_TRXCLK (
94    .O(ad_RFA_TRXCLK_buf),     // Clock buffer output
95    .I(ad_RFA_TRXCLK)      // Clock buffer input
96);
97
98BUFIO BUFIO_RFB_TRXCLK (
99    .O(ad_RFB_TRXCLK_buf),     // Clock buffer output
100    .I(ad_RFB_TRXCLK)      // Clock buffer input
101);
102
103wire [0:11] user_RFA_RXD_I_src;
104wire [0:11] user_RFA_RXD_Q_src;
105wire [0:11] user_RFB_RXD_I_src;
106wire [0:11] user_RFB_RXD_Q_src;
107
108//Instantiate all the DDR registers for TXD and TRXD I/O
109// Only selects bits [0:11] (12MSB) of 14-bit Tx I/Q samples provided by user logic
110genvar ii;
111generate
112    for(ii=0; ii<12; ii=ii+1) begin: DDR_REGS_RFA_RFB
113        ODDR #(
114            .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
115            .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
116            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
117        ) ODDR_RFA_TXD (
118            .Q(ad_RFA_TXD[ii]),   // 1-bit DDR output
119            .C(sys_samp_clk_Tx),   // 1-bit clock input
120            .CE(1'b1), // 1-bit clock enable input
121            .D1(user_RFA_TXD_I[ii]), // 1-bit data input (positive edge)
122            .D2(user_RFA_TXD_Q[ii]), // 1-bit data input (negative edge)
123            .R(1'b0),   // 1-bit reset
124            .S(1'b0)    // 1-bit set
125        );
126        ODDR #(
127            .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
128            .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
129            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
130        ) ODDR_RFB_TXD (
131            .Q(ad_RFB_TXD[ii]),   // 1-bit DDR output
132            .C(sys_samp_clk_Tx),   // 1-bit clock input
133            .CE(1'b1), // 1-bit clock enable input
134            .D1(user_RFB_TXD_I[ii]), // 1-bit data input (positive edge)
135            .D2(user_RFB_TXD_Q[ii]), // 1-bit data input (negative edge)
136            .R(1'b0),   // 1-bit reset
137            .S(1'b0)    // 1-bit set
138        );
139
140
141        IDDR #(
142            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
143            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
144            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
145            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
146        ) IDDR_RFA_TRXD (
147            .Q1(user_RFA_RXD_I_src[ii]), // 1-bit output for positive edge of clock
148            .Q2(user_RFA_RXD_Q_src[ii]), // 1-bit output for negative edge of clock
149            .C(ad_RFA_TRXCLK_buf),   // 1-bit clock input
150            .CE(1'b1), // 1-bit clock enable input
151            .D(ad_RFA_TRXD[ii]),   // 1-bit DDR data input
152            .R(1'b0),   // 1-bit reset
153            .S(1'b0)    // 1-bit set
154        );
155        IDDR #(
156            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
157            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
158            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
159            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
160        ) IDDR_RFB_TRXD (
161            .Q1(user_RFB_RXD_I_src[ii]), // 1-bit output for positive edge of clock
162            .Q2(user_RFB_RXD_Q_src[ii]), // 1-bit output for negative edge of clock
163            .C(ad_RFB_TRXCLK_buf),   // 1-bit clock input
164            .CE(1'b1), // 1-bit clock enable input
165            .D(ad_RFB_TRXD[ii]),   // 1-bit DDR data input
166            .R(1'b0),   // 1-bit reset
167            .S(1'b0)    // 1-bit set
168        );
169       
170        //D flip flops to connect source-syncronous inputs to samp_clk domain (TRXCLK and samp_clk have same rate, arbitrary phases)
171        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));
172        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));
173        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));
174        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));
175        end
176endgenerate
177
178endmodule
Note: See TracBrowser for help on using the repository browser.