artiq/artiq/gateware/rtio/phy/phaser.py

65 lines
2.2 KiB
Python
Raw Normal View History

2020-08-21 19:31:26 +08:00
from migen import *
2020-08-26 23:10:50 +08:00
from misoc.cores.duc import MultiDDS
2020-08-21 19:31:26 +08:00
from artiq.gateware.rtio import rtlink
2020-08-21 23:21:36 +08:00
from .fastlink import SerDes, SerInterface
2020-08-21 19:31:26 +08:00
2020-08-26 23:10:50 +08:00
class DDSChannel(Module):
def __init__(self):
self.rtlink = rtlink.Interface(
rtlink.OInterface(data_width=32, address_width=4,
enable_replace=True))
self.submodules.dds = MultiDDS(n=5, fwidth=32, xwidth=16)
2020-08-21 19:31:26 +08:00
class Phaser(Module):
def __init__(self, pins, pins_n):
2020-08-26 23:10:50 +08:00
self.rtlink = rtlink.Interface(
2020-08-21 19:31:26 +08:00
rtlink.OInterface(data_width=8, address_width=8,
enable_replace=False),
2020-08-22 19:46:41 +08:00
rtlink.IInterface(data_width=10))
2020-08-26 23:10:50 +08:00
self.submodules.dds0 = DDSChannel()
self.submodules.dds1 = DDSChannel()
2020-08-21 19:31:26 +08:00
self.submodules.serializer = SerDes(
2020-08-21 23:21:36 +08:00
n_data=8, t_clk=8, d_clk=0b00001111,
n_frame=10, n_crc=6, poly=0x2f)
self.submodules.intf = SerInterface(pins, pins_n)
self.comb += [
Cat(self.intf.data[:-1]).eq(Cat(self.serializer.data[:-1])),
self.serializer.data[-1].eq(self.intf.data[-1]),
]
2020-08-21 19:31:26 +08:00
header = Record([
("we", 1),
("addr", 7),
("data", 8),
("type", 4)
])
n_channels = 2
n_samples = 8
2020-08-22 19:46:41 +08:00
n_bits = 14
2020-08-24 23:46:31 +08:00
body = [Signal(n_bits) for i in range(n_channels*n_samples*2)]
2020-08-21 19:31:26 +08:00
assert len(Cat(header.raw_bits(), body)) == \
len(self.serializer.payload)
self.comb += self.serializer.payload.eq(Cat(header.raw_bits(), body))
2020-08-24 22:49:36 +08:00
re_dly = Signal(3) # stage, send, respond
self.sync.rtio += [
header.type.eq(1), # reserved
2020-08-21 19:31:26 +08:00
If(self.serializer.stb,
header.we.eq(0),
2020-08-24 22:49:36 +08:00
re_dly.eq(re_dly[1:]),
2020-08-21 19:31:26 +08:00
),
2020-08-26 23:10:50 +08:00
If(self.rtlink.o.stb,
re_dly[-1].eq(~self.rtlink.o.address[-1]),
header.we.eq(self.rtlink.o.address[-1]),
header.addr.eq(self.rtlink.o.address),
header.data.eq(self.rtlink.o.data),
2020-08-21 19:31:26 +08:00
),
2020-08-26 23:10:50 +08:00
self.rtlink.i.stb.eq(re_dly[0] & self.serializer.stb),
self.rtlink.i.data.eq(self.serializer.readback),
2020-08-21 19:31:26 +08:00
]