Functional hardware description in Lava
Functional hardware description in Lava
Functional hardware description in Lava
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