Entwurf und Simulation einfacher Logikelemente Philipp Fischer 10. Dezember 2002 1
Inhaltsverzeichnis I Theoretische Grundlagen 3 Einleitung 3 Entwurf einer Schaltung 3 Entitys und Architectures......................... 3 Simulation / Stimulation.......................... 3 Konfiguration und Ausgabe........................ 4 II Aufgaben 5 NAND-Gatter 5 XOR-Gatter 5 Übertragen der Code-Dateien von NAND ach XOR........... 5 Algorithmische Beschreibung........................ 5 Strukturelle Beschreibung......................... 6 Fehlerquelle glitch............................ 6 2
Teil I Theoretische Grundlagen Einleitung Im Versuch Entwurf und Simulation einfacher Logikelemente ging es im wesentlichen darum, sich mit der Entwurfsumgebung VHDL auseinanderzusetzen und diese näher kennenzulernen. VHDL bedeutet: VHSIC Hardware Description Language, wobei VHSIC für Very High Speed Integrated Circuit steht. VHDL ist eine Hardwarebeschreibende Sprache, mit der Digitale Schaltungen simuliert werden können. Entwurf einer Schaltung Entitys und Architectures Der Entwurf einer Schaltung gliedert sich vorerst in die Definition der einzelnen Elemente. Diese werden vorerst als Black-Box defniniert, indem nur Ein- und Ausgänge, also Eingangs- und Ausgangsvektor, bezeichnet werden. Diese Definition nennt man Entity. Eine Verhaltensweise eines durch den Entity-Befehl definierten Elements wird durch den Befehl architecture eingeleitet. Es können zu jeder Entity mehrere Verhaltensweisen, also architectures definiert werden, sie unterscheiden sich durch den Bezeichner (hier: verhalten1, verhalten2, ): entity NAND_gate is end NAND_gate; architecture verhalten1 of NAND_gate is end Dataflow; architecture verhalten2 of NAND_gate is end Dataflow; Simulation / Stimulation Sind die Elemente und deren Verhalten definiert, kann eine Simulation der Schaltung vorgenommen werden. Dazu Schafft man sich eine Umgebung, ebenfalls eine Entity, die die Schaltung stimuliert, also mit Signalen versorgt. Für die Simulationsumgebung wird ebenfalls das Verhalten, also die architecture, festgelegt. In 3
unserem Fall, zum Überprüfen von Gattern, gibt sie zeitlich - im Nanosekundenbereich - verschiedene Werte vor: a_test <= 0 after 0 ns, 1 after 2 ns, 0 after 4 ns, Der Eingang a test wird hier beispielsweise von 0 auf 1 und dann wieder auf 0 gesetzt. Konfiguration und Ausgabe Schließlich benötigt man zum Simulieren noch eine Kofiguration: configuration NAND_test of SimBox is for Test_NAND for my_nand_gate : NAND_gate use entity work.nand_gate(dataflow); end for; end for; end NAND_test; Die Konfiguration wird im Simulator geladen. Daraufhin kann der Prozess gestartet werden. Die Ausgaben des Simulators sind individuell auswählbar, es gibt numerische und graphische Ausgaben. Die configuraton (sie trägt im Beispiel den Namen NAND test) leitet eine Struktur ein, in der die zur Simulation verwendeten Elemente ausgewählt werden, also die Entities mit den zugeordneten Architectures. Im Code oben ist das die Entity SimBox mit der Verhaltensvorschrift Test NAND. In Test NAND tritt nun die Komponente NAND Gate auf. Diese ist nicht weiter defniniert. Deshalb verweist der Code an dieser Stelle auf eine externe Deklaration in der Bibliothek work, der Verweis lautet dann NAND_gate use entity work.nand_gate(dataflow); und enthält die definierte Entity und die gewünschte Architecture - in diesem Fall Dataflow. 4
Teil II Aufgaben NAND-Gatter Der erste Schritt war die Realisation eines NAND-Gatters mit VHDL. Dazu wurde eine Simulationumgebung (s. o.) geschaffen, eine Konfigurationsdatei und eine Datei zur Beschreibung des Gatters, also dessen Entity und Architecture. Die Dateien befinden sich im Anhang auf dne Seiten 1, 2 und 3. Das Ergebnis der Simulation entspricht der Rechenvorschrift eines NAND-Gatters. Die Signale sind im Anhang auf Seite 4 ausgedruckt, a und b als Eingänge und o als Ausgang. XOR-Gatter Übertragen der Code-Dateien von NAND ach XOR Es wurden dann die Dateien so editert, daß ein XOR-Gatter beschrieben werden konnte. Dazu befinden sich die Audrucke auf den Seiten 5 bis 7 im Anhang und auf Seite 8 das Ergebnis der Simulation, die Signale. Algorithmische Beschreibung Als weitere Möglichkeit das Verhalten einer Entity zu Definieren steht die Algorithmische Beschreibung zur Verfügung. Der Code dazu befindet sich auf Seite 9 im Anhang. Es wird dabei der Befehl process verwendet. Er steht in einer architecture-anweisung und kapselt einen abzuarbeitenden Prozeß dessen Ergebnis dann als das Ergebnis der architecture vorliegt: architecture algorithm of XOR_gate is decide: process(a,b) if o <= end decide; end algorithm; Die im process auftretenden Variablen - in diesem Fall a,b und o - sind die von der (der Architecture zugeordneten) Entity vorgegeben Variablen. Auf Seite 10 im Anhang bestätigen die Signale, daß die Rechenvorschrift eines XOR eingehalten wird. 5
Strukturelle Beschreibung Eine weitere Möglichkeit Schaltungen zu beschreiben bietet die Strukurbeschreibung. In unserem Fall wurde ein XOR aus 4 NAND-Gattern realisiert (siehe dazu Anhang Blatt 0, Vorbereitung). In genau dieser Form soll eine Schaltung nun auch in der Architecture beshcrieben werden. Es wird also eine Schaltung aus mehreren Bausteinen zusamengesetzt, indem ihre Ports, die Ein- und Ausgänge, miteinander verbunden werden. Diese Verbindungen müssen dafür im kopf der architecture-anweisung zusätzlich definiert werden, sie sind vom Typ signal: architecture structure of XOR_gate is signal s3,s4,s5: STD_LOGIC; component NAND_gate port (); end component; end structure; In diesem Codeauszug tritt auch wieder eine componente auf, also eine extern beschriebene Entity. Nun werden im Hauptteil der architecture structure Komponenten benannt und mit den Signal-Variablen untereinander verbunden: architecture structure of XOR_gate is U1:NAND_gate port map (a,b,s3); end structure; Dabei werden ebenfalls die von der Entity bereitgestellten I/O-Variablen a, b und o verwendet. Der Befehl port map (a,b,s3) gibt der Komponente U1 (des Typs NAND gate) die Eingangs- und Ausgangsvariablen vor. Der vollständige Code dazu ist im Anhang auf Seite 13 zu finden (Simulationsumgebung auf Seite 14). Fehlerquelle glitch Der Nachteil einer solchen sehr überschaubaren Zusammensetzung einer Schaltung ist die nicht vorgegebene Abhängigkeit der Ein- und Ausgaben der Komponenten. Es gibt also keine vorgegebene Reihenfolge der Berechnung der Komponentenergebnisse, so daß eine Komponente, die den Ausgang einer anderen trägt, erst ein gültiges Ergebnis liefern kann, sobald die den Eingang beschaltende Komponente ein gültiges Ergebnis liefert. Auf diese Weise muß das Ergebnis einige Komponenten erneut berechnet werden, so daß sich eine Verzögerung ergibt, während der am Ende ein ungültiges Ergebnis vorliegen könnte. 6
Um dieses Verhalten zu untersuchen haben wir auf die Schaltung (XOR aus NAND-Gattern) von (a=b=0) unmittelbar auf (a=b=1) geschaltet. Das Ergebnis hätte eine bleibende 0 sein müssen. Doch durch die oben beschriebenen Abhängigkeiten lag dann kurzfristig eine 1 als ergebnis vor, also ein ungültiges Ergebnis. Die Gaphik des Signalverlaufs befindet sich im Anhang auf Seite 14. 7