Skip to content

Commit acdd34e

Browse files
author
Sebastien Bourdeauducq
committedJun 29, 2012
framebuffer: VTG and FIFO skeleton
1 parent ccbd5e8 commit acdd34e

File tree

1 file changed

+64
-15
lines changed

1 file changed

+64
-15
lines changed
 

Diff for: ‎milkymist/framebuffer/__init__.py

+64-15
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,24 @@
99
_hbits = 11
1010
_vbits = 11
1111

12+
_bpp = 32
13+
_bpc = 10
14+
_pixel_layout = [
15+
("b", BV(_bpc)),
16+
("g", BV(_bpc)),
17+
("r", BV(_bpc)),
18+
("pad", BV(_bpp-3*_bpc))
19+
]
20+
21+
_bpc_dac = 8
22+
_dac_layout = [
23+
("hsync", BV(1)),
24+
("vsync", BV(1)),
25+
("b", BV(_bpc_dac)),
26+
("g", BV(_bpc_dac)),
27+
("r", BV(_bpc_dac))
28+
]
29+
1230
class _FrameInitiator(Actor):
1331
def __init__(self, asmi_bits, length_bits, alignment_bits):
1432
self._alignment_bits = alignment_bits
@@ -52,6 +70,7 @@ def get_fragment(self):
5270
# TODO: make address updates atomic
5371
token = self.token("frame")
5472
comb = [
73+
self.busy.eq(0),
5574
self.endpoints["frame"].stb.eq(self._enable.field.r),
5675
token.hres.eq(self._hres.field.r),
5776
token.hsync_start.eq(self._hsync_start.field.r),
@@ -66,14 +85,38 @@ def get_fragment(self):
6685
]
6786
return Fragment(comb)
6887

69-
_bpp = 32
70-
_bpc = 10
71-
_pixel_layout = [
72-
("b", BV(_bpc)),
73-
("g", BV(_bpc)),
74-
("r", BV(_bpc)),
75-
("pad", BV(_bpp-3*_bpc))
76-
]
88+
class VTG(Actor):
89+
def __init__(self):
90+
super().__init__(
91+
("timing", Sink, [
92+
("hres", BV(_hbits)),
93+
("hsync_start", BV(_hbits)),
94+
("hsync_end", BV(_hbits)),
95+
("hscan", BV(_hbits)),
96+
("vres", BV(_vbits)),
97+
("vsync_start", BV(_vbits)),
98+
("vsync_end", BV(_vbits)),
99+
("vscan", BV(_vbits))]),
100+
("pixels", Sink, _pixel_layout),
101+
("dac", Source, _dac_layout)
102+
)
103+
104+
def get_fragment(self):
105+
return Fragment() # TODO
106+
107+
class FIFO(Actor):
108+
def __init__(self):
109+
super().__init__(("dac", Sink, _dac_layout))
110+
111+
self.vga_clk = Signal()
112+
self.vga_hsync_n = Signal()
113+
self.vga_vsync_n = Signal()
114+
self.vga_r = Signal(BV(8))
115+
self.vga_g = Signal(BV(8))
116+
self.vga_b = Signal(BV(8))
117+
118+
def get_fragment(self):
119+
return Fragment() # TODO
77120

78121
class Framebuffer:
79122
def __init__(self, address, asmiport):
@@ -90,7 +133,8 @@ def __init__(self, address, asmiport):
90133
dma = ActorNode(dma_asmi.SequentialReader(asmiport))
91134
cast = ActorNode(structuring.Cast(asmiport.hub.dw, packed_pixels))
92135
unpack = ActorNode(structuring.Unpack(pack_factor, _pixel_layout))
93-
# TODO: VTG
136+
vtg = ActorNode(VTG())
137+
fifo = ActorNode(FIFO())
94138

95139
g = DataFlowGraph()
96140
g.add_connection(fi, adrloop, source_subr=["length"])
@@ -100,22 +144,27 @@ def __init__(self, address, asmiport):
100144
g.add_connection(adrbuffer, dma)
101145
g.add_connection(dma, cast)
102146
g.add_connection(cast, unpack)
147+
g.add_connection(unpack, vtg, sink_ep="pixels")
148+
g.add_connection(fi, vtg, sink_ep="timing", source_subr=[
149+
"hres", "hsync_start", "hsync_end", "hscan",
150+
"vres", "vsync_start", "vsync_end", "vscan"])
151+
g.add_connection(vtg, fifo)
103152
self._comp_actor = CompositeActor(g)
104153

105154
self.bank = csrgen.Bank(fi.actor.get_registers(), address=address)
106155

107156
# VGA clock input
108-
self.vga_clk = Signal()
157+
self.vga_clk = fifo.actor.vga_clk
109158

110159
# Pads
111160
self.vga_psave_n = Signal()
112-
self.vga_hsync_n = Signal()
113-
self.vga_vsync_n = Signal()
161+
self.vga_hsync_n = fifo.actor.vga_hsync_n
162+
self.vga_vsync_n = fifo.actor.vga_vsync_n
114163
self.vga_sync_n = Signal()
115164
self.vga_blank_n = Signal()
116-
self.vga_r = Signal(BV(8))
117-
self.vga_g = Signal(BV(8))
118-
self.vga_b = Signal(BV(8))
165+
self.vga_r = fifo.actor.vga_r
166+
self.vga_g = fifo.actor.vga_g
167+
self.vga_b = fifo.actor.vga_b
119168

120169
def get_fragment(self):
121170
comb = [

0 commit comments

Comments
 (0)
Please sign in to comment.