Skip to content

Commit 2b85624

Browse files
author
Sebastien Bourdeauducq
committedJul 3, 2012
framebuffer: make simulation easier
1 parent 210e473 commit 2b85624

File tree

2 files changed

+55
-9
lines changed

2 files changed

+55
-9
lines changed
 

‎milkymist/framebuffer/__init__.py

+21-9
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
from migen.flow.actor import *
33
from migen.flow.network import *
44
from migen.flow import plumbing
5-
from migen.actorlib import ala, misc, dma_asmi, structuring
5+
from migen.actorlib import ala, misc, dma_asmi, structuring, sim
66
from migen.bank.description import *
77
from migen.bank import csrgen
88

@@ -202,6 +202,12 @@ def get_fragment(self):
202202
],
203203
instances=[asfifo])
204204

205+
def sim_fifo_gen():
206+
while True:
207+
t = sim.Token("dac")
208+
yield t
209+
print("H/V:" + str(t.value["hsync"]) + str(t.value["vsync"]))
210+
205211
class FakeDMA(Actor):
206212
def __init__(self, port):
207213
self.port = port
@@ -222,7 +228,7 @@ def get_fragment(self):
222228
return Fragment(comb, sync)
223229

224230
class Framebuffer:
225-
def __init__(self, address, asmiport):
231+
def __init__(self, address, asmiport, simulation=False):
226232
asmi_bits = asmiport.hub.aw
227233
alignment_bits = bits_for(asmiport.hub.dw//8) - 1
228234
length_bits = _hbits + _vbits + 2 - alignment_bits
@@ -238,7 +244,10 @@ def __init__(self, address, asmiport):
238244
cast = ActorNode(structuring.Cast(asmiport.hub.dw, packed_pixels))
239245
unpack = ActorNode(structuring.Unpack(pack_factor, _pixel_layout))
240246
vtg = ActorNode(VTG())
241-
fifo = ActorNode(FIFO())
247+
if simulation:
248+
fifo = ActorNode(sim.SimActor(sim_fifo_gen(), ("dac", Sink, _dac_layout)))
249+
else:
250+
fifo = ActorNode(FIFO())
242251

243252
g = DataFlowGraph()
244253
g.add_connection(fi, adrloop, source_subr=["length"])
@@ -258,17 +267,20 @@ def __init__(self, address, asmiport):
258267
self.bank = csrgen.Bank(fi.actor.get_registers(), address=address)
259268

260269
# VGA clock input
261-
self.vga_clk = fifo.actor.vga_clk
270+
if not simulation:
271+
self.vga_clk = fifo.actor.vga_clk
262272

263273
# Pads
264274
self.vga_psave_n = Signal()
265-
self.vga_hsync_n = fifo.actor.vga_hsync_n
266-
self.vga_vsync_n = fifo.actor.vga_vsync_n
275+
if not simulation:
276+
self.vga_hsync_n = fifo.actor.vga_hsync_n
277+
self.vga_vsync_n = fifo.actor.vga_vsync_n
267278
self.vga_sync_n = Signal()
268279
self.vga_blank_n = Signal()
269-
self.vga_r = fifo.actor.vga_r
270-
self.vga_g = fifo.actor.vga_g
271-
self.vga_b = fifo.actor.vga_b
280+
if not simulation:
281+
self.vga_r = fifo.actor.vga_r
282+
self.vga_g = fifo.actor.vga_g
283+
self.vga_b = fifo.actor.vga_b
272284

273285
def get_fragment(self):
274286
comb = [

‎tb/framebuffer/framebuffer.py

+34
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,34 @@
1+
from migen.fhdl.structure import *
2+
from migen.bus import asmibus
3+
from migen.sim.generic import Simulator, TopLevel
4+
from migen.sim.icarus import Runner
5+
6+
from milkymist.framebuffer import *
7+
8+
def main():
9+
hub = asmibus.Hub(16, 128)
10+
port = hub.get_port()
11+
hub.finalize()
12+
13+
dut = Framebuffer(1, port, True)
14+
15+
fragment = hub.get_fragment() + dut.get_fragment()
16+
sim = Simulator(fragment, Runner(), TopLevel("my.vcd"))
17+
18+
sim.run(1)
19+
def csr_w(addr, d):
20+
sim.wr(dut.bank.description[addr].field.storage, d)
21+
csr_w(1, 2) # hres
22+
csr_w(2, 3) # hsync_start
23+
csr_w(3, 4) # hsync_stop
24+
csr_w(4, 5) # hscan
25+
csr_w(5, 2) # vres
26+
csr_w(6, 3) # vsync_start
27+
csr_w(7, 4) # vsync_stop
28+
csr_w(8, 5) # vscan
29+
csr_w(10, 2*2*4) # length
30+
csr_w(0, 1) # enable
31+
32+
sim.run(200)
33+
34+
main()

0 commit comments

Comments
 (0)
Please sign in to comment.