forked from M-Labs/artiq
49 lines
1.4 KiB
Python
49 lines
1.4 KiB
Python
import logging
|
|
|
|
from migen import *
|
|
|
|
from . import spi
|
|
|
|
|
|
logger = logging.getLogger(__name__)
|
|
|
|
|
|
DDSParams = spi.SPIParams
|
|
|
|
|
|
class DDS(spi.SPISimple):
|
|
"""Multi-DDS SPI interface.
|
|
|
|
* Supports SPI DDS chips like the AD9910.
|
|
* Shifts data out to multiple DDS in parallel with a shared CLK and shared
|
|
CS_N line.
|
|
* Supports a single hardcoded command.
|
|
* Configuration and setup must be done over a different channel.
|
|
* Asserts IO_UPDATE for one clock cycle immediately after the SPI transfer.
|
|
"""
|
|
def __init__(self, pads, params):
|
|
super().__init__(pads, params)
|
|
|
|
self.profile = [Signal(32 + 16 + 16, reset_less=True)
|
|
for i in range(params.channels)]
|
|
cmd = Signal(8, reset=0x0e) # write to single tone profile 0
|
|
assert params.width == len(cmd) + len(self.profile[0])
|
|
|
|
self.sync += [
|
|
If(self.start,
|
|
[d.eq(Cat(p, cmd))
|
|
for d, p in zip(self.data, self.profile)]
|
|
)
|
|
]
|
|
|
|
io_update = self._diff(pads, "io_update", output=True)
|
|
# this assumes that the cycle time (1/125 MHz = 8 ns) is >1 SYNC_CLK
|
|
# cycle (1/250 MHz = 4ns)
|
|
done = Signal()
|
|
self.sync += [
|
|
done.eq(self.done)
|
|
]
|
|
self.comb += [
|
|
io_update.eq(self.done & ~done)
|
|
]
|