mirror of
https://github.com/m-labs/artiq.git
synced 2024-12-19 08:26:30 +08:00
83 lines
3.4 KiB
Python
83 lines
3.4 KiB
Python
from migen import *
|
|
from migen.genlib.io import DifferentialOutput, DifferentialInput, DDROutput
|
|
|
|
|
|
class SamplerPads(Module):
|
|
def __init__(self, platform, eem):
|
|
self.sck_en = Signal()
|
|
self.cnv = Signal()
|
|
self.clkout = Signal()
|
|
|
|
spip = platform.request("{}_adc_spi_p".format(eem))
|
|
spin = platform.request("{}_adc_spi_n".format(eem))
|
|
cnv = platform.request("{}_cnv".format(eem))
|
|
sdr = platform.request("{}_sdr".format(eem))
|
|
dp = platform.request("{}_adc_data_p".format(eem))
|
|
dn = platform.request("{}_adc_data_n".format(eem))
|
|
|
|
clkout_se = Signal()
|
|
clkout_inv = Signal()
|
|
sck = Signal()
|
|
|
|
self.specials += [
|
|
DifferentialOutput(self.cnv, cnv.p, cnv.n),
|
|
DifferentialOutput(1, sdr.p, sdr.n),
|
|
DDROutput(self.sck_en, 0, sck, ClockSignal("rio_phy")),
|
|
DifferentialOutput(sck, spip.clk, spin.clk),
|
|
DifferentialInput(dp.clkout, dn.clkout, clkout_se),
|
|
# FIXME (hardware): CLKOUT is inverted
|
|
# (Sampler v2.0, v2.1) out on rising, in on falling
|
|
Instance("BUFR", i_I=clkout_se, o_O=clkout_inv)
|
|
]
|
|
self.comb += self.clkout.eq(~clkout_inv)
|
|
|
|
# define clock here before the input delays below
|
|
self.clkout_p = dp.clkout # available for false paths
|
|
platform.add_platform_command(
|
|
"create_clock -name {clk} -period 8 [get_nets {clk}]",
|
|
clk=dp.clkout)
|
|
# platform.add_period_constraint(sampler_pads.clkout_p, 8.)
|
|
for i in "abcd":
|
|
sdo = Signal()
|
|
setattr(self, "sdo{}".format(i), sdo)
|
|
if i != "a":
|
|
# FIXME (hardware): sdob, sdoc, sdod are inverted
|
|
# (Sampler v2.0, v2.1)
|
|
sdo, sdo_inv = Signal(), sdo
|
|
self.comb += sdo_inv.eq(~sdo)
|
|
sdop = getattr(dp, "sdo{}".format(i))
|
|
sdon = getattr(dn, "sdo{}".format(i))
|
|
self.specials += [
|
|
DifferentialInput(sdop, sdon, sdo),
|
|
]
|
|
# -0+1.5 hold (t_HSDO_SDR), -0.5+0.5 skew
|
|
platform.add_platform_command(
|
|
"set_input_delay -clock {clk} -max 2 [get_ports {port}]\n"
|
|
"set_input_delay -clock {clk} -min -0.5 [get_ports {port}]",
|
|
clk=dp.clkout, port=sdop)
|
|
|
|
|
|
class UrukulPads(Module):
|
|
def __init__(self, platform, eem0, eem1):
|
|
spip, spin = [[
|
|
platform.request("{}_qspi_{}".format(eem, pol), 0)
|
|
for eem in (eem0, eem1)] for pol in "pn"]
|
|
ioup = [platform.request("{}_io_update".format(eem), 0)
|
|
for eem in (eem0, eem1)]
|
|
self.cs_n = Signal()
|
|
self.clk = Signal()
|
|
self.io_update = Signal()
|
|
self.specials += [(
|
|
DifferentialOutput(~self.cs_n, spip[i].cs, spin[i].cs),
|
|
DifferentialOutput(self.clk, spip[i].clk, spin[i].clk),
|
|
DifferentialOutput(self.io_update, ioup[i].p, ioup[i].n))
|
|
for i in range(2)]
|
|
for i in range(8):
|
|
mosi = Signal()
|
|
setattr(self, "mosi{}".format(i), mosi)
|
|
self.specials += [
|
|
DifferentialOutput(mosi,
|
|
getattr(spip[i // 4], "mosi{}".format(i % 4)),
|
|
getattr(spin[i // 4], "mosi{}".format(i % 4)))
|
|
]
|