dvisampler: add resolution detection

This commit is contained in:
Sebastien Bourdeauducq 2013-03-24 00:45:29 +01:00
parent ee5bfd4d3d
commit 1333367de8
2 changed files with 79 additions and 0 deletions

View File

@ -8,6 +8,7 @@ from milkymist.dvisampler.datacapture import DataCapture
from milkymist.dvisampler.charsync import CharSync from milkymist.dvisampler.charsync import CharSync
from milkymist.dvisampler.decoding import Decoding from milkymist.dvisampler.decoding import Decoding
from milkymist.dvisampler.chansync import ChanSync from milkymist.dvisampler.chansync import ChanSync
from milkymist.dvisampler.resdetection import ResolutionDetection
class DVISampler(Module, AutoReg): class DVISampler(Module, AutoReg):
def __init__(self, inversions=""): def __init__(self, inversions=""):
@ -59,3 +60,10 @@ class DVISampler(Module, AutoReg):
b = self.chansync.data_out0.d b = self.chansync.data_out0.d
hsync = self.chansync.data_out0.c[0] hsync = self.chansync.data_out0.c[0]
vsync = self.chansync.data_out0.c[1] vsync = self.chansync.data_out0.c[1]
self.submodules.resdetection = ResolutionDetection()
self.comb += [
self.resdetection.de.eq(de),
self.resdetection.hsync.eq(hsync),
self.resdetection.vsync.eq(vsync)
]

View File

@ -0,0 +1,71 @@
from migen.fhdl.structure import *
from migen.fhdl.module import Module
from migen.genlib.cdc import MultiReg
from migen.bank.description import *
class ResolutionDetection(Module, AutoReg):
def __init__(self, nbits=10):
self.hsync = Signal()
self.vsync = Signal()
self.de = Signal()
self._hres = RegisterField(nbits, READ_ONLY, WRITE_ONLY)
self._vres = RegisterField(nbits, READ_ONLY, WRITE_ONLY)
self._de_cycles = RegisterField(2*nbits, READ_ONLY, WRITE_ONLY)
###
# HRES/VRES
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.field.w)
self.specials += MultiReg(vcounter_st, self._vres.field.w)
# DE
de_r = Signal()
pn_de = Signal()
self.sync.pix += de_r.eq(self.de)
self.comb += pn_de.eq(~self.de & de_r)
decounter = Signal(2*nbits)
self.sync.pix += If(self.de,
decounter.eq(decounter + 1)
).Else(
decounter.eq(0)
)
decounter_st = Signal(2*nbits)
self.sync.pix += If(pn_de, decounter_st.eq(decounter))
self.specials += MultiReg(decounter_st, self._de_cycles.field.w)