Die Projektquellen

undefined Projektquellen

Nachdem das Projekt SimpleLed.xpr über das Generierungs-Skript erzeugt wurde, erscheint links oben im Project Manager im Bereich Sources die Hierarchie dieses Projekts. Man findet hier die beiden Quelldateien SimpleLed.vhd und Zybo.xdc.

Durch einen Doppelklick auf eine Datei wird sie im Quellcodeeditor von Vivado geöffnet. Die .vhd-Datei dient zur Beschreibung der Funktionalität. Die .xdc-Datei (xdc = xilinx design constraints) dient der Spezifikation des Timings und der IOs.

Die Datei SimpleLed hat auf der linken Seite ein IC-Symbol weil sie als Top-Level deklariert worden ist (über das Kontextmenü). Dadurch wird der Entwicklungsumgebung mitgeteilt, dass die Ein- und Ausgänge von SimpleLed mit den Ein- und Ausgängen des FPGAs übereinstimmen und genauere Angaben dazu (wie Pinout) in der .xdc-Datei stehen.

Analyse der Quellcodes

Das FPGA bekommt einen Eingang, der mit einem Taster verbunden ist, des weiteren einen Ausgang, der mit einer LED verbunden ist.

Die zugehörige VHDL-Datei besteht im Wesentlichen aus der Interface-Spezifikation:

library IEEE;
    use IEEE.STD_LOGIC_1164.ALL;

--! Control a LED with a button
entity SimpleLed is
    port (
        Button      : in  std_logic; --! Button input, low acitve
        Led         : out std_logic --! LED output, high acitve
    );
end SimpleLed;

und der Umsetzung.

architecture RTL of SimpleLed is

begin
    Led <= Button;
end RTL;

Die library-Anweisung am Dateianfang findet man in jeder normalen VHDL-Datei. Der Signaltyp std_logic, der normalerweise verwendet wird ist in dieser Bibliothek definiert. Im den Erläuterungen werde ich noch genauer auf den Typ std_logic eingehen.

Mit der entity Anweisung wird ein VHDL-Modul namens SimpleLed definiert. In diesem Fall ein IC mit dem Eingang Button und dem Ausgang Led.

(Alles was in einer Zeile hinter - - steht ist Kommentar. - - ! ist ein spezieller Doxygen-Kommentar der zum Dokumentieren des Codes dient. In einem späteren Kapitel wird speziell darauf eingegangen.)

Anschließend wird im Abschnitt architecture das Verhalten des VHDL-Moduls definiert. In VHDL können zu einem Modul (entity) verschiedene Architekturen parallel definiert werden. Der hier gewählte Name der Architektur RTL ist frei wählbar und steht für Register Transfer Language. Damit ist eine Architektur gemeint, die direkt in Hardware umgesetzt werden kann.

Mit Led <= Button; ist die gesamte Funktionalität des FPGAs auch schon definiert. Der Ausgangspin Led übernimmt das Eingangssignal Button. „<=“ steht dabei für eine Zuweisung zu einem Signal (es gibt in VHDL auch noch „:=“ als Zuweisungsoperator für Variablen und Anfangszustände).

In der .xdc-Datei (Constraints-Datei) sind in diesem Projekt die Pins und für die Ausgänge der Ausgangstreiber definiert.

set_property PACKAGE_PIN R18 [get_ports {Button}]
set_property IOSTANDARD LVCMOS33 [get_ports {Button}]
set_property PACKAGE_PIN M14 [get_ports {Led}]
set_property IOSTANDARD LVCMOS33 [get_ports {Led}]

Die PACKAGE_PIN-Anweisung gibt an, auf welchem externen Pin das entsprechende Signal liegt.

Der IOSTANDARD legt fest, welcher Ein- und Ausgangspegel verwendet wird (dabei spielt natürlich die externe Beschaltung auch eine wichtige Rolle).

Somit ist jetzt das erste FPGA komplett spezifiziert:

  • Die Logik der Schaltung wurde definiert

  • Die Schaltung wurde mit der Umgebung verbunden

Es kann jetzt also übersetzt und auf die Hardware geladen werden. Wenn man dann auf den Knopf drückt, sollte die Led aufleuchten und erlöschen, sobald man ihn loslässt.

Fpga erstellen

Normalerweise würde man das Design natürlich erst mal testen. Die Erstellung der ersten einfachen Testbench ist aber erst Inhalt des nächsten Projekts.

Hier soll deswegen nur gezeigt werden, wie man das eben erstellte Mini-Design in die Hardware bekommt.

undefined FPGA erstellen

Ein FPGA braucht für den Betrieb eine Konfigurationsdatei. Bei Xilinx heißt diese Datei Bitstream.

Diese wird durch den Klick auf Generate Bitstream aus den Quelldateien über mehrere Schrittte erzeugt.

Unter Umständen fragt Vivado nach, weil mehrere Schritte auf einmal durchgeführt werden sollen. Das quittiert man mit OK.

Im ersten Schritt, der Synthese, wird der VHDL-Quelltext analysiert und daraus die Struktur der Hardware ermittelt.

Im zweiten Schritt, der Implementierung, wird die Hardware-Struktur auf die verfügbaren Elemente des FPGAs abgebildet und diese anschließend miteinander verbunden.

Zuletzt wird daraus das Bitpattern erzeugt, welches dem FPGA die Schaltung mitteilt.

Nachdem das FPGA generiert wurde, sieht man, dass der Synthese und Implementierungsstatus auf Complete steht und dass keine Fehler oder kritischen Warnungen aufgetreten sind.

Es dauert noch ein bisschen, bis der Bitstream erzeugt wird und ein Dialog öffnet sich, in dem man "Open Hardware Manager" wählt und OK drückt.

Alternativ öffnet man den Hardware Manager über den Navigator.

FPGA laden

undefined Mit FPGA verbinden

Nun muss man sich zuerst mit dem FPGA verbinden. Das funktioniert am leichtesten über die Funktion "Auto Connect".

Die Hardware muss dazu natürlich bereits schon angeschlossen sein.

undefined FPGA programmieren

Anschließend muss man noch die Daten ins FPGA laden. Dazu wählt man die einzige programmierbare Device an.

Programmierung bestätigen

Falls die Bitstream-Datei nicht automatisch eingetragen wird, findet man sie im Unterverzeichnis SimpleLed.runs/impl_1.

Man hätte jetzt noch die Möglichkeit einen Logic-Analyzer Konfiguration anzugeben. In diesem Fall wird aber nur der Programmiervorgang bestätigt.

Damit wird das FPGA programmiert und die LED wird nun bei Betätigung des Tasters aufleuchten und das erste Projekt ist damit erfolgreich abgeschlossen.

Nach dem Aus- und wieder Anschalten des Testboards ist das FPGA allerdings wieder in dem Zustand in dem es vor dem Programmieren war. Das liegt daran, dass das Xilinx-FPGA intern nur einen SRAM-Speicher besitzt welcher natürlich beim Neustart zurückgesetzt wird.

Im Navigator sieht man als Unterpunkt des Hardware Managers "Add Configuration Memory".  Darüber könnte man den FPGA-Inhalt auch in diesem Speicher ablegen und die Konfiguration stände nach jedem Einschalten zur Verfügung. Dazu aber später.

Des weiteren kann man das Zynq-FPGA auch über ein Boot-Image von SD-Karte laden. Auch darauf wird in späteren Projekten noch eingegangen.

Weiter zu den Erläuterungen