Merge pull request #1290 from swetland/hdmi

cores/video: VideoHDMIPHY: enable driving both + and - diff outs
This commit is contained in:
enjoy-digital 2022-05-12 15:08:45 +02:00 committed by GitHub
commit 8fd96cab84
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
1 changed files with 17 additions and 3 deletions

View File

@ -740,7 +740,7 @@ class VideoDVIPHY(VideoGenericPHY): pass
# HDMI (Generic). # HDMI (Generic).
class VideoHDMI10to1Serializer(Module): class VideoHDMI10to1Serializer(Module):
def __init__(self, data_i, data_o, clock_domain): def __init__(self, data_i, data_o, clock_domain, data_o_n=Signal(), drive_both=False):
# Clock Domain Crossing. # Clock Domain Crossing.
self.submodules.cdc = stream.ClockDomainCrossing([("data", 10)], cd_from=clock_domain, cd_to=clock_domain + "5x") self.submodules.cdc = stream.ClockDomainCrossing([("data", 10)], cd_from=clock_domain, cd_to=clock_domain + "5x")
self.comb += self.cdc.sink.valid.eq(1) self.comb += self.cdc.sink.valid.eq(1)
@ -758,9 +758,16 @@ class VideoHDMI10to1Serializer(Module):
i2 = self.gearbox.source.data[1], i2 = self.gearbox.source.data[1],
o = data_o, o = data_o,
) )
if drive_both:
self.specials += DDROutput(
clk = ClockSignal(clock_domain + "5x"),
i1 = ~self.gearbox.source.data[0],
i2 = ~self.gearbox.source.data[1],
o = data_o_n,
)
class VideoHDMIPHY(Module): class VideoHDMIPHY(Module):
def __init__(self, pads, clock_domain="sys", pn_swap=[]): def __init__(self, pads, clock_domain="sys", pn_swap=[], drive_both=False):
self.sink = sink = stream.Endpoint(video_data_layout) self.sink = sink = stream.Endpoint(video_data_layout)
# # # # # #
@ -770,10 +777,13 @@ class VideoHDMIPHY(Module):
# Clocking + Pseudo Differential Signaling. # Clocking + Pseudo Differential Signaling.
self.specials += DDROutput(i1=1, i2=0, o=pads.clk_p, clk=ClockSignal(clock_domain)) self.specials += DDROutput(i1=1, i2=0, o=pads.clk_p, clk=ClockSignal(clock_domain))
if drive_both:
self.specials += DDROutput(i1=0, i2=1, o=pads.clk_n, clk=ClockSignal(clock_domain))
data_n = Signal()
# Encode/Serialize Datas. # Encode/Serialize Datas.
for color in ["r", "g", "b"]: for color in ["r", "g", "b"]:
# TMDS Encoding. # TMDS Encoding.
encoder = ClockDomainsRenamer(clock_domain)(TMDSEncoder()) encoder = ClockDomainsRenamer(clock_domain)(TMDSEncoder())
setattr(self.submodules, f"{color}_encoder", encoder) setattr(self.submodules, f"{color}_encoder", encoder)
@ -784,10 +794,14 @@ class VideoHDMIPHY(Module):
# 10:1 Serialization + Pseudo Differential Signaling. # 10:1 Serialization + Pseudo Differential Signaling.
c2d = {"r": 0, "g": 1, "b": 2} c2d = {"r": 0, "g": 1, "b": 2}
data = encoder.out if color not in pn_swap else ~encoder.out data = encoder.out if color not in pn_swap else ~encoder.out
if drive_both:
data_n = getattr(pads, f"data{c2d[color]}_n")
serializer = VideoHDMI10to1Serializer( serializer = VideoHDMI10to1Serializer(
data_i = data, data_i = data,
data_o = getattr(pads, f"data{c2d[color]}_p"), data_o = getattr(pads, f"data{c2d[color]}_p"),
data_o_n = data_n,
clock_domain = clock_domain, clock_domain = clock_domain,
drive_both = drive_both,
) )
setattr(self.submodules, f"{color}_serializer", serializer) setattr(self.submodules, f"{color}_serializer", serializer)