Source code for hdmi.cores.transmitter.hdmi_encoder

from myhdl import Signal, intbv, always_seq, always, always_comb, ConcatSignal, block, instances

from hdmi.cores.transmitter import serdes_n_to_1, encode, convert_30_to_15


@block
[docs]def hdmi_encoder(p_clock, p_clockx2, p_clockx10, reset, serdes_strobe, video_interface, aux_interface, hdmi_interface): """ This block implements the HDMI encoder module modelled after the xapp 495 application notes. Args: p_clock: The pixel clock p_clockx2: The clock with twice the frequency of the pixel clock p_clockx10: The clock with ten times the frequency of the pixel clock reset: An asynchronous reset signal serdes_strobe: Serdes strobe for serdes blocks video_interface: An instance of VideoInterface aux_interface: An instance of AuxInterface hdmi_interface: An instance of HDMIInterface Returns: myhdl.instances() : A list of myhdl instances. """ control0, control1, control2, control3 = [Signal(bool(0)) for _ in range(4)] @always_comb def assign_control(): if video_interface.vde: # video_preamble control0.next = 1 control1.next = 0 control2.next = 0 control3.next = 0 elif aux_interface.ade: # data_island_preamble control0.next = 1 control1.next = 0 control2.next = 1 control3.next = 0 else: # null_control control0.next = 0 control1.next = 0 control2.next = 0 control3.next = 0 red = Signal(intbv(0)[10:0]) green = Signal(intbv(0)[10:0]) blue = Signal(intbv(0)[10:0]) tmds_data0, tmds_data1, tmds_data2 = [Signal(intbv(0)[5:0]) for _ in range(3)] tmds_init0, tmds_init1, tmds_init2, tmds_init3 = [Signal(bool(0)) for _ in range(4)] tmds_clock_init = Signal(intbv(0)[5:0]) toggle = Signal(bool(0)) @always_seq(p_clockx2.posedge, reset) def toggle_toggle(): toggle.next = not toggle @always(p_clockx2.posedge) def init_tmds_clock(): if toggle: tmds_clock_init.next = 31 # int('11111', 2) else: tmds_clock_init.next = 0 clock_out = serdes_n_to_1(p_clockx10, serdes_strobe, reset, p_clockx2, tmds_clock_init, tmds_init3, 5) oserdes0 = serdes_n_to_1(p_clockx10, serdes_strobe, reset, p_clockx2, tmds_data0, tmds_init0, 5) oserdes1 = serdes_n_to_1(p_clockx10, serdes_strobe, reset, p_clockx2, tmds_data1, tmds_init1, 5) oserdes2 = serdes_n_to_1(p_clockx10, serdes_strobe, reset, p_clockx2, tmds_data2, tmds_init2, 5) @always_comb def OBUFDS(): hdmi_interface.TMDS_B_P.next = tmds_init0 hdmi_interface.TMDS_B_N.next = not tmds_init0 hdmi_interface.TMDS_G_P.next = tmds_init1 hdmi_interface.TMDS_G_N.next = not tmds_init1 hdmi_interface.TMDS_R_P.next = tmds_init2 hdmi_interface.TMDS_R_N.next = not tmds_init2 hdmi_interface.TMDS_CLK_P.next = tmds_init3 hdmi_interface.TMDS_CLK_N.next = not tmds_init3 # A list of signals used to delay vde and ade by 10 clock cycles _vde = [Signal(bool(0)) for _ in range(10)] _ade = [Signal(bool(0)) for _ in range(10)] # A list of signals used to delay hsync and vsync by 10 clock cycles _hsync = [Signal(bool(0)) for _ in range(10)] _vsync = [Signal(bool(0)) for _ in range(10)] # # A list of signals used to delay red, green, blue by 10 clock cycles _red = [Signal(intbv(0)[video_interface.color_depth[0]:]) for _ in range(10)] _green = [Signal(intbv(0)[video_interface.color_depth[1]:]) for _ in range(10)] _blue = [Signal(intbv(0)[video_interface.color_depth[2]:]) for _ in range(10)] # A list of signals used to delay aux signal by 10 clock cycles _aux0 = [Signal(intbv(0)[aux_interface.aux_depth[0]:]) for _ in range(10)] _aux1 = [Signal(intbv(0)[aux_interface.aux_depth[1]:]) for _ in range(10)] _aux2 = [Signal(intbv(0)[aux_interface.aux_depth[2]:]) for _ in range(10)] @always(p_clock.posedge) def serial_delay(): _red[0].next = video_interface.red _green[0].next = video_interface.green _blue[0].next = video_interface.blue _aux0[0].next = aux_interface.aux0 _aux1[0].next = aux_interface.aux1 _aux2[0].next = aux_interface.aux2 _vde[0].next = video_interface.vde _ade[0].next = aux_interface.ade _hsync[0].next = video_interface.hsync _vsync[0].next = video_interface.vsync for i in range(1, 10): _red[i].next = _red[i - 1] _green[i].next = _green[i - 1] _blue[i].next = _blue[i - 1] _aux0[i].next = _aux0[i - 1] _aux1[i].next = _aux1[i - 1] _aux2[i].next = _aux2[i - 1] _vde[i].next = _vde[i - 1] _ade[i].next = _ade[i - 1] _hsync[i].next = _hsync[i - 1] _vsync[i].next = _vsync[i - 1] encode_b = encode(p_clock, reset, _blue[9], _aux0[9], _hsync[9], _vsync[9], _vde[9], _ade[9], blue, 'BLUE') encode_g = encode(p_clock, reset, _green[9], _aux1[9], control0, control1, _vde[9], _ade[9], green, 'GREEN') encode_r = encode(p_clock, reset, _red[9], _aux2[9], control2, control3, _vde[9], _ade[9], red, 'RED') s_data = ConcatSignal(red(10, 5), green(10, 5), blue(10, 5), red(5, 0), green(5, 0), blue(5,0)) pixel2x = convert_30_to_15(reset, p_clock, p_clockx2, s_data, tmds_data2, tmds_data1, tmds_data0) return instances()