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

Last change on this file was 5050, checked in by murphpo, 8 years ago

Used TRXIQ to qualify I/Q data; still see difference in I/Q timing in 20 vs 40 mode. For now it's fixed in C by tweaking reg 0x32 when switching bandwidths. Also fixed I/Q typo for RF B.

File size: 4.0 KB
Line 
1module w3_ad_bridge
2(
3    input sys_clk,
4    output samp_ce,
5   
6    // Enable (active-high) for AD_TXCLK output
7    // AD9963 TXCLK pin defaults to output, configured as input via SPI by ad_controller at boot
8    input ad_TXCLK_out_en,
9   
10    //RF Path A User Ports
11    output reg [0:11] user_RFA_RXD_I,
12    output reg [0:11] user_RFA_RXD_Q,
13
14    input [0:11] user_RFA_TXD_I,
15    input [0:11] user_RFA_TXD_Q,
16
17    input user_RFA_TXIQ,
18
19    //RF Path B User Ports
20    output reg [0:11] user_RFB_RXD_I,
21    output reg [0:11] user_RFB_RXD_Q,
22
23    input [0:11] user_RFB_TXD_I,
24    input [0:11] user_RFB_TXD_Q,
25
26    input user_RFB_TXIQ,
27
28    //RF Path A AD ports
29    output reg [0:11] ad_RFA_TXD,
30    output ad_RFA_TXIQ,
31    output ad_RFA_TXCLK,
32
33    input [0:11] ad_RFA_TRXD,
34    input ad_RFA_TRXIQ,
35    input ad_RFA_TRXCLK,
36
37    //RF Path B AD ports
38    output reg [0:11] ad_RFB_TXD,
39    output ad_RFB_TXIQ,
40    output ad_RFB_TXCLK,
41
42    input [0:11] ad_RFB_TRXD,
43    input ad_RFB_TRXIQ,
44    input ad_RFB_TRXCLK
45);
46
47parameter C_FAMILY = "virtex6";
48
49//Unsued in ref designs - pass through here
50assign ad_RFA_TXIQ = user_RFA_TXIQ;
51assign ad_RFB_TXIQ = user_RFB_TXIQ;
52
53reg ad_RFA_TRXCLK_d1, ad_RFA_TRXCLK_d2;
54reg ad_RFB_TRXCLK_d1, ad_RFB_TRXCLK_d2;
55
56reg ad_RFA_TRXCLK_pos, ad_RFA_TRXCLK_neg, ad_RFA_TRXCLK_neg_d1;
57reg ad_RFB_TRXCLK_pos, ad_RFB_TRXCLK_neg, ad_RFB_TRXCLK_neg_d1;
58
59reg [0:11] user_RFA_TXD_I_d;
60reg [0:11] user_RFA_TXD_Q_d;
61
62reg [0:11] user_RFB_TXD_I_d;
63reg [0:11] user_RFB_TXD_Q_d;
64
65reg [0:11] user_RFA_RXD_I_d, user_RFA_RXD_Q_d;
66reg [0:11] user_RFB_RXD_I_d, user_RFB_RXD_Q_d;
67
68always @(posedge sys_clk)
69begin
70    ad_RFA_TRXCLK_d1 <= ad_RFA_TRXCLK;
71    ad_RFA_TRXCLK_d2 <= ad_RFA_TRXCLK_d1;
72
73    ad_RFB_TRXCLK_d1 <= ad_RFB_TRXCLK;
74    ad_RFB_TRXCLK_d2 <= ad_RFB_TRXCLK_d1;
75
76    ad_RFA_TRXCLK_pos <= ad_RFA_TRXCLK_d1 & ~ad_RFA_TRXCLK_d2;
77
78    ad_RFB_TRXCLK_pos <= ad_RFB_TRXCLK_d1 & ~ad_RFB_TRXCLK_d2;
79   
80    ad_RFA_TRXCLK_neg <= ~ad_RFA_TRXCLK_d1 & ad_RFA_TRXCLK_d2;
81    ad_RFA_TRXCLK_neg_d1 <= ad_RFA_TRXCLK_neg;
82
83    ad_RFB_TRXCLK_neg <= ~ad_RFB_TRXCLK_d1 & ad_RFB_TRXCLK_d2;
84    ad_RFB_TRXCLK_neg_d1 <= ad_RFB_TRXCLK_neg;
85end
86
87always @(posedge sys_clk)
88begin
89    if(samp_ce)
90    begin
91        user_RFA_TXD_I_d <= user_RFA_TXD_I;
92        user_RFA_TXD_Q_d <= user_RFA_TXD_Q;
93        user_RFB_TXD_I_d <= user_RFB_TXD_I;
94        user_RFB_TXD_Q_d <= user_RFB_TXD_Q;
95
96        user_RFA_RXD_I <= user_RFA_RXD_I_d;
97        user_RFA_RXD_Q <= user_RFA_RXD_Q_d;
98        user_RFB_RXD_I <= user_RFB_RXD_I_d;
99        user_RFB_RXD_Q <= user_RFB_RXD_Q_d;
100    end
101    else
102    begin
103        user_RFA_TXD_I_d <= user_RFA_TXD_I_d;
104        user_RFA_TXD_Q_d <= user_RFA_TXD_Q_d;
105        user_RFB_TXD_I_d <= user_RFB_TXD_I_d;
106        user_RFB_TXD_Q_d <= user_RFB_TXD_Q_d;
107
108        user_RFA_RXD_I <= user_RFA_RXD_I;
109        user_RFA_RXD_Q <= user_RFA_RXD_Q;
110        user_RFB_RXD_I <= user_RFB_RXD_I;
111        user_RFB_RXD_Q <= user_RFB_RXD_Q;
112    end
113end
114
115assign samp_ce = ad_RFA_TRXCLK_neg_d1;
116
117wire ad_RFA_TXCLK_o;
118wire ad_RFB_TXCLK_o;
119
120assign ad_RFA_TXCLK_o = ~ad_RFA_TRXCLK_d1;
121assign ad_RFB_TXCLK_o = ~ad_RFB_TRXCLK_d1;
122
123OBUFT OBUFT_RFA_TXCLK (
124    .I(ad_RFA_TXCLK_o),
125    .T(~ad_TXCLK_out_en),
126    .O(ad_RFA_TXCLK)
127);
128OBUFT OBUFT_RFB_TXCLK (
129    .I(ad_RFB_TXCLK_o),
130    .T(~ad_TXCLK_out_en),
131    .O(ad_RFB_TXCLK)
132);
133
134
135always @(posedge sys_clk)
136begin
137    if(ad_RFA_TRXCLK_pos || ad_RFA_TRXCLK_neg)
138    begin
139        if(ad_RFA_TRXIQ)
140            user_RFA_RXD_I_d <= ad_RFA_TRXD;
141        else
142            user_RFA_RXD_Q_d <= ad_RFA_TRXD;
143    end
144    else
145    begin
146        user_RFA_RXD_I_d <= user_RFA_RXD_I_d;
147        user_RFA_RXD_Q_d <= user_RFA_RXD_Q_d;
148    end
149end
150
151always @(posedge sys_clk)
152begin
153    if(ad_RFA_TRXCLK_pos)
154    begin
155        ad_RFA_TXD <= user_RFA_TXD_I_d;
156    end
157    else if(ad_RFA_TRXCLK_neg)
158    begin
159        ad_RFA_TXD <= user_RFA_TXD_Q_d;
160    end
161    else
162    begin
163        ad_RFA_TXD <= ad_RFA_TXD;
164    end
165end
166
167always @(posedge sys_clk)
168begin
169    if(ad_RFB_TRXCLK_pos || ad_RFB_TRXCLK_neg)
170    begin
171        if(ad_RFB_TRXIQ)
172            user_RFB_RXD_I_d <= ad_RFB_TRXD;
173        else
174            user_RFB_RXD_Q_d <= ad_RFB_TRXD;
175    end
176    else
177    begin
178        user_RFB_RXD_I_d <= user_RFB_RXD_I_d;
179        user_RFB_RXD_Q_d <= user_RFB_RXD_Q_d;
180    end
181end
182
183always @(posedge sys_clk)
184begin
185    if(ad_RFB_TRXCLK_pos)
186    begin
187        ad_RFB_TXD <= user_RFB_TXD_I_d;
188    end
189    else if(ad_RFB_TRXCLK_neg)
190    begin
191        ad_RFB_TXD <= user_RFB_TXD_Q_d;
192    end
193    else
194    begin
195        ad_RFB_TXD <= ad_RFB_TXD;
196    end
197end
198
199endmodule
Note: See TracBrowser for help on using the repository browser.