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:
Werner Almesberger 2013-04-12 17:38:31 -03:00 committed by Sebastien Bourdeauducq
parent 950d3a4469
commit 7a6e56492c
1 changed files with 9 additions and 8 deletions

View File

@ -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()