2 from migen
.genlib
.cdc
import MultiReg
3 from migen
.genlib
.misc
import optree
4 from migen
.bank
.description
import *
6 from misoc
.dvisampler
.common
import control_tokens
9 class CharSync(Module
, AutoCSR
):
10 def __init__(self
, required_controls
=8):
11 self
.raw_data
= Signal(10)
12 self
.synced
= Signal()
13 self
.data
= Signal(10)
15 self
._char
_synced
= CSRStatus()
16 self
._ctl
_pos
= CSRStatus(bits_for(9))
20 raw_data1
= Signal(10)
21 self
.sync
.pix
+= raw_data1
.eq(self
.raw_data
)
23 self
.comb
+= raw
.eq(Cat(raw_data1
, self
.raw_data
))
25 found_control
= Signal()
26 control_position
= Signal(max=10)
27 self
.sync
.pix
+= found_control
.eq(0)
29 self
.sync
.pix
+= If(optree("|", [raw
[i
:i
+10] == t
for t
in control_tokens
]),
31 control_position
.eq(i
)
34 control_counter
= Signal(max=required_controls
)
35 previous_control_position
= Signal(max=10)
36 word_sel
= Signal(max=10)
38 If(found_control
& (control_position
== previous_control_position
),
39 If(control_counter
== (required_controls
- 1),
40 control_counter
.eq(0),
42 word_sel
.eq(control_position
)
44 control_counter
.eq(control_counter
+ 1)
49 previous_control_position
.eq(control_position
)
51 self
.specials
+= MultiReg(self
.synced
, self
._char
_synced
.status
)
52 self
.specials
+= MultiReg(word_sel
, self
._ctl
_pos
.status
)
54 self
.sync
.pix
+= self
.data
.eq(raw
>> word_sel
)