Ich habe hier eine VHDL Funktion und frage mich, warum diese
funktioniert. Vielleicht könnt ihr mir helfen ;)
Die Funktion wandelt nen Busvektor in einen Integer Wert um.
1 | function vec2int (v: std_logic_vector) return int is
|
2 | variable temp : integer := 0;
|
3 | begin
|
4 | for i in v'range loop
|
5 | temp := temp * 2;
|
6 | if v(i) = '1' then
|
7 | temp := temp + 1;
|
8 | end if;
|
9 | end loop;
|
10 | return temp;
|
11 | end vec2int;
|
Ich als C-Programmierer würde sagen - so kann das nicht funktionieren,
da in C eine Schleife wie
1 | for (int i=0; i< v'length; i++)
|
von i=0 bis i=v'range-1 abgearbeitet wird. Wenn man das mal
durchrechnet, also zB die Binärzahl 0101 wandeln will, käme als Ergebnis
A statt 9 raus.
Das oben genannte VHDL Beispiel funktioniert aber nur dann, wenn VHDL
die Schleife andersrum anfängt, und zwar beim MSB bgeinnt und mit dem
LSB aufhört. So wie der Code geschrieben ist, ist es aber anscheinend
egal, ob der Vektor v mit "to" oder "downto" deklariert wurde, VHDL
müsste as LSB identifizieren und mit der Bearbeitung eben dieses LSBs
beginnen.
Nehmen wir mal an, es ist wirklich so, dass dieser Code da oben wirklich
funktioniert, weil VHDL sowas vom MSB zum LSB abarbeitet. Dann käme für
die 4 Bit Zahl 0101 ja auch tatsächlich 9 raus.
Das führt aber zu einer weiteren Frage: Für die 8 Bit Zahl 0000 0101
käme was völlig anderes raus obwohl das ja auch dezimal 9 entspricht.
VHDL müsste also das MSB als höchstwertige 1 identifizieren und alle
Nullen davor abschneiden.
Verarbeitet VHDL die Schleifen also tatsächlich genau andersrum als C?
Oder ist der Code hier sinnfrei?