1. Beispiel: Blinkende LED
(EN google-translate)
(PL google-translate)
Diese Beispiel ist identisch mit dem im vorangehenden Kapitel, wo der Umgang mit der ISE-Entwicklungsumgebung in groben Zügen gezeigt wurde.
Hier erfolgt nun die Analyse des Quelltextes und gleichzeitig eine erste Bekanntschaft mit VHDL.
Projekt-Download
blinkled.zip - Download des Beispiels als ISE-Projekt.Beschaltung
Bild 0-1: Beschaltung des DLP-FPGA-Boards.
Quelltext
library IEEE; use IEEE.STD_LOGIC_1164.ALL; use IEEE.NUMERIC_STD.ALL; entity blinkled is Port ( MEINECLOCK : in STD_LOGIC; MEINELED : out STD_LOGIC); end blinkled; -- Clock-In == 6MHz, Toggeln nach 3000000 Schritten ergibt 1Hz Blinkfrequenz. architecture Behavioral of blinkled is signal zaehler : integer range 0 to 2999999 := 0; signal logikpegel : std_logic := '0'; begin process begin wait until rising_edge(MEINECLOCK); if (zaehler<2999999) then zaehler <= zaehler+1; else zaehler <= 0; logikpegel <= not logikpegel; end if; end process; MEINELED <= logikpegel; end Behavioral;
Code 0-1: VHDL-Quelltext in Datei blinkled.vhd
## GCLK6 ist auf FPGA-Chip Pin 56 NET "MEINECLOCK" LOC = "P56"; ## IO_L05P_0 ist auf FPGA-Chip Pin 125 NET "MEINELED" LOC = "P125"; NET "MEINECLOCK" IOSTANDARD = LVCMOS25; NET "MEINELED" IOSTANDARD = LVCMOS33;
Code 0-2: Festlegung der Pinzuordnung und Pinkonfiguration in der Konfigurationsdatei blinkled.ucf
Analyse zu blinkled.vhd
|
|
Die ersten drei Zeilen machen Bibliotheken verfügbar.
|
In entity blinkled is ... end blinkled;
wird festgelegt, welche Ein- und Ausgänge die zu realisierende Einheit hat.
In architecture Behavioral of blinkled is ... end Behavioral;
wird das innere Verhalten der Einheit definiert.
Eine Einheit (entity) kann auch mehrere Verhaltensblöcke (Architekturen) zugewiesen bekommen.
blinkled ist dabei ein frei gewählter Name.
Die Sprache VHDL fordert bei jeder Variablen einen Datentyp und ist sehr reich an Datentypen.
Syntax in PORT( ... )
:
Variablenname : MODE Datentyp MODE kann sein: in, out oder inout in .. Signal geht in die Einheit hinein out .. Signal geht aus der Einheit heraus inout .. Bidirektional Datentyp-Beispiele: STD_LOGIC .. synthetisierbare Zustände: '0' '1' 'Z' (Z bedeutet hohe Impedanz) .. weitere Zustände in Simulation: 'U' (uninitialisiert) 'X' (unbekannt) .. weitere '-' 'H' 'L' Array logischer Einheiten, vergleichbar mit Byte flexibler Länge: std_logic_vector(7 downto 0) std_logic_vector(3 downto 0) std_logic_vector(0 upto 2) usw. Integer, Beispiel mit Wertebereich und Initialisierung: integer range 0 to 2999999 := 0; MEINECLOCK : in STD_LOGIC; MEINELED : out STD_LOGIC
Code 0-3: Erläuterungen.
Die nachfolgende Beschreibung des Verhaltens der Einheit
beginnt mit der Definition einiger Hilfsvariablen (Schlüsselwort signal
),
woraufhin das eigentliche Verhalten definiert wird (Schlüsselwort process
).
Zuweisungen erfolgen in VHDL so: ZIELVARIABLE <= DAS_WAS_ZUGEWIESEN_WIRD;
Trenner für Befehlszeilen ist wie in C das Semikolon. Somit können beliebig viele Leerzeichen und Zeilenumbrüche in den Code zu besseren Lesbarkeit eingefügt werden.
Das definierte Verhalten in Worten gefaßt:
|
Zu diesem Prozeß wird ein konkurrierendes Verhalten anbei gestellt, das sich wie eine Verdrahtung interpretieren läßt:
|
Analyse zu blinkled.ucf
Für die Vordefinierten Ein- und Ausgänge wird festgelegt, welchen physikalischen Pins auf dem FPGA sie entsprechen sollen:
NET "MEINECLOCK" LOC = "P56"; NET "MEINELED" LOC = "P125";
Code 0-4: Pinzuordnung.
...und welche elektrischen Eigenschaften die Pins haben sollen: (LVCMOS25 .. 2,5Volt Logik, bis 24mA Last, LVCMOS33 .. 3,3Volt Logik, bis 24mA Last)
NET "MEINECLOCK" IOSTANDARD = LVCMOS25; NET "MEINELED" IOSTANDARD = LVCMOS33;
Code 0-5: Elektrische Eigenschaften.