[1878] | 1 | module w3_ad_bridge |
---|
| 2 | ( |
---|
[5028] | 3 | input sys_clk, |
---|
| 4 | output samp_ce, |
---|
[1878] | 5 | |
---|
[2907] | 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 | |
---|
[1878] | 10 | //RF Path A User Ports |
---|
[5028] | 11 | output reg [0:11] user_RFA_RXD_I, |
---|
| 12 | output reg [0:11] user_RFA_RXD_Q, |
---|
[1878] | 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 |
---|
[5028] | 20 | output reg [0:11] user_RFB_RXD_I, |
---|
| 21 | output reg [0:11] user_RFB_RXD_Q, |
---|
[1878] | 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 |
---|
[5028] | 29 | output reg [0:11] ad_RFA_TXD, |
---|
[1878] | 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 |
---|
[5028] | 38 | output reg [0:11] ad_RFB_TXD, |
---|
[1878] | 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 | |
---|
| 47 | parameter C_FAMILY = "virtex6"; |
---|
| 48 | |
---|
[5028] | 49 | //Unsued in ref designs - pass through here |
---|
[1878] | 50 | assign ad_RFA_TXIQ = user_RFA_TXIQ; |
---|
| 51 | assign ad_RFB_TXIQ = user_RFB_TXIQ; |
---|
| 52 | |
---|
[5028] | 53 | reg ad_RFA_TRXCLK_d1, ad_RFA_TRXCLK_d2; |
---|
| 54 | reg ad_RFB_TRXCLK_d1, ad_RFB_TRXCLK_d2; |
---|
[2907] | 55 | |
---|
[5028] | 56 | reg ad_RFA_TRXCLK_pos, ad_RFA_TRXCLK_neg, ad_RFA_TRXCLK_neg_d1; |
---|
| 57 | reg ad_RFB_TRXCLK_pos, ad_RFB_TRXCLK_neg, ad_RFB_TRXCLK_neg_d1; |
---|
[2907] | 58 | |
---|
[5036] | 59 | reg [0:11] user_RFA_TXD_I_d; |
---|
| 60 | reg [0:11] user_RFA_TXD_Q_d; |
---|
| 61 | |
---|
| 62 | reg [0:11] user_RFB_TXD_I_d; |
---|
| 63 | reg [0:11] user_RFB_TXD_Q_d; |
---|
| 64 | |
---|
| 65 | reg [0:11] user_RFA_RXD_I_d, user_RFA_RXD_Q_d; |
---|
| 66 | reg [0:11] user_RFB_RXD_I_d, user_RFB_RXD_Q_d; |
---|
| 67 | |
---|
[5028] | 68 | always @(posedge sys_clk) |
---|
| 69 | begin |
---|
| 70 | ad_RFA_TRXCLK_d1 <= ad_RFA_TRXCLK; |
---|
| 71 | ad_RFA_TRXCLK_d2 <= ad_RFA_TRXCLK_d1; |
---|
[1878] | 72 | |
---|
[5028] | 73 | ad_RFB_TRXCLK_d1 <= ad_RFB_TRXCLK; |
---|
| 74 | ad_RFB_TRXCLK_d2 <= ad_RFB_TRXCLK_d1; |
---|
[2907] | 75 | |
---|
[5028] | 76 | ad_RFA_TRXCLK_pos <= ad_RFA_TRXCLK_d1 & ~ad_RFA_TRXCLK_d2; |
---|
[2907] | 77 | |
---|
[5028] | 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; |
---|
[1878] | 82 | |
---|
[5028] | 83 | ad_RFB_TRXCLK_neg <= ~ad_RFB_TRXCLK_d1 & ad_RFB_TRXCLK_d2; |
---|
| 84 | ad_RFB_TRXCLK_neg_d1 <= ad_RFB_TRXCLK_neg; |
---|
| 85 | end |
---|
[1878] | 86 | |
---|
[5036] | 87 | always @(posedge sys_clk) |
---|
| 88 | begin |
---|
| 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; |
---|
[5050] | 94 | user_RFB_TXD_Q_d <= user_RFB_TXD_Q; |
---|
[5036] | 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; |
---|
[5050] | 106 | user_RFB_TXD_Q_d <= user_RFB_TXD_Q_d; |
---|
[5036] | 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 |
---|
| 113 | end |
---|
| 114 | |
---|
[5028] | 115 | assign samp_ce = ad_RFA_TRXCLK_neg_d1; |
---|
[2907] | 116 | |
---|
[5028] | 117 | wire ad_RFA_TXCLK_o; |
---|
| 118 | wire ad_RFB_TXCLK_o; |
---|
[2907] | 119 | |
---|
[5036] | 120 | assign ad_RFA_TXCLK_o = ~ad_RFA_TRXCLK_d1; |
---|
| 121 | assign ad_RFB_TXCLK_o = ~ad_RFB_TRXCLK_d1; |
---|
[1878] | 122 | |
---|
[5028] | 123 | OBUFT OBUFT_RFA_TXCLK ( |
---|
| 124 | .I(ad_RFA_TXCLK_o), |
---|
| 125 | .T(~ad_TXCLK_out_en), |
---|
| 126 | .O(ad_RFA_TXCLK) |
---|
[1878] | 127 | ); |
---|
[5028] | 128 | OBUFT OBUFT_RFB_TXCLK ( |
---|
| 129 | .I(ad_RFB_TXCLK_o), |
---|
| 130 | .T(~ad_TXCLK_out_en), |
---|
| 131 | .O(ad_RFB_TXCLK) |
---|
[1878] | 132 | ); |
---|
| 133 | |
---|
[5036] | 134 | |
---|
[5028] | 135 | always @(posedge sys_clk) |
---|
| 136 | begin |
---|
[5050] | 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 |
---|
| 149 | end |
---|
| 150 | |
---|
| 151 | always @(posedge sys_clk) |
---|
| 152 | begin |
---|
[5028] | 153 | if(ad_RFA_TRXCLK_pos) |
---|
| 154 | begin |
---|
[5036] | 155 | ad_RFA_TXD <= user_RFA_TXD_I_d; |
---|
[5028] | 156 | end |
---|
[5036] | 157 | else if(ad_RFA_TRXCLK_neg) |
---|
[5028] | 158 | begin |
---|
[5036] | 159 | ad_RFA_TXD <= user_RFA_TXD_Q_d; |
---|
[5028] | 160 | end |
---|
[5036] | 161 | else |
---|
| 162 | begin |
---|
| 163 | ad_RFA_TXD <= ad_RFA_TXD; |
---|
| 164 | end |
---|
| 165 | end |
---|
[1878] | 166 | |
---|
[5036] | 167 | always @(posedge sys_clk) |
---|
| 168 | begin |
---|
[5050] | 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 |
---|
| 181 | end |
---|
| 182 | |
---|
| 183 | always @(posedge sys_clk) |
---|
| 184 | begin |
---|
[5028] | 185 | if(ad_RFB_TRXCLK_pos) |
---|
| 186 | begin |
---|
[5036] | 187 | ad_RFB_TXD <= user_RFB_TXD_I_d; |
---|
[5028] | 188 | end |
---|
[5036] | 189 | else if(ad_RFB_TRXCLK_neg) |
---|
[5028] | 190 | begin |
---|
[5036] | 191 | ad_RFB_TXD <= user_RFB_TXD_Q_d; |
---|
[5028] | 192 | end |
---|
[5036] | 193 | else |
---|
| 194 | begin |
---|
| 195 | ad_RFB_TXD <= ad_RFB_TXD; |
---|
| 196 | end |
---|
[5028] | 197 | end |
---|
[1878] | 198 | |
---|
| 199 | endmodule |
---|