Heim Der Blog Blog Details

Wie implementiert man die RGB-zu-LVDS-Videoübertragung mit FPGA?

October 16 2025
Ampheo

Anfrage

Globaler Lieferant elektronischer Komponenten AMPHEO PTY LTD: Umfangreiches Inventar für One-Stop-Shopping. Einfache Anfragen, schnelle, individuelle Lösungen und Angebote.

SCHNELLE ANFRAGE
ZUR RFQ-LISTE HINZUFÜGEN
Hier ist ein praxiserprobter Weg, paralleles RGB mit einem FPGA in LVDS (FPD-Link/OpenLDI) zu übertragen.

Hier ist ein praxiserprobter Weg, paralleles RGB mit einem FPGA in LVDS (FPD-Link/OpenLDI) zu übertragen.

Wie implementiert man die RGB-zu-LVDS-Videoübertragung mit FPGA?

1) Wissen, was Ihr Panel erwartet

  • Link-Typ: Single-Link (meist 18/24-bit Panels) = 4 Datenpaare + 1 Uhrenpaar. Dual-Link = 8 Datenpaare + 1 Uhrenpaar.

  • Bittiefe: 18-bit (6:6:6 → meist 3 Datenpaare) oder 24-bit (8:8:8 → 4 Datenpaare).

  • Mapping: JEIDA-24 vs. VESA-24 (welche RGB-Bits sowie HS/VS/DE in welchem 7-bit-Lane landen). Das steht im Panel-Datenblatt.

  • Taktung: Das LVDS-Clock-Paar führt den Pixeltakt (PCLK). Jedes Datenpaar läuft mit 7× PCLK (7:1-Serialisierung).

  • Abschluss: 100 Ω differentiell am Empfänger (im Panel integriert).

Schneller Bitraten-Check (pro Datenpaar):
Lane-Rate = 7 × PCLK. Beispiel 1024×768@60 (PCLK ≈ 65 MHz) → 455 Mb/s pro Lane (für die meisten FPGAs problemlos). 1080p60 (148,5 MHz) → ~1,04 Gb/s pro Lane (erfordert schnellere I/Os oder Dual-Link).

2) Architektur auf hoher Ebene

 
RGB888 + HS/VS/DE + PCLK
        │
 (optional Resync/FIFO bei Taktdomänendifferenzen)
        │
   Bit-Packer (JEIDA/VESA → 4×7-bit-Wörter pro Pixel)
        │
  4× OSERDES (7:1 SDR)  ──> 4× OBUFDS (LVDS-Datenpaare)
        │
  ODDR @ PCLK (weitergeleiteter Takt) ──> OBUFDS (LVDS-Clock-Paar)

Takte: per PLL/MMCM SERCLK = 7 × PCLK für die OSERDES-High-Speed-Clock erzeugen (oder 14:1 DDR, falls das Gerät das bevorzugt).

3) Daten-Packing (der einzige „panel-spezifische“ Teil)

Bilden Sie einen 28-bit-Bus pro Pixel: 24 Farbbits + HSYNC + VSYNC + DE + (1 Reserve/Control). Aufteilen in vier 7-bit-Lanes. Die exakte Bit-Reihenfolge hängt von JEIDA vs. VESA ab. Implementieren Sie das als Tabelle, damit Sie das Mapping ohne Änderung des Serialisierers tauschen können:

 

// Beispiel: parametrischer Mapper (MAP[] gemäß Panel-Datenblatt füllen)
module ldi_mapper(
  input  [23:0] rgb,      // {R[7:0],G[7:0],B[7:0]} (Reihenfolge nach Bedarf)
  input         hsync, vsync, de,
  output [6:0]  lane0, lane1, lane2, lane3
);
  wire [27:0] bits = {rgb, hsync, vsync, de, 1'b0}; // 28 Bits
  // MAP[i] gibt an, welcher Index aus 'bits' an Position i seriell ausgegeben wird
  // (i=0 ist das zuerst gesendete Bit). Diese Tabellen je nach JEIDA/VESA füllen.
  localparam int MAP0[7] = '{ /* z. B. 2,1,0,13,12,11,10 */ };
  localparam int MAP1[7] = '{ /* ... */ };
  localparam int MAP2[7] = '{ /* ... */ };
  localparam int MAP3[7] = '{ /* ... */ };

  genvar k; generate
    for (k=0;k<7;k=k+1) begin
      assign lane0[k] = bits[MAP0[k]];
      assign lane1[k] = bits[MAP1[k]];
      assign lane2[k] = bits[MAP2[k]];
      assign lane3[k] = bits[MAP3[k]];
    end
  endgenerate
endmodule

4) Serialisieren im FPGA (Beispiel Xilinx 7-Serie)

Verwenden Sie OSERDESE2 im SDR 7:1-Modus, getaktet mit SERCLK=7×PCLK und PCLK als Teiler-Clock:

 

