01.03.2014 Aufrufe

Functional hardware description in Lava

Functional hardware description in Lava

Functional hardware description in Lava

MEHR ANZEIGEN
WENIGER ANZEIGEN

Sie wollen auch ein ePaper? Erhöhen Sie die Reichweite Ihrer Titel.

YUMPU macht aus Druck-PDFs automatisch weboptimierte ePaper, die Google liebt.

(sum, carry) = fullAdd(carryIn, (a, b))<br />

(sums, carryOut) = adder(carry, (as, bs))<br />

Ähnlich wie dieser Addierer könnte mit diesem Rekursionsschema auch e<strong>in</strong>e<br />

Struktur zur Subtraktion oder Multiplikation erstellt werden.<br />

Gerade <strong>in</strong> den letzten beiden Beispielen wurde deutlich, dass viele Schaltungen<br />

ähnliche Strukturen verwenden. Um diese zusammen zufassen liefert <strong>Lava</strong><br />

polymorphe (also für alle Typen def<strong>in</strong>ierte) Verb<strong>in</strong>dungsfunktionen. Die e<strong>in</strong>fachsten<br />

Verb<strong>in</strong>dungen s<strong>in</strong>d parallele und serielle Schaltungen. Diese könnte man zwar auch<br />

ohne die Funktionen die <strong>Lava</strong> bietet realisieren, allerd<strong>in</strong>gs ist es möglich, dass<br />

Hardwarehersteller (wie Xil<strong>in</strong>x Inc.) diese Funktionen so auf ihre Produkte anpassen,<br />

dass präferenzen über die Platzierung von den Schaltungsteilen e<strong>in</strong>gehalten werden.<br />

Damit kann beispielsweise die Effizienz von den Schlatungen verbessert werden.<br />

Bei der seriellen Verb<strong>in</strong>dung werden 2 e<strong>in</strong>zelne Schaltungen so verbunden, dass der<br />

Ausgang der ersten an den E<strong>in</strong>gang der zweiten Schaltung geleitet werden. Dies<br />

funktioniert mit dieser Funktion für alle Schaltungen die <strong>in</strong> dieser Form<br />

zusammenpassen (also der Ausgang der ersten das gleiche Format wie der E<strong>in</strong>gang<br />

der zweiten hat):<br />

(->-) :: (a -> b) -> (b -> c) -> (a -> c)<br />

(f ->- g) a = c<br />

where<br />

b = f a<br />

c = g b<br />

Die parallele Verb<strong>in</strong>dung verknüpft die Schaltungen so, dass aus 2 Schaltungen e<strong>in</strong>e<br />

Schaltung wird, die gleichzeitig die E<strong>in</strong>gäng der ersten und der zweiten aufnimmt und<br />

die Ausgänge beider Schaltungen zusammen zurückgibt.<br />

(-|-) :: (a -> c) -> (b -> d) -> ((a, b) -> (c, d))<br />

(f -|- g) (a, b) = (c, d)<br />

where<br />

c = f a<br />

d = g b<br />

Weiterführend zu diesen e<strong>in</strong>fachen Verb<strong>in</strong>dungen kann man e<strong>in</strong>e Verb<strong>in</strong>dung<br />

def<strong>in</strong>ieren, die e<strong>in</strong>e Schaltung mehrfach h<strong>in</strong>tere<strong>in</strong>ander hängt, die E<strong>in</strong>gänge und die<br />

Ausgängen zusammenfasst und e<strong>in</strong>en speziellen Ausgang immer an e<strong>in</strong>en speziellen<br />

E<strong>in</strong>gang von der nächsten Schaltung weiterreicht. Diese "Zeile" (analog wäre auch<br />

e<strong>in</strong>e Spalte möglich) könnte wiefolgt aussehen:<br />

row :: ((c, a) -> (b, c)) -> (c, [a]) -> ([b], c)<br />

row f (carryIn, []) = ([], carryIn)<br />

row f (carryIn, a:as) = (b:bs, carryOut)<br />

where<br />

(b, carry) = f (carryIn, a)<br />

(bs, carryOut) = row f (carry, as)<br />

Diese Struktur ermöglicht es jetzt die Def<strong>in</strong>ition von BitAddierer oder Addierer stark zu<br />

vere<strong>in</strong>fachen 3 :<br />

bitAdder = row halfAdd<br />

adder' = row fullAdd<br />

3: Die Signatur von adder' ist nicht exakt identisch mit der von adder: Es wird ke<strong>in</strong><br />

Tupel von 2 Listen übergeben sondern e<strong>in</strong>en Liste mit Tupeln von je 2 Werten.<br />

Seite 4/7

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!