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
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)