mirror of
https://github.com/myhdl/myhdl.git
synced 2024-12-14 07:44:38 +08:00
143 lines
2.8 KiB
Python
143 lines
2.8 KiB
Python
import sys
|
|
import traceback
|
|
|
|
import myhdl
|
|
from myhdl import *
|
|
|
|
class Error(Exception):
|
|
pass
|
|
|
|
def fifo(dout, din, re, we, empty, full, clk, maxFilling=sys.maxint):
|
|
|
|
""" Synchronous fifo model based on a list.
|
|
|
|
Ports:
|
|
dout -- data out
|
|
din -- data in
|
|
re -- read enable
|
|
we -- write enable
|
|
empty -- empty indication flag
|
|
full -- full indication flag
|
|
clk -- clock input
|
|
|
|
Optional parameter:
|
|
maxFilling -- maximum fifo filling, "infinite" by default
|
|
|
|
"""
|
|
|
|
memory = []
|
|
|
|
@always(clk.posedge)
|
|
def access():
|
|
if we:
|
|
memory.insert(0, din.val)
|
|
if re:
|
|
dout.next = memory.pop()
|
|
filling = len(memory)
|
|
empty.next = (filling == 0)
|
|
full.next = (filling == maxFilling)
|
|
|
|
return access
|
|
|
|
|
|
def fifo2(dout, din, re, we, empty, full, clk, maxFilling=sys.maxint):
|
|
|
|
""" Synchronous fifo model based on a list.
|
|
|
|
Ports:
|
|
dout -- data out
|
|
din -- data in
|
|
re -- read enable
|
|
we -- write enable
|
|
empty -- empty indication flag
|
|
full -- full indication flag
|
|
clk -- clock input
|
|
|
|
Optional parameter:
|
|
maxFilling -- maximum fifo filling, "infinite" by default
|
|
|
|
"""
|
|
|
|
memory = []
|
|
|
|
@always(clk.posedge)
|
|
def access():
|
|
if we:
|
|
memory.insert(0, din.val)
|
|
if re:
|
|
try:
|
|
dout.next = memory.pop()
|
|
except IndexError:
|
|
raise Error, "Underflow -- Read from empty fifo"
|
|
filling = len(memory)
|
|
empty.next = (filling == 0)
|
|
full.next = (filling == maxFilling)
|
|
if filling > maxFilling:
|
|
raise Error, "Overflow -- Max filling %s exceeded" % maxFilling
|
|
|
|
return access
|
|
|
|
|
|
dout, din, re, we, empty, full, clk = args = [Signal(0) for i in range(7)]
|
|
|
|
dut = fifo2(dout, din, re, we, empty, full, clk, maxFilling=3)
|
|
|
|
def clkGen():
|
|
while 1:
|
|
yield delay(10)
|
|
clk.next = not clk
|
|
|
|
def read():
|
|
yield clk.negedge
|
|
re.next = 1
|
|
yield clk.posedge
|
|
yield delay(1)
|
|
re.next = 0
|
|
|
|
def write(data):
|
|
yield clk.negedge
|
|
din.next = data
|
|
we.next = 1
|
|
yield clk.posedge
|
|
yield delay(1)
|
|
we.next = 0
|
|
|
|
def report():
|
|
print "dout: %s empty: %s full: %s" % (hex(dout), empty, full)
|
|
|
|
def test():
|
|
yield write(0x55)
|
|
report()
|
|
yield write(0x77)
|
|
report()
|
|
yield write(0x11)
|
|
report()
|
|
yield join(write(0x22), read())
|
|
report()
|
|
yield join(write(0x33), read())
|
|
report()
|
|
yield read()
|
|
report()
|
|
yield read()
|
|
report()
|
|
yield read()
|
|
report()
|
|
yield read()
|
|
report()
|
|
yield read()
|
|
raise StopSimulation
|
|
|
|
|
|
sim = Simulation(clkGen(), test(), dut)
|
|
|
|
def main():
|
|
try:
|
|
sim.run()
|
|
except:
|
|
traceback.print_exc()
|
|
|
|
if __name__ == '__main__':
|
|
main()
|
|
|
|
|