52 lines
1.5 KiB
Python
52 lines
1.5 KiB
Python
|
from migen.fhdl.structure import *
|
||
|
from migen.fhdl.module import Module
|
||
|
from migen.genlib.cdc import MultiReg
|
||
|
from migen.genlib.misc import optree
|
||
|
from migen.bank.description import *
|
||
|
|
||
|
_control_tokens = [0b1101010100, 0b0010101011, 0b0101010100, 0b1010101011]
|
||
|
|
||
|
class CharSync(Module, AutoReg):
|
||
|
def __init__(self, required_controls=8):
|
||
|
self.raw_data = Signal(10)
|
||
|
self.char_synced = Signal()
|
||
|
self.data = Signal(10)
|
||
|
|
||
|
self._r_char_synced = RegisterField(1, READ_ONLY, WRITE_ONLY)
|
||
|
|
||
|
###
|
||
|
|
||
|
raw_data1 = Signal(10)
|
||
|
self.sync.pix += raw_data1.eq(self.raw_data)
|
||
|
raw = Signal(20)
|
||
|
self.comb += raw.eq(Cat(raw_data1, self.raw_data))
|
||
|
|
||
|
found_control = Signal()
|
||
|
control_position = Signal(max=10)
|
||
|
for i in range(10):
|
||
|
self.sync.pix += If(optree("|", [raw[i:i+10] == t for t in _control_tokens]),
|
||
|
found_control.eq(1),
|
||
|
control_position.eq(i)
|
||
|
)
|
||
|
|
||
|
control_counter = Signal(max=required_controls)
|
||
|
previous_control_position = Signal(max=10)
|
||
|
word_sel = Signal(max=10)
|
||
|
self.sync.pix += [
|
||
|
If(found_control & (control_position == previous_control_position),
|
||
|
If(control_counter == (required_controls - 1),
|
||
|
control_counter.eq(0),
|
||
|
self.char_synced.eq(1),
|
||
|
word_sel.eq(control_position)
|
||
|
).Else(
|
||
|
control_counter.eq(control_counter + 1)
|
||
|
)
|
||
|
).Else(
|
||
|
control_counter.eq(0)
|
||
|
),
|
||
|
previous_control_position.eq(control_position)
|
||
|
]
|
||
|
self.specials += MultiReg(self.char_synced, self._r_char_synced.field.w)
|
||
|
|
||
|
self.sync.pix += self.data.eq(raw >> word_sel)
|