2015-06-20 05:30:17 +08:00
|
|
|
from migen.fhdl.std import *
|
|
|
|
|
2015-06-29 03:37:27 +08:00
|
|
|
from artiq.gateware import ad9xxx
|
2015-06-20 05:30:17 +08:00
|
|
|
from artiq.gateware.rtio.phy.wishbone import RT2WB
|
|
|
|
|
|
|
|
|
2015-06-29 03:37:27 +08:00
|
|
|
class _AD9xxx(Module):
|
|
|
|
def __init__(self, ftw_base, pads, nchannels, **kwargs):
|
2015-06-20 05:30:17 +08:00
|
|
|
self.submodules._ll = RenameClockDomains(
|
2015-06-29 03:37:27 +08:00
|
|
|
ad9xxx.AD9xxx(pads, **kwargs), "rio")
|
|
|
|
self.submodules._rt2wb = RT2WB(flen(pads.a)+1, self._ll.bus)
|
2015-06-20 05:30:17 +08:00
|
|
|
self.rtlink = self._rt2wb.rtlink
|
|
|
|
self.probes = [Signal(32) for i in range(nchannels)]
|
|
|
|
|
|
|
|
# # #
|
|
|
|
|
|
|
|
# keep track of the currently selected channel
|
|
|
|
current_channel = Signal(max=nchannels)
|
2015-06-29 03:37:27 +08:00
|
|
|
self.sync.rio += If(self.rtlink.o.stb &
|
|
|
|
(self.rtlink.o.address == 2**flen(pads.a)+1),
|
|
|
|
current_channel.eq(self.rtlink.o.data))
|
2015-06-20 05:30:17 +08:00
|
|
|
|
|
|
|
# keep track of frequency tuning words, before they are FUDed
|
|
|
|
ftws = [Signal(32) for i in range(nchannels)]
|
2015-06-20 07:36:46 +08:00
|
|
|
for c, ftw in enumerate(ftws):
|
2015-06-29 03:37:27 +08:00
|
|
|
if flen(pads.d) == 8:
|
|
|
|
for i in range(4):
|
|
|
|
self.sync.rio += \
|
|
|
|
If(self.rtlink.o.stb & \
|
|
|
|
(self.rtlink.o.address == ftw_base+i) & \
|
|
|
|
(current_channel == c),
|
|
|
|
ftw[i*8:(i+1)*8].eq(self.rtlink.o.data)
|
|
|
|
)
|
|
|
|
elif flen(pads.d) == 16:
|
|
|
|
for i in range(2):
|
|
|
|
self.sync.rio += \
|
|
|
|
If(self.rtlink.o.stb & \
|
|
|
|
(self.rtlink.o.address == ftw_base+2*i) & \
|
|
|
|
(current_channel == c),
|
|
|
|
ftw[i*16:(i+1)*16].eq(self.rtlink.o.data)
|
|
|
|
)
|
|
|
|
else:
|
|
|
|
raise NotImplementedError
|
2015-06-20 05:30:17 +08:00
|
|
|
|
|
|
|
# FTW to probe on FUD
|
2015-06-20 07:36:46 +08:00
|
|
|
for c, (probe, ftw) in enumerate(zip(self.probes, ftws)):
|
2015-06-29 03:37:27 +08:00
|
|
|
fud = self.rtlink.o.stb & \
|
|
|
|
(self.rtlink.o.address == 2**flen(pads.a))
|
2015-06-20 05:30:17 +08:00
|
|
|
self.sync.rio += If(fud & (current_channel == c), probe.eq(ftw))
|
2015-06-29 03:37:27 +08:00
|
|
|
|
|
|
|
|
|
|
|
class AD9858(_AD9xxx):
|
|
|
|
def __init__(self, pads, nchannels, **kwargs):
|
|
|
|
_AD9xxx.__init__(self, 0x0a, pads, nchannels, **kwargs)
|
|
|
|
|
|
|
|
|
|
|
|
class AD9914(_AD9xxx):
|
|
|
|
def __init__(self, pads, nchannels, **kwargs):
|
|
|
|
_AD9xxx.__init__(self, 0x2d, pads, nchannels, **kwargs)
|