VHDL Einführung 1 Marc Reichenbach und Michael Schmidt Informatik 3 / Rechnerarchitektur Universität Erlangen Nürnberg 05/12 1 / 44
Gliederung Überblick zu VHDL Vergleich VHDL/Verilog Designflow Aufbau einer VHDL-Beschreibung Architektur-Beschreibungen Signale vs. Variablen 2 / 44
Überblick zu VHDL grafische Schaltplaneingabe auf Logikelementebene kritisch starker Anstieg der Entwurfskomplexität "Time to market" deswegen Hardwarebeschreibung durch Hochsprachen Vorteil: einheitliche Beschreibung für Simulation und Synthese etablierte Modellierungssprachen: Verilog (amerik. Markt) VHDL (europ. Markt) mittlerweile steigender Anteil von SystemC, SystemVerilog (für Systemmodellierung und Systemverifikation) 3 / 44
Überblick zu VHDL VHDL unter IEEE-Norm 1076 in 1987, 1993, 2000, 2002 und 2008 standardisiert synthesefähiger Anteil unter 1076.6 standardisiert!! VHDL ist eine Modellierungssprache, keine Programmiersprache Kleinschreibung üblich (aber Unterschiede in der Literatur!) 4 / 44
Überblick zu VHDL Kommentare werden in VHDL mit erstellt (seit 2008 Blockkommentar möglich) vollständige VHDL-Anweisungen mit ; abgeschlossen Signalzuweisungen erfolgen mit <= Operator Variablenzuweisungen erfolgen mit := Operator einzelne Signalwerte mit einzelnen Anführungeszeichen ( 0 ) Vektoren mit doppelten Anführungszeichen ( 0001 ) 5 / 44
Vergleich VHDL/Verilog [1] gleichwertige Modellierung von Hardware-Komponenten allerdings leicht versetzte Abdeckung über den Verhaltensebenen 6 / 44
Vergleich VHDL/Verilog [1] VHDL: Vielzahl von Datentypen (sprach- und benutzerdefiniert) Verilog: nur sehr einfache sprachdefinierte Datentypen Verilog: kein Konzept für Packages (für wiederverwendete Datentypen, Funktionen) oder Bibliotheken interpretierende Sprache Verilog ist für Beginner einfacher zu erlernen 7 / 44
Vergleich VHDL/Verilog [1] VHDL erscheint zunächst komplizierter (stark typisiert, mehrere Modellierungswege) jedoch mächtig für fortgeschrittene Benutzer VHDL: mehr Konstrukte für High-Level Modellierungen Verilog: Möglichkeit auch Basiszellen (ASIC, FPGA) zu modellieren (in VHDL über VITAL Standard) Verilog: Explizite Unterscheidung zwischen Registern und Verbindungen VHDL ist an ADA angelehnt, Verilog stärker an C 8 / 44
Designflow Wie kommt man vom HDL Code zur tatsächlichen Hardware (FPGA, ASIC)? Designflow beschreibt Abbildungsschritte oft Unterschiede in Abhängigkeit von der verwendeten Tool-Chain 9 / 44
Vereinfachter Allgemeiner Designflow VHDL-Code Schaltplan Testbench Constraints Synthese Funktionale Simulation Translation Map Place & Route Floorplanning, Layout Timing Analyse, DRC Checks Konfigurationsdatei Implementierung Tapeout Zeitbehaftete Simulation FPGA ASIC 10 / 44
Synthese auch Logik-Synthese genannt Übersetzung des HDL Codes in architektur-spezifische Netzliste Netzliste auf Register-Transfer Ebene (RTL) Kombinatorische Logik D CLK Q Kombinatorische Logik D CLK Q Kombinatorische Logik clk 11 / 44
Implementierung Abbildung der Netzliste auf Zieltechnologie Bibliothekselemente einer ASIC-Bibliothek Bibliothekselemente eines FPGA-Devices Abschätzung von Zeitinformationen für zeitbehaftete Simulation SDF (Standard Delay Format) 12 / 44
Prinzipieller Aufbau einer VHDL-Beschreibung B i b l i o t h e k e n e i n b i n d e n l i b r a r y <Name>; z. B. B i b l i o t h e k s n a m e o d e r WORK Verz. use <Name>.[<Name>.... ] ( < B e z e i c h n e r > a l l ) ; S c h n i t t s t e l l e d e r Komponente d e f i n i e r e n e n t i t y <Entityname> i s [ g e n e r i c (< D e k l a r a t i o n von Parametern > ) ; ] port(< D e k l a r a t i o n d e r Ein und Ausgaenge >); [< E n t i t y d e k l a r a t i o n e n >;] end <Entityname >; F u n k t i o n a l e s V e r h a l t e n d e r Komponente b e s c h r e i b e n a r c h i t e c t u r e <A r c h i t e k t u r n a m e > of <Entityname> i s [< A r c h i t e k t u r d e k l a r a t i o n e n >;] begin {<VHDL Anweisungen >;} end <A r c h i t e k t u r n a m e >; 13 / 44
Prinzipieller Aufbau einer VHDL-Beschreibung o p t i o n a l d i e K o n f i g u r a t i o n f e s t l e g e n w i c h t i g b e i mehreren A r c h i t e k t u r b e s c h r e i b u n g e n zu e i n e r E n t i t y c o n f i g u r a t i o n <K o n f i g u r a t i o n s n a m e > of <Entityname> i s f o r <A r c h i t e k t u r n a m e > { f o r <Komponente> <Bindungsanweisungen >; end f o r ; } end f o r ; end [ c o n f i g u r a t i o n ] [< K o n f i g u r a t i o n s n a m e >]; 14 / 44
Beispiel einer VHDL-Beschreibung e i n f a c h e s B e i s p i e l : AND G a t t e r mit 2 Eingaengen l i b r a r y i e e e ; use i e e e. std_logic_1164. a l l ; f u e r Datentyp STD_LOGIC, s p a e t e r mehr... S c h n i t t s t e l l e e i n e s AND2 G a t t e r s e n t i t y AND2 i s port ( a : i n s t d _ l o g i c ; b : i n s t d _ l o g i c ; o : out s t d _ l o g i c ) ; end AND2 ; F u n k t i o n a l e s V e r h a l t e n des G a t t e r s a r c h i t e c t u r e b e h a v i o r of AND2 i s begin o <= a and b ; end b e h a v i o r ; 15 / 44
use für Einbinden von Bibliothekselementen oder eigene Paketen es kann jeder Name eines Paketes oder einer Bibliothek sichtbar gemacht werden Wichtig: Bibliotheken vor JEDER entity einbinden! mit Hilfe von all, werden alle Sub-Elemente sichtbar Vorsicht mit all: auf Abhängigkeiten achten!!! 16 / 44
use a l l e Elemente des P a k e t e s std_logic_1164 aus d e r B i b l i o t h e k i e e e, z. B. Datentyp s t d _ l o g i c l i b r a r y i e e e ; use i e e e. std_logic_1164. a l l ; a l l e Elemente des P a k e t e s own_package use work. own_package. a l l ; 17 / 44
entity Schnittstelle eines VHDL-Funktionsblockes nach außen (vergleichbar mit PINs eines IC-Gehäuses) S c h n i t t s t e l l e d e r Komponente d e f i n i e r e n e n t i t y <Entityname> i s [ g e n e r i c (< D e k l a r a t i o n von Parametern > ) ; ] port(< D e k l a r a t i o n d e r Ein und Ausgaenge >); [< E n t i t y d e k l a r a t i o n e n >;] end <Entityname >; generic: zur Festlegung generischer Parameter für die Komponente (z.b. einen Parameter für die Busbreite) 18 / 44
entity Deklaration der Anschlüsse erfolgt über port-anweisung Datentyp und Richtung der Ports (in, out, inout, buffer, linkage) muss festgelegt werden Anschlüsse werden mit Signalen verbunden, für Kommunikation nach außen (z.b. anderen Komponenten) Kommunikation innerhalb der Komponente WICHTIG: Variablen sind keine Signale! (später mehr) 19 / 44
architecture beschreibt das Verhalten eines VHDL-Moduls zu einer Entity verschiedene Möglichkeiten der Beschreibung (Unterschiede in Literatur) Strukturbeschreibung Istanziierung und Verbindung von Komponenten Verhaltensbeschreibung Prozessbeschreibung Funktionalitätsbeschreibung mit Prozessen Datenflussbeschreibung parallele Signalzuweisungen von booleschen Gleichungen 20 / 44
Strukturbeschreibung Verwendung von bereits vorhandenen VHDL-Modulen oder Bibliothekselementen zuerst Deklaration der Komponenten-Schnittstelle danach Instanziierung der Komponente im architecture-body component <Entityname> [ g e n e r i c (<Parameter D e k l a r a t i o n e n >); ] port ( I /O D e k l a r a t i o n e n ) ; end component ; 21 / 44
Strukturbeschreibung <I n s t a n z b e z e i c h n e r >: <Entityname> [ g e n e r i c map (<Parameter Zuweisungen >) ] port map (< Portzuweisungen >); jede Instanz erhält eine Bezeichnung zur Referenzierung port map: Verknüpfung der Instanz mit der Schnittstelle der Hauptkomponente und/oder internen Signalen generic map (optional): Übergabe von Parametern an die Instanz (später mehr dazu, z.b. bei der Verwendung interner FPGA-Komponenten) 22 / 44
Strukturbeschreibung AND G a t t e r mit 3 Eingaengen mit H i l f e von 2 x AND2 l i b r a r y i e e e ; use i e e e. std_logic_1164. a l l ; S c h n i t t s t e l l e des AND3 G a t t e r s e n t i t y and3 i s port ( a : i n s t d _ l o g i c ; b : i n s t d _ l o g i c ; c : i n s t d _ l o g i c ; o : out s t d _ l o g i c ) ; end and3 ; a r c h i t e c t u r e b e h a v i o r of and3 i s component AND2 i s port ( a : i n s t d _logic ; b : i n s t d _ l o g i c ; o : out s t d _ l o g i c ) ; end component ; 23 / 44
Strukturbeschreibung s i g n a l out_zw : std_logic ; begin 1. I n s t a n z u1 des AND2 G a t t e r s und Port Mapping u1 : AND2 port map( a, b, out_zw ) ; 2. I n s t a n z u1 des AND2 G a t t e r s und Port Mapping u2 : AND2 port map( c, out_zw, o ) ; end b e h a v i o r ; 24 / 44
Strukturbeschreibung resultiernde Schaltung der AND3-Komponente 25 / 44
Datenflussbeschreibung Spezialfall der Verhaltensbeschreibung, in der Literatur oft nicht explizit definiert/unterschieden Modellierung des Datenflusses über kombinatorische logische Funktionen ohne Prozesse alle Signalzuweisungen einer Datenflussbeschreibung verhalten sich nebenläufig 26 / 44
Datenflussbeschreibung e n t i t y RSFF i s port ( s, r : i n s t d _logic ; q, nq : out s t d _ l o g i c ) ; end RSFF ; a r c h i t e c t u r e d a t a f l o w of RSFF i s Z w i s c h e n s i g n a l e e i n f u e g e n ( Ausgaenge q, nq n i c h t l e s b a r ) s i g n a l nq_zw : s t d_logic ; s i g n a l q_zw : s t d _ l o g i c ; begin q_zw <= r nor nq_zw ; nq_zw <= s nor q_zw ; q <= q_zw ; nq <= nq_zw ; end d a t a f l o w ; 27 / 44
Datenflussbeschreibung Synthese-Ergebnis der Datenflussbeschreibung Problem dieser Schaltung? 28 / 44
Prozessbeschreibung Beschreibung des Verhaltens mit Hilfe von Prozessen Prozesse ermöglichen die Modellierung sequentieller Anweisungen (Verzweigungen, Schleifen, usw.) Allgemeine Prozess-Beschreibung: [< Prozessname >:] p r o c e s s [ ( S e n s i t i v i t a e t s l i s t e ) ] <D e k l a r a t i o n e n > begin {< S e q u e n t i e l l e Anweisungen >} end p r o c e s s [< Prozessname >]; 29 / 44
Prozessbeschreibung Prozess muss Sensitivitätsliste enthalten oder wait-anweisungen Sensitivitätsliste Signale durch Kommata getrennt Signale der Liste starten Prozessbearbeitung durch Simulator aktivieren die durch Prozess abgebildete HW und zwar wenn eines der Signal sich ändert ( Event ) ohne Sensitivitätsliste (wait-anweisungen) nicht synthesefähig (z.b. für Simulation) wait f o r 20 ns ; synthesefähig wait u n t i l c l k = 1 and c l k e v e n t ; 30 / 44
Prozessbeschreibung für synthesefähige Prozesse werden Prozesse mit Sensitivitätsliste empfohlen (REICHARDT) ABER: wait-anweisungen vorallem sinnvoll für einfache Testbenches (keine Synthesefähigkeit benötigt) Verwendung eines Prozessnamens ist optional Deklarationsteil kann eigene Datentypen, Konstanten oder Variablen enthalten funktionales Verhalten wird zwischen begin und end process; definiert 31 / 44
Prozessbeschreibung mehrere Prozesse innerhalb einer architecture verhalten sich nebenläufig im Simulator werden sequentiellen Anweisungen nacheinander abgearbeitet (wie in einer Programmiersprache) Abarbeitung im Simulator in unendlich kleiner Zeit ein Synthesewerkzeug versucht diese seq. Anweisungen auf Hardwarefunktionselemente abzubilden 32 / 44
Prozessbeschreibung in Prozessen sind unbedingte Signalzuweisungen erlaubt, selektive und bedingte Zuweisungen hingegen nicht (dort z.b. mit if then else arbeiten!) wichtig: Aktualisierung der Signalzuweisungen immer erst am Prozessende!!! Problem: während Prozessausführung nicht auf aktuelle Werte zugreifbar dafür gibt es Variablen 33 / 44
Architektur-Beschreibungsformen in der Praxis Mischung der verschiedenen Beschreibungsformen Strukturbeschreibung für Modul- und Hierarchiebildung Funktionalität über Verhaltens- und Datenflussbeschreibung die Strukturbeschreibung ermöglicht u.a. auch das Einbinden sogenannter Hard-Macros im FPGA (Multiplizierer, BRAM,...) 34 / 44
Signale, Variablen und Konstanten Unterscheidung für VHDL-Beginner oft schwierig Signale kann man prinzipiell als Verbindungen ansehen für externe und interne Anbindung von Komponenten, Funktionsblöcken Ports einer Entity werden auch wie Signale behandelt Signale müssen eindeutigen Namen und Typen innerhalb eines VHDL-Moduls haben 35 / 44
Signale, Variablen und Konstanten Definition von Signalen erfolgt im Architektur-Deklarationsteil... a r c h i t e c t u r e... e i n f a c h e s S i g n a l s i g n a l a : b i t ; 0 o d e r 1 s i g n a l b : s t d _ l o gic ; Neunwertige L o g i k ( empfohlen! ) S i g n a l v e k t o r e n s i g n a l c : std_logic_vector (7 downto 0 ) ; s i g n a l d : std_logic_vector (0 to 1 5 ) ; I n i t i a l i s i e r u n g ( n i c h t empfohlen! ) nur S i m u l a t i o n, NICHT SYNTHETISIERBAR! s i g n a l e : s t d _ l o gic := 0 ; begin... 36 / 44
Signale, Variablen und Konstanten Signalzuweisung über <= Operator Unbedingte Signalzuweisung:... s i g n a l a : s t d _ l o gic ; s i g n a l b : std_logic_vector (15 downto 0 ) ;... begin B e i s p i e l e u n b e d i n g t e S i g n a l z u w e i s u n g e n a <= b ( 6 ) ; a <= 1 ; b <= " 0110000001010100 " ; 37 / 44
Signale, Variablen und Konstanten Bedingte Signalzuweisung: [< B e z e i c h n e r >:] <Signalname> <= <Logischer_Ausdruck_1> when <Bedingung_1> e l s e [ <Logischer_Ausdruck_ 2> when <Bedingung_2> e l s e ]... <logischer_ Ausdruck_ n >; B e i s p i e l : o u t p u t <= a when c o n t r o l = 0 e l s e b when c o n t r o l = 1 e l s e 0 ; führt zu Prioritäts-Encoder (Verschachtelung von Gattern) vergleichbar mit if then else - Konstrukt 38 / 44
Signale, Variablen und Konstanten Selektive Signalzuweisung: [ B e z e i c h n e r : ] with <S i g n a l k o m b i n a t i o n > s e l e c t <Signalname> <= <Logischer_Ausdruck_1> when <Signalwert_ 1 >, [< Logischer_Ausdruck_ 2> when <Signalwert_ 2 >],... [< Logischer_Ausdruck_n> when o t h e r s ] ; B e i s p i e l : M u l t i p l e x e r, S i g n a l e x und y, e i n S t e u e r s i g n a l z und d e r Ausgang o u t p u t vom Typ s t d _ l o g i c gegeben MUX2: with z s e l e c t o u tput <= x when 0, y when 1, 0 when o t h e r s ; Auswahl aus einer Reihe gleichberechtigter Möglichkeiten (Multiplexerstruktur) 39 / 44
Signale, Variablen und Konstanten Konstanten und Variablen bestehen aus Name, Type und optional einem Initialwert Konstanten z.b. für generische Parameter in Packages Variablen werden normalerweise im Prozess-Deklarationsteil definiert Ausnahme: shared variable (von mehreren Prozessen benutzbar) Variablen-Zuweisung mit := Operator constant r e g i s t e r w i d t h : i n t e g e r := 3 2 ; constant PI : r e a l := 3, 1 4 1 5 9 2 6 5 ; v a r i a b l e n,m: i n t e g e r := 3 2 ; 40 / 44
Datentypen std_logic und std_ulogic für HW-Entwurf sind Elemente 0 und 1 des Datentyps BIT nur unzureichend keine Möglichkeit Signale auf hochohmig zu legen (z.b. wichtig für Busse, wie beispielsweise I 2 C) für ASIC-Entwurf ist auch eine Unterscheidung in schwache und starke Signale notwendig aus diesem Grund gibt es den Datentyp std_logic (9-wertige Logik) ursprünglich in VHDL nicht vorgesehen, deshalb die Bibliothek ieee.std_logic_1164 einbinden 41 / 44
Datentypen std_logic und std_ulogic Werte: U : nicht initialisiert (im Simulator) X : undefiniert (Simulator erkennt Buskonflikt) 0 : starke logische 0 1 : starke logische 1 Z : hochohmig (Tri-State Ausgang) W : schwach unbekannt (Buskonflikt zw. L und H ) L : schwache logische 0 H : schwache logische 1 - : Don t Care (Zustand bedeutungslos, für Minimierung verwendbar) 42 / 44
Datentypen std_logic und std_ulogic bei std_logic können mehrere Treiber für ein Signal existieren (z.b. wichtig für bidirektionale Busse mit mehreren Sendern) Auflösungsfunktion entscheidet, welches Signal sich durchsetzt (ist in IEEE 1164 als Tabelle gespeichert) Datentyp std_ulogic (u für unresolved): Signale dürfen nur in einem Prozess, bzw. einer nebenläufigen Anweisungen eine Wertzuweisung erfahren std_ulogic ist weniger flexibel, dadurch aber Erkennung versehentlicher Mehrfachzuweisungen (Fehlermeldung im Simulator) 43 / 44
Literatur Bücher VHDL-Synthese, Jürgen Reichardt, Bernd Schwarz, 5. Auflage, Oldenbourg Wissenschaftsverlag GmbH, 2009, ISBN 978-3-486-58987-0 The Designer s Guide to VHDL, P.J. Ashenden, 3. Auflage, Morgan Kaufmann Publisher, 2008, ISBN 978-0-12-088785-9 Paper [1] VHDL & Verilog Compared & Contrasted - Plus Modeled Example Written in VHDL, Verilog and C, Douglas J. Smith, 33rd Design Automation Conference, Las Vegas, 1996 44 / 44