2014-07-11 00:13:37 +08:00
|
|
|
from artiq.language.core import *
|
2014-05-31 00:20:13 +08:00
|
|
|
from artiq.language.units import *
|
|
|
|
|
2014-09-05 12:03:22 +08:00
|
|
|
|
2014-08-13 18:30:57 +08:00
|
|
|
class DDS(AutoContext):
|
2014-09-05 12:03:22 +08:00
|
|
|
parameters = "dds_sysclk reg_channel rtio_channel"
|
2014-05-31 00:20:13 +08:00
|
|
|
|
2014-09-05 12:03:22 +08:00
|
|
|
def build(self):
|
|
|
|
self._previous_frequency = 0*MHz
|
2014-05-31 00:20:13 +08:00
|
|
|
|
2014-09-05 12:03:22 +08:00
|
|
|
kernel_attr = "_previous_frequency"
|
2014-05-31 00:20:13 +08:00
|
|
|
|
2014-09-05 12:03:22 +08:00
|
|
|
@kernel
|
|
|
|
def pulse(self, frequency, duration):
|
|
|
|
if self._previous_frequency != frequency:
|
|
|
|
syscall("rtio_sync", self.rtio_channel) # wait until output is off
|
|
|
|
syscall("dds_program", self.reg_channel,
|
|
|
|
int(2**32*frequency/self.dds_sysclk))
|
|
|
|
self._previous_frequency = frequency
|
|
|
|
syscall("rtio_set", now(), self.rtio_channel, 1)
|
|
|
|
delay(duration)
|
|
|
|
syscall("rtio_set", now(), self.rtio_channel, 0)
|