59 lines
1007 B
Python
59 lines
1007 B
Python
|
from migen.fhdl.std import *
|
||
|
from migen.genlib.fsm import *
|
||
|
from migen.actorlib.fifo import *
|
||
|
from migen.flow.actor import EndpointDescription
|
||
|
|
||
|
user_layout = EndpointDescription(
|
||
|
[ ("dst", 8),
|
||
|
("length", 4*8),
|
||
|
("error", 1),
|
||
|
("d", 8)
|
||
|
],
|
||
|
packetized=True
|
||
|
)
|
||
|
|
||
|
phy_layout = [
|
||
|
("d", 8)
|
||
|
]
|
||
|
|
||
|
class FtdiPipe:
|
||
|
def __init__(self, layout):
|
||
|
self.sink = Sink(layout)
|
||
|
self.source = Source(layout)
|
||
|
|
||
|
class FtdiTimeout(Module):
|
||
|
def __init__(self, clk_freq, length):
|
||
|
cnt_max = int(clk_freq*length)
|
||
|
width = bits_for(cnt_max)
|
||
|
|
||
|
self.clear = Signal()
|
||
|
self.done = Signal()
|
||
|
|
||
|
cnt = Signal(width)
|
||
|
self.sync += \
|
||
|
If(self.clear,
|
||
|
cnt.eq(0)
|
||
|
).Elif(~self.done,
|
||
|
cnt.eq(cnt+1)
|
||
|
)
|
||
|
self.comb += self.done.eq(cnt == cnt_max)
|
||
|
|
||
|
#
|
||
|
# TB
|
||
|
#
|
||
|
import random
|
||
|
|
||
|
def randn(max_n):
|
||
|
return random.randint(0, max_n-1)
|
||
|
|
||
|
class RandRun:
|
||
|
def __init__(self, level=0):
|
||
|
self.run = True
|
||
|
self.level = level
|
||
|
|
||
|
def do_simulation(self, selfp):
|
||
|
self.run = True
|
||
|
n = randn(100)
|
||
|
if n < self.level:
|
||
|
self.run = False
|