edid.py: sample SCL only every 64 clock cycles, to avoid bouncing
Possibly due to SCL rising fairly slowly (in the 0.5-1 us range), bouncing has been observed while crossing the "forbidden" region between Vil(max) and Vih(min). By lowering the sample rate from once per system clock to once every 64 clock cycles, we make sure we sample at most once during the bounce interval and thus never see a false edge. (Although we may see a rising edge one sample time late, which is perfectly harmless.)
This commit is contained in:
parent
950d3a4469
commit
7a6e56492c
|
@ -23,24 +23,25 @@ class EDID(Module, AutoCSR):
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
scl_i = Signal()
|
scl_raw = Signal()
|
||||||
sda_i = Signal()
|
sda_i = Signal()
|
||||||
sda_drv = Signal()
|
sda_drv = Signal()
|
||||||
_sda_drv_reg = Signal()
|
_sda_drv_reg = Signal()
|
||||||
_sda_i_async = Signal()
|
_sda_i_async = Signal()
|
||||||
self.sync += _sda_drv_reg.eq(sda_drv)
|
self.sync += _sda_drv_reg.eq(sda_drv)
|
||||||
self.specials += [
|
self.specials += [
|
||||||
MultiReg(pads.scl, scl_i),
|
MultiReg(pads.scl, scl_raw),
|
||||||
Tristate(pads.sda, 0, _sda_drv_reg, _sda_i_async),
|
Tristate(pads.sda, 0, _sda_drv_reg, _sda_i_async),
|
||||||
MultiReg(_sda_i_async, sda_i)
|
MultiReg(_sda_i_async, sda_i)
|
||||||
]
|
]
|
||||||
|
|
||||||
# FIXME: understand what is really going on here and get rid of that workaround
|
scl_i = Signal()
|
||||||
for x in range(20):
|
samp_count = Signal(6)
|
||||||
new_scl = Signal()
|
samp_carry = Signal()
|
||||||
self.sync += new_scl.eq(scl_i)
|
self.sync += [
|
||||||
scl_i = new_scl
|
Cat(samp_count, samp_carry).eq(samp_count + 1),
|
||||||
#
|
If(samp_carry, scl_i.eq(scl_raw))
|
||||||
|
]
|
||||||
|
|
||||||
scl_r = Signal()
|
scl_r = Signal()
|
||||||
sda_r = Signal()
|
sda_r = Signal()
|
||||||
|
|
Loading…
Reference in New Issue