Menu:

Project: FPGA68k  -  Testdesigns

Testdesign 2: einfaches VGA-Testbild

Dieses Design erzeugt am VGA-Ausgang ein Standard-VGA-Signal mit einer Auflösung von 640*480 Pixel. Dargestellt werden vier weiße Rahmen (320*240 Pixel groß), mit Farbflächen in unterschiedlicher Farbe innerhalb dieser Rahmen. Als Eingangssignal wird der Standard-Oszillatortakt mit 25,00 MHz benötigt.

 

Funktionsweise

Um ein Standard-VGA-Signal zu erhalten, werden hier zwei Zähler eingesetzt. Ein Spaltenzähler, welcher von 0 bis 799 zählt, und ein Zeilenzähler mit einem Zählbereich von 0 bis 524. Beim Spaltenzähler wird der Wertebereich von 0 bis 639 für den sichtbaren Bildteil verwendet (die dargestellte Zeile auf dem VGA-Monitor), bei Werten zwischen 656 und 751 wird das horizontale Sync-Signal gesetzt. Damit beginnt für den VGA-Monitor eine neue Zeile.

Wenn der Spaltenzähler die Spalte 799 erreicht hat, wird dies für die Freigabe eines Zählimpulses für den Zeilenzähler genutzt. Der nächste Takt setzt dann den Spaltenzähler auf 0 zurück und inkrementiert gleichzeitig den Zeilenzähler, welcher dann auf die nächste Zeile zeigt.

Bei diesem Zähler bedeuten Werte zwischen 0 und 479, dass die Zeile im sichtbaren Bildbereich liegt. Während der Zeilen 490 und 491 wird das vertikale Sync-Signal gesetzt. Dies bedeutet für den angeschlossenen Monitor, dass der Aufbau des aktuellen Bildes beendet ist und ein neues Bild beginnt.

Schema Testbild

Mit der Erzeugung der horizontalen und vertikalen Sync-Signale steht die Basis der VGA-Signalerzeugung. Sehen auf dem Bildschirm kann man allerdings noch nichts, da noch keine Ansteuerung der RGB-Leitungen erfolgt. Das übernimmt der untere Block im dargestellten Schema, der mit den Werten beider Zähler gespeist wird. Das Ergebnis einfacher Vergleiche der Zählerwerte mit bestimmten Konstanten wird genutzt, um die Farb-Leitungen zu aktivieren oder zu deaktivieren. So wird z.B. der Rot-Ausgang gesetzt, wenn sich der Horizontalzähler zwischen 0 und 319 befindet. Dies bedeutet, dass der Rot-Ausgang auf der gesamten linken Bildschirmhälfte aktiviert und auf der rechten Bildschirmhälfte deaktiviert ist. Analog wird mit dem Grün- und Blau-Ausgang verfahren.

Auf dem VGA-Monitor sollte dieses Bild zu sehen sein:

VGA-Monitor mit Testbild

 

Bitfile

Unter folgendem Link kannst Du dir das Bitfile für dieses Design downloaden und direkt mit dem Impact-Tool in das FPGA schreiben.

  Bitfile, geeignet für das FPGA68k-Board (25,00 MHz-Takt): Testdesign 02: VGA-Testbild

 

Quelltext


library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity Testdesign02 is
    Port ( Clock    : in   STD_LOGIC;
           VGA_R    : out  STD_LOGIC_VECTOR (3 downto 0);
           VGA_G    : out  STD_LOGIC_VECTOR (3 downto 0);
           VGA_B    : out  STD_LOGIC_VECTOR (3 downto 0);
           VGA_HS   : out  STD_LOGIC;
           VGA_VS   : out  STD_LOGIC
         );
end Testdesign02;

architecture Behavioral of Testdesign02 is

signal  x_cnt       : integer range 0 to 799 := 0;  -- Horizontaler Pixelzähler
signal  y_cnt       : integer range 0 to 524 := 0;  -- Vertikaler Zeilenzähler

signal  active      : std_logic_vector(3 downto 0); -- Flag für "Innerhalb des Videobildes"

signal  border      : std_logic_vector(3 downto 0);
signal  color       : std_logic_vector(2 downto 0);

begin

process begin
      wait until rising_edge(Clock);
      if x_cnt = 799 then             -- Wenn der Zähler am Ende der Zeile ist,
         x_cnt <= 0;                  -- dann den Zähler zurücksetzen
      else
         x_cnt <= x_cnt + 1;          -- Pixelzähler inkrementieren
      end if;
end process;

process begin
      wait until rising_edge(Clock);
      if x_cnt = 799 then             -- in der letzten Spalte, dann Zeile inkrementieren
         if y_cnt = 524 then          -- wenn Maximum erreicht, dann Zeilenzähler resetten
            y_cnt <= 0;
         else y_cnt <= y_cnt + 1;     -- Zeilenzähler inkrementieren
         end if;
      end if;
end process;


VGA_HS   <= '1' when ((x_cnt >= 656) and (x_cnt <= 751))  -- Horizontaler Sync-Impuls
                else '0';

VGA_VS   <= '1' when ((y_cnt >= 490) and (y_cnt <= 491))  -- Vertikaler Sync-Impuls
                else '0';

active   <= "1111" when ((x_cnt < 640) and (y_cnt < 480)) -- "Bild-Aktiv"-Bereich
                   else "0000";

border   <= "1111" when (x_cnt < 2) or (x_cnt = 319) or (x_cnt = 320) or (x_cnt > 637)
                     or (y_cnt < 2) or (y_cnt = 239) or (y_cnt = 240) or (y_cnt > 477)
                   else "0000";

color(2) <= '1' when (x_cnt < 320) else '0';
color(1) <= '1' when (y_cnt > 240) else '0';
color(0) <= '1' when ((x_cnt > 320) and (y_cnt < 240)) else '0';


VGA_R    <= active and (border or color(2) & color(2) & color(2) & color(2));
VGA_G    <= active and (border or color(1) & color(1) & color(1) & color(1));
VGA_B    <= active and (border or color(0) & color(0) & color(0) & color(0));

end Behavioral;

 

Zuweisungen der FPGA-Pins (User Constraint File)


# User Constraints für Testdesign02

NET "Clock"            LOC = P55    | IOSTANDARD = LVCMOS33;
NET "VGA_R[0]"         LOC = P10    | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_R[1]"         LOC = P11    | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_R[2]"         LOC = P12    | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_R[3]"         LOC = P14    | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_G[0]"         LOC = P6     | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_G[1]"         LOC = P7     | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_G[2]"         LOC = P8     | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_G[3]"         LOC = P9     | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_B[0]"         LOC = P143   | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_B[1]"         LOC = P1     | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_B[2]"         LOC = P2     | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_B[3]"         LOC = P5     | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_HS"           LOC = P141   | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;
NET "VGA_VS"           LOC = P142   | IOSTANDARD = LVCMOS33 | DRIVE = 12 | SLEW = SLOW;

 

Sowohl der Quelltext als auch die Pinzuweisungen können per Copy&Paste von dieser Seite kopiert und in die entsprechende Datei unter ISE eingefügt werden. Als Bausteintyp ist folgendes anzugeben:

Family: Spartan6
Device: XC6SLX9
Package: TQG144
Speed: -2

 

Zurück zur Übersicht der Testdesigns