// Eine LVDS-Datenlane
module lvds_lane_tx (
  input  wire        pclk,        // Pixeltakt
  input  wire        serclk,      // 7x-Clock (aus PLL/MMCM)
  input  wire [6:0]  d7,          // bit[0] geht zuerst raus
  output wire        lvds_p, lvds_n
);
  wire ser_out;
  OSERDESE2 #(
    .DATA_RATE_OQ("SDR"), .DATA_WIDTH(7)
  ) oser (
    .OQ   (ser_out),
    .CLK  (serclk),
    .CLKDIV(pclk),
    .D1(d7[0]), .D2(d7[1]), .D3(d7[2]), .D4(d7[3]),
    .D5(d7[4]), .D6(d7[5]), .D7(d7[6]),
    .OCE(1'b1), .RST(1'b0), .TCE(1'b1)
  );

  // LVDS differentielle Ausgangsstufe (Bank Vcco=2,5 V)
  OBUFDS #(.IOSTANDARD("LVDS_25")) obufds (.I(ser_out), .O(lvds_p), .OB(lvds_n));
endmodule

// Weitergeleitetes LVDS-Clock-Paar
module lvds_clk_tx(input pclk, output clk_p, clk_n);
  wire fwd;
  // 1010… toggeln, um eine 50%-Duty-Forward-Clock zu erzeugen
  ODDR #(.DDR_CLK_EDGE("SAME_EDGE")) oddr (.C(pclk), .D1(1'b1), .D2(1'b0), .Q(fwd), .CE(1'b1), .R(1'b0), .S(1'b0));
  OBUFDS #(.IOSTANDARD("LVDS_25")) obufds (.I(fwd), .O(clk_p), .OB(clk_n));
endmodule

Intel/AMD FPGAs: Verwenden Sie die entsprechenden ALTLVDS_TX/SerDes- oder OSERDES-Primitive. Viele Familien unterstützen 10:1 DDR; dann SERCLK = 5×PCLK und Sie senden 14 Bits pro Lane mit Padding.

5) Timing & Constraints (Xilinx-XDC-Skizze)

 

# Eingehender Pixeltakt
create_clock -name PCLK -period 13.333 [get_ports PCLK]    ;# Beispiel 75 MHz
# Generierte 7x-Clock (Namen an Ihre MMCM/PLL-Instanz anpassen)
create_generated_clock -name SERCLK -source [get_pins mmcm_inst/CLKOUT0] \
  -divide_by 1 [get_pins oser_lane0/OSERDESE2_inst/CLK]

# I/O-Standards
set_property IOSTANDARD LVDS_25 [get_ports {LVDS_DATA*_P LVDS_DATA*_N LVDS_CLK_P LVDS_CLK_N}]
set_property DIFF_TERM   FALSE   [get_ports {LVDS_*}]  ;# TX-Seite, kein On-Chip-Terminator

# Skew-Constraints (Lanes relativ zum Clock eng halten)
set_max_skew -from [get_ports {LVDS_DATA*_P}] -to [get_ports {LVDS_CLK_P}] 300ps

6) Hinweise auf Board-Ebene

  • Power/IO-Bank: LVDS-fähige Bank verwenden (Vcco=2,5 V bei vielen Devices).

  • Routing: 100-Ω-differentielle Impedanz. Intra-Pair-Längenfehler < 5 mm; Skew Lane↔Clock eng halten (Ziel < 100–200 ps).

  • Terminierung: Das Panel stellt 100 Ω pro Paar bereit; keine Quellterminierung hinzufügen, außer ausdrücklich empfohlen.

  • Steckverbinder-Pinout: LANE-Reihenfolge und Polarität zum Panel passend routen; nur tauschen, wenn Ihr Mapping das berücksichtigt.

7) Inbetriebnahme & Test

  1. Zuerst Color-Bar-Generator im FPGA (ohne externe Quelle).

  2. Duty-Cycle der weitergeleiteten Clock und Lane-Eye (falls möglich) mit dem Oszi prüfen.

  3. Ist das Bild „verschlüsselt“ oder Farben vertauscht, sind meist JEIDA/VESA-Mapping oder Bit-Reihenfolge falsch → MAP[] anpassen.

  4. Bei mehreren Auflösungen/Refreshraten validieren; Lane-Raten vs. Device-Limits beachten.

8) Wann einen externen Serializer einsetzen?

Wenn die FPGA-I/Os zu langsam sind (z. B. >800 Mb/s pro Lane) oder Sie das Timing vereinfachen möchten, nutzen Sie einen dedizierten LVDS-Serializer-IC (gängige FPD-Link/OpenLDI-Tx-Bausteine). Dann gibt das FPGA nur paralleles RGB + HS/VS/DE + PCLK aus; der Chip übernimmt Packing und LVDS-Elektrik.


Schnell-Checkliste

  • Panel-Datenblatt: Single/Dual-Link, JEIDA/VESA-Map, Pinout, Timing, PCLK.

  • FPGA: LVDS-fähige I/O-Bank, PLL für 7× PCLK.

  • Mapping-Tabelle → 4×7-bit-Lanes implementiert.

  • OSERDES/SerDes @ 7:1 (oder 14:1 DDR) + ODDR-Forward-Clock.

  • LVDS-Routing/Impedanz und Polarität verifiziert.

  • Color-Bars → Quelle → End-Validierung.

Ampheo