Atlys

Auch mit programmierbarer Logik beschäftigen wir uns. Aktuelle FPGAs erlauben beeindruckende Experimente auch mit hochauflösendem Video.

Technische Daten

Atlys ist eine FPGA Platine der Firma Digilent. Sie ist bestueckt mit einem Spartan-6 LX45 FPGA, je 2 HDMI Ein- und Ausgaengen, Gigabit Ethernet und einem Audio-Codec. Ein 400MHz DDR2 Ram sorgt fuer reichlich Speicherbandbreite.

Der Spartan-6 beherrscht TMDS als IO-Standard und kann damit DVI/HDMI bis 720p/1080i direkt auf dem Chip erzeugen oder empfangen (Datenrate bei 720p ca. 1280 * 720 Pixel * 60 Hz * 32 Bit/Pixel = 1,8 GBit/s = 221 MByte/s). Zum Vergleich: Die Spitzen-Speicherbandbreite des DDR2 RAMs beträgt 400 MHz * 2 Zugriffe je Takt * 16 Bit/Zugriff = 12,8 GBit/s = 1,6 GByte/s („Spitze“, da der Wert durch Adressierungs-Overhead, Refresh, etc. nicht dauerhaft zu halten ist).

Adept EPP

Digilent hat für seine Adept Software ein standardisiertes Interface entwickelt, das es erlaubt 8-Bit Register im FPGA zu implementieren und direkt über die Adept Software darauf zu schreiben und zu lesen. Leider sind im Reference Manual die benötigten Pins nicht dokumentiert, hier ein zum Beispielcode dpimref.vhd passendes UCF-File. Es sind kleine Anpassungen am VHDL-Code nötig um die Datei verwenden zu können.

dpimref.ucf
###############################################################
# UCF for Digilent dpimref.vhd
# for use with Atlys board, XC6SLX45-2CSG324 FPGA
###############################################################
NET  "pdb[0]"      IOSTANDARD = LVCMOS25 | LOC = "A2";  # Schematic name: U1-FD0
NET  "pdb[1]"      IOSTANDARD = LVCMOS25 | LOC = "D6";  # Schematic name: U1-FD1
NET  "pdb[2]"      IOSTANDARD = LVCMOS25 | LOC = "C6";  # Schematic name: U1-FD2
NET  "pdb[3]"      IOSTANDARD = LVCMOS25 | LOC = "B3";  # Schematic name: U1-FD3
NET  "pdb[4]"      IOSTANDARD = LVCMOS25 | LOC = "A3";  # Schematic name: U1-FD4
NET  "pdb[5]"      IOSTANDARD = LVCMOS25 | LOC = "B4";  # Schematic name: U1-FD5
NET  "pdb[6]"      IOSTANDARD = LVCMOS25 | LOC = "A4";  # Schematic name: U1-FD6
NET  "pdb[7]"      IOSTANDARD = LVCMOS25 | LOC = "C5";  # Schematic name: U1-FD7
NET  "astb"        IOSTANDARD = LVCMOS25 | LOC = "B9";  # Schematic name: U1-FLAGA
NET  "dstb"        IOSTANDARD = LVCMOS25 | LOC = "A9";  # Schematic name: U1-FLAGB
NET  "pwr"         IOSTANDARD = LVCMOS25 | LOC = "C15"; # Schematic name: U1-FLAGC
NET  "pwait"       IOSTANDARD = LVCMOS25 | LOC = "F13"; # Schematic name: U1-SLRD
 
NET  "rgLed[0]"    IOSTANDARD = LVCMOS25 | LOC = "U18"; # Schematic name: LD0
NET  "rgLed[1]"    IOSTANDARD = LVCMOS25 | LOC = "M14"; # Schematic name: LD1
NET  "rgLed[2]"    IOSTANDARD = LVCMOS25 | LOC = "N14"; # Schematic name: LD2
NET  "rgLed[3]"    IOSTANDARD = LVCMOS25 | LOC = "L14"; # Schematic name: LD3
NET  "rgLed[4]"    IOSTANDARD = LVCMOS25 | LOC = "M13"; # Schematic name: LD4
NET  "rgLed[5]"    IOSTANDARD = LVCMOS25 | LOC = "D4";  # Schematic name: LD5
NET  "rgLed[6]"    IOSTANDARD = LVCMOS25 | LOC = "P16"; # Schematic name: LD6
NET  "rgLed[7]"    IOSTANDARD = LVCMOS25 | LOC = "N12"; # Schematic name: LD7
 
