kramann.info
© Guido Kramann

Login: Passwort:










5.1 1. Beispiel: Blinkende LED

5.1 (EN google-translate)

5.1 (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

Beschaltung des DLP-FPGA-Boards.

Bild 5.1-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 5.1-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 5.1-2: Festlegung der Pinzuordnung und Pinkonfiguration in der Konfigurationsdatei blinkled.ucf

Analyse zu blinkled.vhd

  • VHDL ist case insensitiv, d.h. es wird nicht zwischen Groß- und Kleinschreibung unterschieden.
  • Zeilen-Kommentare können mit -- (Minus Minus) realisiert werden.

Die ersten drei Zeilen machen Bibliotheken verfügbar.

  • IEEE.STD_LOGIC_1164 enthält Logig-Standard-Elemente
  • IEEE.NUMERIC_STD ermöglicht z.B. das Arbeiten mit Integer-Variablen

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 5.1-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:

  • Wiederhole zyklisch als Prozeß:
  • Warte auf eine steigende Flanke der Eingangsvariable MEINECLOCK
  • Dann, wenn die Flanke da ist und zaehler kleiner 2999999, dann inkrementiere zaehler,
  • sonst setze ihn 0 und toggel die Boolsche-Variable logikpegel.

Zu diesem Prozeß wird ein konkurrierendes Verhalten anbei gestellt, das sich wie eine Verdrahtung interpretieren läßt:

  • MEINELED <= logikpegel; ... Das Signal logikpegel wird zur Ausgangsvariable MEINELED geschickt.

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 5.1-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 5.1-5: Elektrische Eigenschaften.