14
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

Einführung in die Elektronik für Physiker - ipe.fzk.de file19.01.2009 Hartmut Gemmeke, WS2008/2009, Einführung in die Elektronik, Vorlesung 19 3 •! die proprietäre* Hardwarebeschreibungssprache

  • Upload
    others

  • View
    7

  • Download
    0

Embed Size (px)

Citation preview

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)