30.10.2013 Aufrufe

Eine Einführung in die Schaltungsent- wicklung mit VHDL

Eine Einführung in die Schaltungsent- wicklung mit VHDL

Eine Einführung in die Schaltungsent- wicklung mit VHDL

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

INTERSTAATLICHE HOCHSCHULE<br />

FÜR TECHNIK BUCHS NTB<br />

<strong>E<strong>in</strong>führung</strong> <strong>in</strong> <strong>VHDL</strong><br />

8.8 Beispiel für sequentiellen Code <strong>mit</strong><br />

Schleifen<br />

Der abgebildete Prozess deko<strong>die</strong>rt den b<strong>in</strong>ären 4 Bit<br />

breiten E<strong>in</strong>gang <strong>in</strong>_array derart, dass <strong>in</strong> e<strong>in</strong>em 16<br />

Bit breiten Ausgangsfeld out_array <strong>die</strong> Leitung<br />

gesetzt wird, <strong>die</strong> dem dezimalen Wert des E<strong>in</strong>gangs<br />

entspricht. Liegt am E<strong>in</strong>gang <strong>in</strong>_array also<br />

z.B. der B<strong>in</strong>ärwert "0101" an, so wird der Ausgang<br />

out_array (5) auf '1' gesetzt. Natürlich wäre <strong>die</strong>se<br />

Aufgabe <strong>mit</strong> anderen Sprachkonstrukten wesentlich<br />

eleganter umsetzbar. Das Beispiel eignet sich jedoch<br />

auch gut zur Demonstration von Schleifen.<br />

Liegt an <strong>in</strong>_array e<strong>in</strong> Ereignis vor, so wird <strong>in</strong> der<br />

ersten Schleife e<strong>in</strong>e Variable sum auf den dezimalen<br />

Wert des b<strong>in</strong>ären E<strong>in</strong>gangs gesetzt. Jedes Element von<br />

<strong>in</strong>_array muss dabei vom Datentyp INTEGER<br />

se<strong>in</strong>, da<strong>mit</strong> es multipliziert werden kann. Die Elemente<br />

werden darum <strong>in</strong> e<strong>in</strong>en INTEGER -Typ umgewandelt.<br />

Bei <strong>die</strong>sem Beispiel ist auch zu beachten, dass <strong>die</strong> Variable<br />

sum am Beg<strong>in</strong>n des Prozesses auf 0 gesetzt<br />

werden muss, obwohl sie bereits während der Initialisierung<br />

zurückgesetzt wurde! Dies ist notwendig, da<br />

sich der Prozess nach e<strong>in</strong>em erneuten Aufruf bei e<strong>in</strong>er<br />

Zustandsänderung von <strong>in</strong>_array nur noch zwischen<br />

BEGIN und END bewegt, so dass ke<strong>in</strong>e erneute<br />

Initialisierung mehr erfolgt.<br />

Beispielcode e<strong>in</strong>es 4-zu-1 Decoders<br />

LIBRARY IEEE;<br />

USE IEEE.std_logic_1164.ALL;<br />

USE IEEE.numeric_std.ALL;<br />

ENTITY dec_4_1 IS<br />

PORT(<br />

<strong>in</strong>_array : IN std_logic_vector<br />

( 3 DOWNTO 0);<br />

out_array: OUT std_logic_vector<br />

(15 DOWNTO 0));<br />

END dec_4_1;<br />

ARCHITECTURE behavior OF dec_4_1 IS<br />

BEGIN<br />

PROCESS (<strong>in</strong>_array)<br />

VARIABLE sum : INTEGER<br />

RANGE 0 TO 15;<br />

BEGIN<br />

sum := 0;<br />

sum_of_<strong>in</strong>_array: FOR i IN 0 TO 3<br />

LOOP<br />

IF <strong>in</strong>_array(i) = '1' THEN<br />

sum := sum + (2**i);<br />

END IF;<br />

END LOOP sum_of_<strong>in</strong>_array;<br />

zero_array : FOR j IN 0 TO 15<br />

LOOP<br />

out_array(j)

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

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!