dvisampler/resdetection: use DE instead of hsync
This commit is contained in:
parent
e3e1dcd547
commit
ea20b74ed1
|
@ -4,68 +4,46 @@ from migen.genlib.cdc import MultiReg
|
||||||
from migen.bank.description import *
|
from migen.bank.description import *
|
||||||
|
|
||||||
class ResolutionDetection(Module, AutoCSR):
|
class ResolutionDetection(Module, AutoCSR):
|
||||||
def __init__(self, nbits=10):
|
def __init__(self, nbits=11):
|
||||||
self.hsync = Signal()
|
|
||||||
self.vsync = Signal()
|
self.vsync = Signal()
|
||||||
self.de = Signal()
|
self.de = Signal()
|
||||||
|
|
||||||
self._hres = CSRStatus(nbits)
|
self._hres = CSRStatus(nbits)
|
||||||
self._vres = CSRStatus(nbits)
|
self._vres = CSRStatus(nbits)
|
||||||
self._de_cycles = CSRStatus(2*nbits)
|
|
||||||
|
|
||||||
###
|
###
|
||||||
|
|
||||||
# HRES/VRES
|
# Detect DE transitions
|
||||||
hsync_r = Signal()
|
|
||||||
vsync_r = Signal()
|
|
||||||
p_hsync = Signal()
|
|
||||||
p_vsync = Signal()
|
|
||||||
self.sync.pix += [
|
|
||||||
hsync_r.eq(self.hsync),
|
|
||||||
vsync_r.eq(self.vsync),
|
|
||||||
]
|
|
||||||
self.comb += [
|
|
||||||
p_hsync.eq(self.hsync & ~hsync_r),
|
|
||||||
p_vsync.eq(self.vsync & ~vsync_r)
|
|
||||||
]
|
|
||||||
|
|
||||||
hcounter = Signal(nbits)
|
|
||||||
vcounter = Signal(nbits)
|
|
||||||
self.sync.pix += [
|
|
||||||
If(p_hsync,
|
|
||||||
hcounter.eq(0)
|
|
||||||
).Elif(self.de,
|
|
||||||
hcounter.eq(hcounter + 1)
|
|
||||||
),
|
|
||||||
If(p_vsync,
|
|
||||||
vcounter.eq(0)
|
|
||||||
).Elif(p_hsync,
|
|
||||||
vcounter.eq(vcounter + 1)
|
|
||||||
)
|
|
||||||
]
|
|
||||||
|
|
||||||
hcounter_st = Signal(nbits)
|
|
||||||
vcounter_st = Signal(nbits)
|
|
||||||
self.sync.pix += [
|
|
||||||
If(p_hsync & (hcounter != 0), hcounter_st.eq(hcounter)),
|
|
||||||
If(p_vsync & (vcounter != 0), vcounter_st.eq(vcounter))
|
|
||||||
]
|
|
||||||
self.specials += MultiReg(hcounter_st, self._hres.status)
|
|
||||||
self.specials += MultiReg(vcounter_st, self._vres.status)
|
|
||||||
|
|
||||||
# DE
|
|
||||||
de_r = Signal()
|
de_r = Signal()
|
||||||
pn_de = Signal()
|
pn_de = Signal()
|
||||||
self.sync.pix += de_r.eq(self.de)
|
self.sync.pix += de_r.eq(self.de)
|
||||||
self.comb += pn_de.eq(~self.de & de_r)
|
self.comb += pn_de.eq(~self.de & de_r)
|
||||||
|
|
||||||
decounter = Signal(2*nbits)
|
# HRES
|
||||||
|
hcounter = Signal(nbits)
|
||||||
self.sync.pix += If(self.de,
|
self.sync.pix += If(self.de,
|
||||||
decounter.eq(decounter + 1)
|
hcounter.eq(hcounter + 1)
|
||||||
).Else(
|
).Else(
|
||||||
decounter.eq(0)
|
hcounter.eq(0)
|
||||||
)
|
)
|
||||||
|
|
||||||
decounter_st = Signal(2*nbits)
|
hcounter_st = Signal(nbits)
|
||||||
self.sync.pix += If(pn_de, decounter_st.eq(decounter))
|
self.sync.pix += If(pn_de, hcounter_st.eq(hcounter))
|
||||||
self.specials += MultiReg(decounter_st, self._de_cycles.status)
|
self.specials += MultiReg(hcounter_st, self._hres.status)
|
||||||
|
|
||||||
|
# VRES
|
||||||
|
vsync_r = Signal()
|
||||||
|
p_vsync = Signal()
|
||||||
|
self.sync.pix += vsync_r.eq(self.vsync),
|
||||||
|
self.comb += p_vsync.eq(self.vsync & ~vsync_r)
|
||||||
|
|
||||||
|
vcounter = Signal(nbits)
|
||||||
|
self.sync.pix += If(p_vsync,
|
||||||
|
vcounter.eq(0)
|
||||||
|
).Elif(pn_de,
|
||||||
|
vcounter.eq(vcounter + 1)
|
||||||
|
)
|
||||||
|
|
||||||
|
vcounter_st = Signal(nbits)
|
||||||
|
self.sync.pix += If(p_vsync, vcounter_st.eq(vcounter))
|
||||||
|
self.specials += MultiReg(vcounter_st, self._vres.status)
|
||||||
|
|
Loading…
Reference in New Issue