NET  "rgSwt[0]"    IOSTANDARD = LVCMOS25 | LOC = "A10"; # Schematic name: SW0
NET  "rgSwt[1]"    IOSTANDARD = LVCMOS25 | LOC = "D14"; # Schematic name: SW1
NET  "rgSwt[2]"    IOSTANDARD = LVCMOS25 | LOC = "C14"; # Schematic name: SW2
NET  "rgSwt[3]"    IOSTANDARD = LVCMOS25 | LOC = "P15"; # Schematic name: SW3
NET  "rgSwt[4]"    IOSTANDARD = LVCMOS25 | LOC = "P12"; # Schematic name: SW4
NET  "rgSwt[5]"    IOSTANDARD = LVCMOS25 | LOC = "R5";  # Schematic name: SW5
NET  "rgSwt[6]"    IOSTANDARD = LVCMOS25 | LOC = "T5";  # Schematic name: SW6
NET  "rgSwt[7]"    IOSTANDARD = LVCMOS25 | LOC = "E4";  # Schematic name: SW7
 
NET  "rgBtn[0]"    IOSTANDARD = LVCMOS25 | LOC = "N4";  # Schematic name: BTNU
NET  "rgBtn[1]"    IOSTANDARD = LVCMOS25 | LOC = "F5";  # Schematic name: BTNC
NET  "rgBtn[2]"    IOSTANDARD = LVCMOS25 | LOC = "F6";  # Schematic name: BTNR
NET  "rgBtn[3]"    IOSTANDARD = LVCMOS25 | LOC = "P4";  # Schematic name: BTNL
NET  "rgBtn[4]"    IOSTANDARD = LVCMOS25 | LOC = "P3";  # Schematic name: BTND
NET  "rgBtn[5]"    IOSTANDARD = LVCMOS25 | LOC = "T15"; # Schematic name: BRST
 
# btn, led, ldg removed

TFT-Panel mit LVDS

In allen Laptops der letzten Jahre sind TFT-Panels mit LVDS-Interface verbaut. Dabei handelt es sich um eine eine schnelle serielle Datenübertragung mit differenziellen Signalen. Die meisten Panels können 18-bit Farben darstellen (je 6-Bit für rot, grün und blau) und werden über 4 LVDS-Paare angesteuert: 3 Paare für die Pixeldaten sowie Synchronisationssignale und ein Paar für den Pixeltakt.

Für unsere Tests wurde das WSXGA (1280×800) Panel LTN154X3-L06 verwendet. Im Datenblatt findet sich neben der Pinbelegung auch die benötigte Bitanordnung auf den einzelnen LVDS-Kannälen sowie die Phase des Pixeltaktsignals. Hier sind die Informationen noch einmal zusammengefasst:

Bit Verwendung
0 ROT 0
1 ROT 1
2 ROT 2
3 ROT 3
4 ROT 4
5 ROT 5
6 GRÜN 0
7 GRÜN 1
8 GRÜN 2
9 GRÜN 3
10 GRÜN 4
11 GRÜN 5
12 BLAU 0
13 BLAU 1
14 BLAU 2
15 BLAU 3
16 BLAU 4
17 BLAU 5
18 HSYNC
19 VSYNC
20 VDE

Je 7 Bit werden dabei in einen LVDS-Kanal serialisiert:

LVDS Kanal Timeslot 0 Timeslot 1 Timeslot 2 Timeslot 3 Timeslot 4 Timeslot 5 Timeslot 6
TX 0 G0 R5 R4 R3 R2 R1 R0
TX 1 B1 B0 G5 G4 G3 G2 G1
TX 2 VDE HSYNC VSYNC B5 B4 B3 B2
TXCLK 1 1 0 0 0 1 1

HSYNC und VSYNC sind die aus bei VGA-Signales üblichen Synchronisationspulse mit negativer Polarität, VDE (video data enable) ist im sichtbaren Breeich jeder Videozeile aktiv. Um das TFT-Panel anzusteuern sind neben einem VGA-Timinggenerator und Pixelgenerator eigentlich nur noch der Serialisierer für die LVDS-Signale und eine Taktverteilung nötig.

TODO:

  • Blockschaltbild
  • Beispielprojekt (Copyright!)
  • Adapterplatine, Pinout Atlys

Dokumentation