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 *
6 from misoclib
.dvisampler
.common
import control_tokens
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)
14 self
._r
_char
_synced
= CSRStatus()
15 self
._r
_ctl
_pos
= CSRStatus(bits_for(9))
19 raw_data1
= Signal(10)
20 self
.sync
.pix
+= raw_data1
.eq(self
.raw_data
)
22 self
.comb
+= raw
.eq(Cat(raw_data1
, self
.raw_data
))
24 found_control
= Signal()
25 control_position
= Signal(max=10)
26 self
.sync
.pix
+= found_control
.eq(0)
28 self
.sync
.pix
+= If(optree("|", [raw
[i
:i
+10] == t
for t
in control_tokens
]),
30 control_position
.eq(i
)
33 control_counter
= Signal(max=required_controls
)
34 previous_control_position
= Signal(max=10)
35 word_sel
= Signal(max=10)
37 If(found_control
& (control_position
== previous_control_position
),
38 If(control_counter
== (required_controls
- 1),
39 control_counter
.eq(0),
41 word_sel
.eq(control_position
)
43 control_counter
.eq(control_counter
+ 1)
48 previous_control_position
.eq(control_position
)
50 self
.specials
+= MultiReg(self
.synced
, self
._r
_char
_synced
.status
)
51 self
.specials
+= MultiReg(word_sel
, self
._r
_ctl
_pos
.status
)
53 self
.sync
.pix
+= self
.data
.eq(raw
>> word_sel
)