Hardware Reference
In-Depth Information
return
Feld;
end function
;
)
WEB-Projekt:P3.3/AfgEA_pack.vhdl
b) Zur Initialisierung einer Konstanten wird nach der Typzuordnung der
Rückgabewert der Initialisierungsfunktion mit dem Dateinamen und dem
Wert 1024 als Aufrufparameter zugewiesen:
constant
ROM: tByteFeld:=Init(
"Daten.txt"
,
1024
)
)WEB-Projekt:P3.3/Test_Afg3_13_pack.vhdl
6.3.4 Beschreibungsschablonen für digitale Schaltungen
Lösung zu Aufgabe 3.14
a) In einer Schleife über alle Eingabewerte wird die Zählvariable für alle
Eingabebits, die »1« sind, um eins erhöht:
function
Anzahl1a(x:std_logic_vector; N:natural)
return
tUnsigned
is
variable
sum: tUnsigned(N-1
downto
0):=(
others
=>
'0'
);
begin
for
idx
in
x'range
loop
if
x(idx)=
'1'
then
sum := sum+
"1"
;
end if
;
end loop
;
return sum
;
end function
;
b) Die Umstellung des Berechnungsflusses für die Additionen von einer
Ketten- in eine Baumstruktur nutzt im einfachsten Fall den Algorith-
mus aus Abb. 3.22. Die Summanden und Zwischensummen dürfen laut
der Fußnote in der Aufgabenstellung alle die Bitbreite N haben und kön-
nen somit wie im Vorbildalgorithmus zu einem Vektor zusammengefasst
werden. Der Typ dieses Vektors ist von den Aufrufparametern abhängig
und muss deshalb innerhalb der Funktion vereinbart werden. Die erste
Schleife im Anweisungsteil überträgt die Bitwerte des Eingabevektors in
die niederwertigsten Bits der ersten Vektorelemente der Variablenzund
schreibt in die höherwertigen Bits Nullen. Auf diese Weise initialisiert sie
die Vektorelemente für die Eingabewerte wahlweise mit dem Wert null
oder eins. Dann werden wie in Abb. 3.22 immer die Werte benachbar-
ter Feldelemente zusammengefasst - hier im Beispiel addiert - und das
Ergebnis in das nächste freie Feldelement eingetragen:
function
Anzahl1b(x:std_logic_vector; N:natural)
return
tUnsigned
is
type
tVektortyp
is array
(natural
range
<>)
of
tUnsigned(N-
1
downto
0
);
constant
xl:natural:= x'length;
variable
z: tVektortyp(
2
*xl-
2
downt
o
0
);