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

Last change on this file was 2137, checked in by murphpo, 11 years ago

Fixed bug in IODELAY-free w3_ad_bridge

File size: 6.1 KB
Line 
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";
60
61assign ad_RFA_TXIQ = user_RFA_TXIQ;
62assign ad_RFB_TXIQ = user_RFB_TXIQ;
63
64//Use DDR primitives for cleanest output clock
65ODDR #(
66    .DDR_CLK_EDGE("OPPOSITE_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
67    .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
68    .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
69) OBUFDDR_RFA_TXCLK (
70    .Q(ad_RFA_TXCLK),   // 1-bit DDR output
71    .C(sys_samp_clk_Tx_90),   // 1-bit clock input
72    .CE(1'b1), // 1-bit clock enable input
73    .D1(1'b1), // 1-bit data input (positive edge)
74    .D2(1'b0), // 1-bit data input (negative edge)
75    .R(1'b0),   // 1-bit reset
76    .S(1'b0)    // 1-bit set
77);
78
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_RFB_TXCLK (
84    .Q(ad_RFB_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
93
94wire ad_RFA_TRXCLK_buf, ad_RFB_TRXCLK_buf;
95
96BUFIO BUFIO_RFA_TRXCLK (
97    .O(ad_RFA_TRXCLK_buf),     // Clock buffer output
98    .I(ad_RFA_TRXCLK)      // Clock buffer input
99);
100
101BUFIO BUFIO_RFB_TRXCLK (
102    .O(ad_RFB_TRXCLK_buf),     // Clock buffer output
103    .I(ad_RFB_TRXCLK)      // Clock buffer input
104);
105
106wire [0:11] user_RFA_RXD_I_src;
107wire [0:11] user_RFA_RXD_Q_src;
108wire [0:11] user_RFB_RXD_I_src;
109wire [0:11] user_RFB_RXD_Q_src;
110
111//Instantiate all the DDR registers for TXD and TRXD I/O
112// Only selects bits [0:11] (12MSB) of 14-bit Tx I/Q samples provided by user logic
113genvar ii;
114generate
115    for(ii=0; ii<12; ii=ii+1) begin: DDR_REGS_RFA_RFB
116        ODDR #(
117            .DDR_CLK_EDGE("SAME_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        ) ODDR_RFA_TXD (
121            .Q(ad_RFA_TXD[ii]),   // 1-bit DDR output
122            .C(sys_samp_clk_Tx),   // 1-bit clock input
123            .CE(1'b1), // 1-bit clock enable input
124            .D1(user_RFA_TXD_I[ii]), // 1-bit data input (positive edge)
125            .D2(user_RFA_TXD_Q[ii]), // 1-bit data input (negative edge)
126            .R(1'b0),   // 1-bit reset
127            .S(1'b0)    // 1-bit set
128        );
129        ODDR #(
130            .DDR_CLK_EDGE("SAME_EDGE"), // "OPPOSITE_EDGE" or "SAME_EDGE"
131            .INIT(1'b0),    // Initial value of Q: 1'b0 or 1'b1
132            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
133        ) ODDR_RFB_TXD (
134            .Q(ad_RFB_TXD[ii]),   // 1-bit DDR output
135            .C(sys_samp_clk_Tx),   // 1-bit clock input
136            .CE(1'b1), // 1-bit clock enable input
137            .D1(user_RFB_TXD_I[ii]), // 1-bit data input (positive edge)
138            .D2(user_RFB_TXD_Q[ii]), // 1-bit data input (negative edge)
139            .R(1'b0),   // 1-bit reset
140            .S(1'b0)    // 1-bit set
141        );
142
143
144        IDDR #(
145            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
146            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
147            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
148            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
149        ) IDDR_RFA_TRXD (
150            .Q1(user_RFA_RXD_I_src[ii]), // 1-bit output for positive edge of clock
151            .Q2(user_RFA_RXD_Q_src[ii]), // 1-bit output for negative edge of clock
152            .C(ad_RFA_TRXCLK_buf),   // 1-bit clock input
153            .CE(1'b1), // 1-bit clock enable input
154            .D(ad_RFA_TRXD[ii]),   // 1-bit DDR data input
155            .R(1'b0),   // 1-bit reset
156            .S(1'b0)    // 1-bit set
157        );
158        IDDR #(
159            .DDR_CLK_EDGE("SAME_EDGE_PIPELINED"), // "OPPOSITE_EDGE", "SAME_EDGE" or "SAME_EDGE_PIPELINED"
160            .INIT_Q1(1'b0), // Initial value of Q1: 1'b0 or 1'b1
161            .INIT_Q2(1'b0), // Initial value of Q2: 1'b0 or 1'b1
162            .SRTYPE("SYNC") // Set/Reset type: "SYNC" or "ASYNC"
163        ) IDDR_RFB_TRXD (
164            .Q1(user_RFB_RXD_I_src[ii]), // 1-bit output for positive edge of clock
165            .Q2(user_RFB_RXD_Q_src[ii]), // 1-bit output for negative edge of clock
166            .C(ad_RFB_TRXCLK_buf),   // 1-bit clock input
167            .CE(1'b1), // 1-bit clock enable input
168            .D(ad_RFB_TRXD[ii]),   // 1-bit DDR data input
169            .R(1'b0),   // 1-bit reset
170            .S(1'b0)    // 1-bit set
171        );
172       
173        //D flip flops to connect source-syncronous inputs to samp_clk domain (TRXCLK and samp_clk have same rate, arbitrary phases)
174        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));
175        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));
176        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));
177        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));
178        end
179endgenerate
180
181endmodule
Note: See TracBrowser for help on using the repository browser.