remove stale programmer.py
[litex.git] / misoclib / dvisampler / charsync.py
1 from migen.fhdl.std import *
2 from migen.genlib.cdc import MultiReg
3 from migen.genlib.misc import optree
4 from migen.bank.description import *
5
6 from misoclib.dvisampler.common import control_tokens
7
8 class CharSync(Module, AutoCSR):
9 def __init__(self, required_controls=8):
10 self.raw_data = Signal(10)
11 self.synced = Signal()
12 self.data = Signal(10)
13
14 self._r_char_synced = CSRStatus()
15 self._r_ctl_pos = CSRStatus(bits_for(9))
16
17 ###
18
19 raw_data1 = Signal(10)
20 self.sync.pix += raw_data1.eq(self.raw_data)
21 raw = Signal(20)
22 self.comb += raw.eq(Cat(raw_data1, self.raw_data))
23
24 found_control = Signal()
25 control_position = Signal(max=10)
26 self.sync.pix += found_control.eq(0)
27 for i in range(10):
28 self.sync.pix += If(optree("|", [raw[i:i+10] == t for t in control_tokens]),
29 found_control.eq(1),
30 control_position.eq(i)
31 )
32
33 control_counter = Signal(max=required_controls)
34 previous_control_position = Signal(max=10)
35 word_sel = Signal(max=10)
36 self.sync.pix += [
37 If(found_control & (control_position == previous_control_position),
38 If(control_counter == (required_controls - 1),
39 control_counter.eq(0),
40 self.synced.eq(1),
41 word_sel.eq(control_position)
42 ).Else(
43 control_counter.eq(control_counter + 1)
44 )
45 ).Else(
46 control_counter.eq(0)
47 ),
48 previous_control_position.eq(control_position)
49 ]
50 self.specials += MultiReg(self.synced, self._r_char_synced.status)
51 self.specials += MultiReg(word_sel, self._r_ctl_pos.status)
52
53 self.sync.pix += self.data.eq(raw >> word_sel)