1
1
import argparse
2
2
3
3
from migen import *
4
+ from migen .build .generic_platform import *
4
5
from migen .build .platforms import kc705
5
6
6
7
from misoc .cores .i2c import *
12
13
from artiq .gateware .drtio import DRTIOSatellite
13
14
14
15
16
+ # TODO: parameters for sawg_3g
15
17
def get_i2c_program (sys_clk_freq ):
16
18
# NOTE: the logical parameters DO NOT MAP to physical values written
17
19
# into registers. They have to be mapped; see the datasheet.
@@ -111,8 +113,16 @@ def __init__(self, platform, sys_clk_freq):
111
113
)
112
114
113
115
116
+ fmc_clock_io = [
117
+ ("ad9154_refclk" , 0 ,
118
+ Subsignal ("p" , Pins ("HPC:GBTCLK0_M2C_P" )),
119
+ Subsignal ("n" , Pins ("HPC:GBTCLK0_M2C_N" )),
120
+ )
121
+ ]
122
+
123
+
114
124
class Satellite (Module ):
115
- def __init__ (self , toolchain = "vivado" ):
125
+ def __init__ (self , cfg , medium , toolchain ):
116
126
self .platform = platform = kc705 .Platform (toolchain = toolchain )
117
127
118
128
rtio_channels = []
@@ -141,12 +151,36 @@ def __init__(self, toolchain="vivado"):
141
151
sequencer .reset .eq (si5324_reset_clock .si5324_not_ready )
142
152
]
143
153
144
- self .comb += platform .request ("sfp_tx_disable_n" ).eq (1 )
145
- self .submodules .transceiver = gtx_7series .GTX_1000BASE_BX10 (
146
- clock_pads = platform .request ("si5324_clkout" ),
147
- tx_pads = platform .request ("sfp_tx" ),
148
- rx_pads = platform .request ("sfp_rx" ),
149
- sys_clk_freq = sys_clk_freq )
154
+ if medium == "sfp" :
155
+ self .comb += platform .request ("sfp_tx_disable_n" ).eq (1 )
156
+ tx_pads = platform .request ("sfp_tx" )
157
+ rx_pads = platform .request ("sfp_rx" )
158
+ elif medium == "sma" :
159
+ tx_pads = platform .request ("user_sma_mgt_tx" )
160
+ rx_pads = platform .request ("user_sma_mgt_rx" )
161
+ else :
162
+ raise ValueError
163
+
164
+ if cfg == "simple_gbe" :
165
+ # GTX_1000BASE_BX10 Ethernet compatible, 62.5MHz RTIO clock
166
+ # simple TTLs
167
+ self .submodules .transceiver = gtx_7series .GTX_1000BASE_BX10 (
168
+ clock_pads = platform .request ("sgmii_clock" ),
169
+ tx_pads = tx_pads ,
170
+ rx_pads = rx_pads ,
171
+ sys_clk_freq = sys_clk_freq ,
172
+ clock_div2 = True )
173
+ elif cfg == "sawg_3g" :
174
+ # 3Gb link, 150MHz RTIO clock
175
+ # with SAWG on local RTIO and AD9154-FMC-EBZ
176
+ platform .register_extension (fmc_clock_io )
177
+ self .submodules .transceiver = gtx_7series .GTX_3G (
178
+ clock_pads = platform .request ("ad9154_refclk" ),
179
+ tx_pads = tx_pads ,
180
+ rx_pads = rx_pads ,
181
+ sys_clk_freq = sys_clk_freq )
182
+ else :
183
+ raise ValueError
150
184
self .submodules .rx_synchronizer = gtx_7series .RXSynchronizer (
151
185
self .transceiver .rtio_clk_freq )
152
186
self .submodules .drtio = DRTIOSatellite (
@@ -163,9 +197,15 @@ def main():
163
197
parser .add_argument ("--output-dir" , default = "drtiosat_kc705" ,
164
198
help = "output directory for generated "
165
199
"source files and binaries" )
200
+ parser .add_argument ("-c" , "--config" , default = "simple_gbe" ,
201
+ help = "configuration: simple_gbe/sawg_3g "
202
+ "(default: %(default)s)" )
203
+ parser .add_argument ("--medium" , default = "sfp" ,
204
+ help = "medium to use for transceiver link: sfp/sma "
205
+ "(default: %(default)s)" )
166
206
args = parser .parse_args ()
167
207
168
- top = Satellite (args .toolchain )
208
+ top = Satellite (args .config , args . medium , args . toolchain )
169
209
top .build (build_dir = args .output_dir )
170
210
171
211
if __name__ == "__main__" :
0 commit comments