einführung in die elektronik für physiker - ipe.fzk.de file19.01.2009 hartmut gemmeke,...
TRANSCRIPT
Hartmut Gemmeke Forschungszentrum Karlsruhe, IPE [email protected]
Tel.: 07247-82-5635
Einführung in die Elektronik für Physiker
19. ALTERA HDL
Was ist eine Hardware Beschreibungs-Sprache (HDL) - warum brauchen wir sie?
Konventionen der AHDL-Sprachelemente
Sprachelemente: CONSTANT, FUNCTION, SUBDESIGN, BEGIN, END, VARIABLE, IF, CASE, Wahrheitstafeln (TABLE),
Logische und arithmetische Operationen
Bibliothekselemente Knoten (NODE), TRIstate, Flipflops
Sequentielle Logik
AHDL Style Guide
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 2
Warum macht man die HDL-Beschreibung?
Probleme:
1.! Kosten
2.! Personal-Jahre für die Ent-
wicklung
Zukunft? System-C?
Ein modifizier-tes C für
Soft- und Hardware.
Um in noch vertretbarer Zeit und mit endlichem Aufwand den Design fertig zu stellen
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 3
•! die proprietäre* Hardwarebeschreibungssprache von ALTERA
•! entwickelt für komplexe kombinatorische und sequentielle Logik: –! Altera-EPLDs (erasable and programmable logic devices) –! Unabhängig von der Wahl der verwendeten EPLD-Bausteine
–! Wiederverwendbarkeit von Teildesigns (SUBDESIGN) in hierarchischer Struktur, auch in VHDL
–! Simulation
–! Synthese
•! Beispiel Halbaddierer in AHDL: SUBDESIGN halbadd (
a, b : INPUT; car, sum : OUTPUT;
)
BEGIN
car = a & b;
sum = a & !b # !a & b;
-- kürzer: sum = a $ b; -- wegen der benutzten Look-up-tables
END -- dauert das auch genauso lange
Was ist AHDL?
$ = XOR
! = NICHT & = UND # = ODER
* proprietär = firmeneigene
CHA
!
a
b
=1
&
!
C
a
b
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 4
Aufbau einer AHDL-Beschreibung
•! Jedes Subdesign wird in einem Text-Design-File (*.TDF) abgelegt und setzt sich aus mehreren Sektionen zusammen (siehe Tabelle):
–! Jeder dieser Files muss eine SUBDESIGN- und Logik-Sektion besitzen
–! Konstanten, Funktionsprototypen, TITLE, INCLUDE und Deklarationen von Variablen sind optional und hängen von der Anwendung ab
TITLE Anweisung! Gibt dem Projekt einen Titel (für die Dokumentation)!
INCLUDE Anweisung! Erlaubt als *.inc File, ähnlich wie ein *.h-File in C, z.B.
Definitionen, aber keine Logik oder Subdesigns zu laden!
CONSTANT Anweisung! Definiert Konstanten!
FUNCTION Prototyp! Definiert Prototypen für Makrofunktionen!
SUBDESIGN Sektion! Deklariert Schnittstellen des Subdesigns (Ein- und
Ausgangs-Signale)!
VARIABLE Sektion! Deklariert logische Elemente, d.h. Instanzen von
Funktions-Primitiven oder Makrofunktionen!
Logik Sektion! Zwischen BEGIN und END steht die Logik, die parallel
ausgeführt wird!
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 5
Was ist AHDL II
•! AHDL-Beschreibung = textuelle Beschreibung von Hardware-komponenten in Text Define Files (.TDF)
•! Syntheseergebnis ist bei einfacher Beschreibung oft optimal
•! AHDL ist eine parallele Sprache
Include Files
(.inc)
CONSTANT
DEFINE
PARAMETERS
FUNCTION Prototyp
text define files (.TDF)
TITLE Anweisung
INCLUDE Anweisung
CONSTANT
DEFINE
PARAMETERS
FUNCTIONs Prototyp
OPTION
SUBDESIGN
Sektion
VARIABLE
Logik Sektion
Notwendig in einem TDF-File
SUBDESIGN halbadd (
a, b : INPUT;
car, sum : OUTPUT;
)
BEGIN
car = a & b;
sum = a & !b # !a & b;
-- kürzer sum = a $ b;
END
–! Alle Anweisungen in einer logischen SUBDESIGN Sektion werden parallel, d.h. zur gleichen Zeit
ausgeführt und nicht sequentiell !
–! d.h. Reihenfolge spielt keine Rolle
–! Sequentielle Logik lässt sich nur durch Speicherelemente realisieren
(z.B. Flipflops)
Beispiel für parallele Abarbeitung
SUBDESIGN bool
(
a,b,c : INPUT;
out1,out2 : OUTPUT;
)
BEGIN
out1 = a&b; -- a,b,c : z.B.: alle 3 gleichzeitig 0->1
out2 = !out1&c; -- ??? out1, out2
END;
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 6
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 7
Konventionen der AHDL Sprachelemente I
•! Kommentare:
–! Kommentare werden bei AHDL mit %-Zeichen eingeschlossen,
–! Oder wie in VHDL durch -- gestartet und mit dem Ende der Zeile beendet
–! man kann sehr übersichtlich mit “%“ den nicht benötigten Code über die Zeilengrenzen hinaus auskommentieren
•! Zahlen
–! können binär, oktal, dezimal oder hexadezimal eingegeben und beliebig in einem Ausdruck kombiniert werden:
•! Binär: B“010X“ Sequenz von 1, 0 und X (don‘t care)
•! Oktal: O“037“ Reihe von Zahlen im Bereich 0 ..7 oder Q“037“
•! Dezimal: Serie von Zahlen zwischen 0 und 9
•! Hexadezimal X“03F“ Reihe von Zahlen im Bereich 0 bis 15: 0..9,A..F oder H“03F“
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 8
Konventionen der AHDL Sprachelemente II
•! Namen
–! Namen dürfen keine Leer- oder Sonderzeichen enthalten (sonst Namen mit (‘) einschließen), AHDL unterscheidet nicht zwischen Groß- und Kleinschreibung!
–! Namen dürfen nicht länger als 32 Zeichen sein.
•! Man kann die Ziffern 0..9 und
•! die Buchstaben A..Z (groß oder klein) sowie
•! den Unterstrich _ im Namen verwenden.
•! "/" am Anfang eines Namens = "active-low"-Signal (invertiertes Signal)
–! Man unterscheidet 3 Typen von Namen:
•! Symbolische Namen für benutzerdefinierte Bezeichner (Identifier) von Variablen, Konstanten, ...
•! Subdesign-Namen
•! Namen von Schnittstellen (Ports)
•! Strings (Zeichenketten) sind Argumente für TITLE und INCLUDE, werden durch Anführungsstriche eingeschlossen:
–! TITLE “volladder“ -- oder z.B.
–! INCLUDE “volladder.inc“ -- ein Default-Include-File von einem *.tdf File -- wird im File-Menu erzeugt
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 9
Konventionen der AHDL Sprachelemente III
•! Boolesche Größen:
–! Einzelne Signale werden in AHDL stets als boolesche Größen interpretiert und
–! Wertzuweisung über die reservierten Schlüsselwörter VCC und GND: •! „wahr“ als VCC (z.B. a = VCC) und •! „nicht wahr“ als GND (z.B. a = GND)
•! (Bit-)Vektoren: –! Gruppen von Booleschen Größen = Vektoren von maximal 256
Einzelelementen (Bits oder Komponenten) : •! z.B. a[5..0]
•! ist dieser Vektor einmal definiert, so kann ich auch Teilbereiche verwenden a[5..2]
•! oder die Bereichsangaben weglassen a[ ] = a[5..0]
•! bei Teilvektoren mit nur einem Element, kann man die eckige Klammern auch weglassen a[5] = a5
•! Aufzählungsvektoren sind mit einer runden Klammer eingeschlossen und die Elemente mit Kommata getrennt: (a[4..2], b, c)
•! Vektoren lassen sich logisch und arithmetisch interpretieren: a[3..0] = (VCC, GND, GND, VCC) = (1,0,0,1) = 9 = -7 (siehe Vorlesung 17.10)
•! Konstanten: –! sind ganze positive oder negative Zahlen (als 2er Komplement)
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 10
•! Mit Hilfe des CONSTANT Bezeichners werden symbolischen Namen numerische Konstanten zugewiesen
–! wenn z.B. eine Konstante öfters in einem Design auftaucht, erhöht das die Übersichtlichkeit, Konstanten wird der Wert nur einmal zugewiesen:
–! CONSTANT N_REG = LOG2(256) - 1
•! FUNCTION Prototyp Anweisungen sind notwendig, –! um einen Logikdesign in mehrere Teildesigns
zu zerlegen und wieder für ein SUBDESIGN zur Verfügung zu stellen, z.B.:
–! FUNCTION volladd(a,b,carry_in) RETURNS (sum, carry_out);
–! Es werden die Eingangs- und Ausgangsports definiert, die tatsächliche Realisierung (Code) befindet sich in dem zugehörigen File für dieses SUBDESIGN oder eine MAX+PlusII Mega- oder Macrofunction
CONSTANT- und FUNCTION- Anweisung
a b carry_in
sum carry_out
volladd
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 11
•! Das Schlüsselwort SUBDESIGN ist gefolgt von einem Subdesign-Namen (*) und muss den gleichen Namen haben wie der *.TDF-File
•! Deklaration der Ein- und Ausgänge eines Subdesigns
–! Eingeschlossen durch Klammern ()
–! Signalnamen sind durch ", " getrennt, durch ein “ : " gefolgt und nach der Typdeklaration mit ";" abgeschlossen.
–! Die Typdeklarationen werden durch die Schlüsselworte INPUT bzw. OUTPUT oder BIDIR getätigt.
–! Optional lässt sich einer Typedeklaration auch ein Defaultwert (= VCC oder = GND) zuweisen.
•! Beispiel:
SUBDESIGN 8_bit_add -- addiere 8 bit a und b, um Summe sum und carry ( -- zu erhalten
a[7..0], b[7..0], carry_in : INPUT;
sum[7..0], carry_out : OUTPUT;
)
SUBDESIGN Sektion
8_bit_add
carry_out sum[7..0]
a[7..0] b[7..0] carry-in
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 12
VARIABLE Sektion
•! Deklaration von Instanzen* von Makrofunktionen von bereits bestehenden Subdesigns
–! Makrofunktionen müssen vor der Deklaration von Instanzen in einem FUNCTION Prototype Statement eingeführt werden.
–! Funktionsprimitive können direkt instanziert werden (Altera Flipflops, ...).
•! Oder von Funktionsprimitiven (Flipflops oder anderen Speicherelementen), die vom System zur Verfügung gestellt werden, und
•! Definition von intermediären Variablen (Zwischenvariablen) als Typ NODE
Beispiel:
VARIABLE
add[7..0]: volladd -- definiert 8 Volladdierer-Elemente in einer Form,
-- die vorher in einem anderen Subdesign
-- logisch definiert wurde
*Instanzen sind eingesetzte Größen oder Funktionen, die wie Zwischenvariablen behandelt werden. Z.B. add[7..0] sind 8 Knoten (NODEs) mit jeweils 5 Instanzen, siehe rechts, bzw. Seite 9 z.B. a0 erreiche ich über add[0].a
a b carry_in
sum carry_out
volladd
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 13
Logische Operationen
•! Die Reihenfolge logischer Operatoren kann durch runde Klammern beeinflusst werden, z.B. a & (b # c)
•! Logische Operatoren können auch auf Vektoren und Teilvektoren angewendet werden:
–! !a[3..0] = (!a3, !a2, !a1, !a0) oder
–! !9 = !(1,0,0,1) = (0,1,1,0) = 6
–! aber y = 0 ist nicht erlaubt, wenn es nicht zuvor als Vektor definiert
wurde, aber y = GND ist o.k.
Priorität! Symbol! Schlüsselwort! Logische Bedeutung!
1! !! NOT! nicht!
3! ==! Gleich (Vergleich)!
3! !=! Ungleich (Vergleich)!
4! &! AND! und!
4! !&! NAND! Nicht und!
5! $! XOR! Exklusiv-oder!
5! !$! XNOR! nicht Exklusiv-oder!
6! #! OR! oder!
6! !#! NOR! Nicht oder!
Unlogische Namensgebung
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 14
Arithmetische Operationen I
•! Bei arithmetischen Operationen müssen Vektoren die gleiche Länge aufweisen
Symbol Beispiel Priorität Beschreibung ! !a 1 NOT ^ a^2 1 Exponent MOD 4 MOD 2 2 Modulus DIV a / 2 2 Division • 2 • a 2 Multiplikation
LOG2 LOG2(4-1) 2 Logarithmus zur Basis 2 (wird aufgerundet)
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 15
Arithmetische Operationen II
•! Die arithmetischen Vergleichsoperationen führen immer auf logische Variablen, auch bei Verwendung von Vektoren: b = a[3..0] == 0; -- entspricht der nächsten Zeile b = !(a3 # a2 # a1 # a0); -- oder nach de Morgan b = !a3 & !a2 & !a1 & !a0 Priorität! Symbol! Typ! Arithmetische
Beschreibung!
1! -! unär! Negation!
3! +! binär! Addition!
3! -! binär! Subtraktion!
4! ==! binär! gleich!
4! !=! binär! ungleich!
4! <! binär! kleiner!
4! <=! binär! kleiner gleich!
4! >! binär! größer!
4! >=! binär! größer gleich!
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 16
Ein Mini-Beispiel
TITLE "Volladdierer"; -- erzeugt aus 2 Halbaddierern
FUNCTION halbadd(a,b) -- oder: INCLUDE „halbadd.inc“;
RETURNS (car, sum);
SUBDESIGN volladd
(
x[1,0], carry_in : INPUT;
carry_out, sum_out : OUTPUT;
)
VARIABLE add[1,0] : halbadd; -- zwei Halbaddierer werden definiert
BEGIN
add[0].a = x[0]; -- hier mit dem Eingang und
add[0].b = x[1];
add[1].a = add[0].sum; -- untereinander verknüpft
add[1].b = carry_in;
sum_out = add[1].sum;
carry_out = add[0].car # add[1].car; -- ein OR-Gatter für carry_out
END
HA
HA "1# carry_out
sum_out
x[0]
x[1]
carry_in
car
car sum
sum
0 1
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 17
Wahrheitstafel
SUBDESIGN 7segment -- dekodiert B"0000" bis B"1111" in Steuerkode für 7-Segmentanzeige
( -- oder H"0" bis H"F" in 0 bis F
i[3..0] : INPUT
a,b,c,d,e,f,g : OUTPUT
)
BEGIN
TABLE -- Eine kombinatorische Logik lässt sich auch durch eine Wahrheitstafel darstellen
i[3..0] => a, b, c, d, e, f, g; -- -a-
H"0" => 1, 1, 1, 1, 1, 1, 0; -- f b
H"1" => 0, 1, 1, 0, 0, 0, 0; -- -g-
H"2" => 1, 1, 0, 1, 1, 0, 1; -- e c
H"3" => 1, 1, 1, 1, 0, 0, 1; -- -d-
H"4" => 0, 1, 1, 0, 0, 1, 1;
H"5" => 1, 0, 1, 1, 0, 1, 1; -- dargestellt werden 0, 1, 2, 3 , 4 , 5, 6, 7, 8, 9, A, b, C, d, E, F
H"6" => 1, 0, 1, 1, 1, 1, 1;
H"7" => 1, 1, 1, 0, 0, 0, 0;
H"8" => 1, 1, 1, 1, 1, 1, 1;
H"9" => 1, 1, 1, 1, 0, 1, 1;
H"A" => 1, 1, 1, 0, 1, 1, 1;
H"B" => 0, 0, 1, 1, 1, 1, 1;
H"C" => 1, 0, 0, 1, 1, 1, 0;
H"D" => 0, 1, 1, 1, 1, 0, 1;
H"E" => 1, 0, 0, 1, 1, 1, 1;
H"F" => 1, 0, 0, 0, 1, 1, 1;
END TABLE
END
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 18
IF Statements
•! Bedingte Logik um die Lesbarkeit eines Designs zu erhöhen IF a == b THEN
equal = VCC;
ELSEIF a < b THEN
equal = GND;
smaller = VCC;
ELSE
equal = GND;
smaller = GND;
END IF;
Probleme: –! Vollständigkeit: was ist mit smaller für a == b ? –! Parallelität: Alle Statements in IF und ELSEIF werden gleichzeitig ausgeführt,
in konventionellen Programmiersprachen hintereinander! –! Führt zumeist zu aufwändigerer Logik
IF a == b THEN -- wird vom Compiler übersetzt in:
equal = VCC; -- (wegen der Parallelität)
ELSE
equal = GND;
END IF;
Ohne IF:
equal = a == b; -- entspricht equal = (a == b);
smaller = a < b;
Bedingte Logik lässt sich immer durch Boolesche Gleichungen ersetzen !
IF a == b THEN
equal = VCC; END IF;
IF a != b THEN
equal = GND;
END IF;
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 19
CASE Statements
•! Bedingte Logik, weniger aufwändig als IF ... THEN
CASE a IS -- Vergleich eines logischen Ausdrucks mit verschiedenen Konstanten
WHEN 1 =>
b = c;
WHEN 2 =>
b = -c;
WHEN OTHERS -- Default Alternative
b = GND;
END CASE;
Wofür ist das nützlich?
z.B. zur Beschreibung von Automaten oder "Finite State Machines"
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 20
FUNCTIONs-Primitive: Kombinatorisch
•! Knoten ("Nodes"), Zwischenergebnisse in einem booleschen Design, die man wieder verwenden will: -- wird vom Compiler erzeugt, aber FUNCTION NODE (in) -- ohne Instanz in, out
RETURNS (out); -- Mehrfache Zuweisungen sind erlaubt:
–! Z.B.: -- ergibt wired OR, wenn* default=GND, VARIABLE zero: NODE; -- *das gilt automatisch für active high -- Wertzuweisung: -- und wired-AND, wenn default=VCC zero.in = a[7..0] == 0; -- das gleiche kommt heraus für (=!a0&...&!a7)
–! -- Verwendung des Knoten-Werts: f = zero.out;
•! Tristate-Buffer definiert Datentor nach außen FUNCTION TRI (in, oe)
RETURNS (out); –! Z.B.:
VARIABLE a: TRI_STATE_NODE;
–! oe ist das output enable Signal: der Tristate-Buffer ist aktiv, wenn oe == VCC und
hochohmig für oe == GND
–! im Fall bidirektionaler Leitungen muss im SUBDESIGN-Header die Variable als BIDIR charakterisiert werden
a.oe = Freigabe Ausgang (output enable)
a.in Eingang
a.out Ausgang
a
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 21
Zustands-Automaten
•! Eine Zustandsmaschine braucht eine Variablen-Definition vom Typ MACHINE WITH STATES
VARIABLE ss: MACHINE WITH STATES (s0, s1);
–! Definiert einen Automaten mit dem Namen ss und 2 Zuständen s0, s1
–! Compiler generiert automatisch die notwendigen Flipflops und die Zustandskodierung sowie
–! 3 Standard Ports
•! clk Taktsignal des Automaten
•! reset (active high), Rücksetzung in den zuerst definierten Zustand
•! ena (optional) Freigabe ( = VCC) oder Sperrung ( = GND) des Taktsignals
•! Zugriff auf die Ausgänge des Zustandsflipflops und Decodierung der Zustände:
VARIABLE
ss: MACHINE OF BITS (q0,q1) WITH STATES (idle = B"00", wait = B"10", active = B"11"); –! Die Dekodierung kann man auch dem Compiler überlassen:
ss: MACHINE WITH STATES (idle, wait, active);
–! Die Zustandsübergänge werden in der Logiksektion definiert
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 22
D-Flipflop als Statemachine
SUBDESIGN D_flipflop_fsm
(
clk, reset, d : INPUT;
q : OUTPUT;
)
VARIABLE
qq: MACHINE WITH STATES (q0 = B"0", q1 = B"1");
BEGIN qq.clk = clk; -- Standard inputs eines Automaten
qq.reset = reset; -- Enable ist weggelassen (optional)
TABLE
qq, d => qq, q;
q1, 0 => q0, 0;
q1, 1 => q1, 1;
q0, 0 => q0, 0;
q0, 1 => q1, 1;
END TABLE;
END;
d=1
q0
q1
d=0
d=0
d=1
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 23
D-Flipflop als Statemachine mit „CASE“
SUBDESIGN D_flipflop_fsm
(
clk, reset, d : INPUT;
q : OUTPUT;
)
VARIABLE
qq: MACHINE WITH STATES (q0 = B"0", q1 = B"1");
BEGIN qq.clk = clk; -- Standard inputs eines Automaten
qq.reset = reset; -- Enable ist weggelassen (optional)
CASE qq IS
WHEN q0 => q=GND;
IF d THEN qq=q1;
ENDIF;
WHEN q1 => q=VCC;
IF !d THEN qq=q0;
ENDIF;
END CASE;
END;
d=1
q0
q1
d=0
d=0
d=1
"Primitive" der Sequentiellen Logik
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 24
Primitiv! Funktionsprototyp! Flipflop-Typ!
LATCH! FUNCTION LATCH (d, ena)"
RETURNS (q);!Latch, levelsensitiv!
DFF! FUNCTION DFF (d, clk, clrn, prn)"
RETURNS (q);!D-Flipflop!
TFF! FUNCTION TFF (t, clk, clrn, prn)"
RETURNS (q);!Toggle-Flipflop!
SRFF! FUNCTION SRFF (s, r, clk, clrn, prn)"
RETURNS (q);!RS-Flipflop!
JKFF! FUNCTION JKFF (j, k, clk, clrn, prn)"
RETURNS (q);!JK-Flipflop!
DFFE! FUNCTION DFFE (d, clk, clrn, prn, ena)"
RETURNS (q);!D-Flipflop"
mit Freigabe!
TFFE! FUNCTION TFFE (t, clk, clrn, prn , ena)"
RETURNS (q);!Toggle-Flipflop"
mit Freigabe!
SRFFE! FUNCTION SRFFE (s, r, clk, clrn, prn , ena)"
RETURNS (q);!RS-Flipflop "
mit Freigabe!
JKFFE! FUNCTION JKFFE (j, k, clk, clrn, prn , ena)"
RETURNS (q);!JK-Flipflop "
mit Freigabe!
Dabei bedeuten:
clk : Register Clock Input
clrn : Clear invertiert
prn : Preset Input invertiert
ena : Latch oder Clock Enable,
ena == GND : sperrt die Clock des Flipflop
d, t, r, s, j, k : Daten Input von Logik und
q : Output
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 25
Beispiele zur Sequentiellen Logik I
•! D-Flipflop:
VARIABLE a: DFF; -- bedeutet:
a.D Setzeingang (Eingangsport)
a.clk Takteingang CLK (Eingangsport)
a.prn asynchroner Setzeingang SET (Eingangsport, Defaultwert VCC)
a.clrn asynchroner Rücksetzeingang RESET (Eingangsport , Defaultwert VCC)
a.Q Ausgang Q (Ausgangsport)
Nur ein Output
=> man kann .q weglassen
( Bei anderen Primitiven mit nur einem Eingang/Ausgang
=> das Gleiche)
a.d
a.clk
a.prn
a.clrn
a a.q
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 26
Beispiele zur Sequentiellen Logik II
•! 16 Bit Register = Flipflop-Vektor CONSTANT WIDTH = 16;
SUBDESIGN register (
clock: INPUT;
load: INPUT;
d[WIDTH..1]: INPUT;
q[WIDTH..1]: OUTPUT;
)
VARIABLE reg[WIDTH..1] : DFFE;
BEGIN reg[ ].clk = clock;
reg[ ].ena = load;
reg[ ].prn = VCC; -- nicht notwendig, Default-Wert auch o.k.
reg[ ].clrn = VCC; -- nicht notwendig, Default-Wert auch o.k. reg[ ].d = d[ ];
q[ ] = reg[ ].q; -- .q überflüssig, es gibt nur einen output
END;
-- Weitere Vereinfachung:
VARIABLE q[WIDTH..1] : DFFE;
BEGIN q[ ].clk = clock;
q[ ].ena = load;
q[ ] = d[ ];
END;
-- q[ ] und der Ausgang des D-Flipflops
-- haben gleichen Namen und werden -- daher automatisch verbunden
19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 27
AHDL Style Guide
•! Formatierung („Groß“-Schreibung): –! Alle Schlüsselworte,
–! Konstanten,
–! Namen von Devices und
–! Primitivs
•! Zwischenräume ("space") –! Kein extra Leerzeichen vor (;), (,), nach und vor öffnenden bzw. schließenden Klammern
bzw. (") oder (%)
–! Benutzung von TABs um Tabellen und (:) auszurichten
–! Leerzeichen vor und nach Operatoren und Komparatoren (aber nicht nach (!))
•! Kommentare –! Nur sinnvolle (nicht triviale wie: q = 1; -- load q with 1)
–! Kommentar direkt zum Header eines SUBDESIGNs und z.B. zur Erklärung von Konstanten, gerufenen Routinen, ...
•! Namensgebung -> sinnvoll, d.h. leicht erkennbar –! Statt z.B. Richtung: aufwärts oder abwärts
–! Active low: statt write_neg: /write
–! Unterstrich um Wörter in symbolischen Anteil und einfachen Namen zu trennen, z.B. reg_load statt regload, ...
–! Keine sinnlosen Abkürzungen wie c statt clr oder clear
–! Zahlen durch Konstanten mit Namen von erkennbarer Bedeutung ersetzen
•! Gliederung durch Einrücken (gleichrangige Statements <-> gleiche Einrückung)