self.comb += [
self.fi.trigger.eq(self._enable.storage),
self.dma.generator.trigger.eq(self._enable.storage),
- vtg.enable.eq(self._enable.storage)
]
class Blender(PipelinedActor, AutoCSR):
setattr(self, "dma"+str(n), dma)
vtg = VTG(pack_factor)
- self.comb += vtg.enable.eq(self._enable.storage)
g.add_connection(self.fi, vtg, sink_ep="timing")
g.add_connection(self.blender, vtg, sink_ep="pixels")
g.add_connection(vtg, self.driver)
class VTG(Module):
def __init__(self, pack_factor):
hbits_dyn = _hbits - log2_int(pack_factor)
- self.enable = Signal()
self.timing = Sink([
("hres", hbits_dyn),
("hsync_start", hbits_dyn),
self.phy = Source(phy_layout(pack_factor))
self.busy = Signal()
- ###
-
hactive = Signal()
vactive = Signal()
active = Signal()
),
generate_en.eq(self.timing.stb & (~active | self.pixels.stb)),
- self.pixels.ack.eq(~self.enable | (self.phy.ack & active)),
+ self.pixels.ack.eq(self.phy.ack & active),
self.phy.stb.eq(generate_en),
self.busy.eq(generate_en)
]
tp = self.timing.payload
self.sync += [
- If(self.enable,
- self.timing.ack.eq(0),
- If(generate_en & self.phy.ack,
- hcounter.eq(hcounter + 1),
+ self.timing.ack.eq(0),
+ If(generate_en & self.phy.ack,
+ hcounter.eq(hcounter + 1),
+
+ If(hcounter == 0, hactive.eq(1)),
+ If(hcounter == tp.hres, hactive.eq(0)),
+ If(hcounter == tp.hsync_start, self.phy.payload.hsync.eq(1)),
+ If(hcounter == tp.hsync_end, self.phy.payload.hsync.eq(0)),
+ If(hcounter == tp.hscan,
+ hcounter.eq(0),
+ If(vcounter == tp.vscan,
+ vcounter.eq(0),
+ self.timing.ack.eq(1)
+ ).Else(
+ vcounter.eq(vcounter + 1)
+ )
+ ),
- If(hcounter == 0, hactive.eq(1)),
- If(hcounter == tp.hres, hactive.eq(0)),
- If(hcounter == tp.hsync_start, self.phy.payload.hsync.eq(1)),
- If(hcounter == tp.hsync_end, self.phy.payload.hsync.eq(0)),
- If(hcounter == tp.hscan,
- hcounter.eq(0),
- If(vcounter == tp.vscan,
- vcounter.eq(0),
- self.timing.ack.eq(1)
- ).Else(
- vcounter.eq(vcounter + 1)
- )
- ),
-
- If(vcounter == 0, vactive.eq(1)),
- If(vcounter == tp.vres, vactive.eq(0)),
- If(vcounter == tp.vsync_start, self.phy.payload.vsync.eq(1)),
- If(vcounter == tp.vsync_end, self.phy.payload.vsync.eq(0))
- )
- ).Else(
- self.timing.ack.eq(1),
- hcounter.eq(0),
- vcounter.eq(0)
+ If(vcounter == 0, vactive.eq(1)),
+ If(vcounter == tp.vres, vactive.eq(0)),
+ If(vcounter == tp.vsync_start, self.phy.payload.vsync.eq(1)),
+ If(vcounter == tp.vsync_end, self.phy.payload.vsync.eq(0))
)
]