Forum: FPGA, VHDL & Co. Warum funktioniert diese VHDL Funktion?


von Schnapphase (Gast)


Lesenswert?

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?

von Schnapphase (Gast)


Lesenswert?

Ah, jetzt bin ich selbst durcheinander gekommen. Hier nochmal die 
richtige Version:

"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 das MSB identifizieren und mit der Bearbeitung eben dieses MSBs
beginnen."

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> Oder ist der Code hier sinnfrei?
Nein, durch
> v'range
nimmt die Funktion genau die Definition des Vektors und wandelt die von 
links beginnend in einen Integer um.

Probier das mal mit
A)   v: std_logic_vector(5 downto 0)
B)   v: std_logic_vector(0 to 31)
C)   v: std_logic_vector(79 downto 63)
D)   v: std_logic_vector(56 to 89)

Die Funktion nimmt an, dass das linke Bit als das MSB gilt.
Das kommt dabei raus:
>  for i in v'range loop
-->
A)   for i in (5 downto 0) loop
B)   for i in (0 to 31) loop
C)   for i in (79 downto 63) loop
D)   for i in (56 to 89) loop

> Verarbeitet VHDL die Schleifen also tatsächlich genau andersrum als C?
VHDL verarbeitet die Schleifen genau wie VHDL.

von Schnapphase (Gast)


Lesenswert?

> Nein, durch v'range nimmt die Funktion genau die Definition des Vektors und 
wandelt die von links beginnend in einen Integer um.

Hm aha - und dabei werden also auch führende Nullen gestrichen, zB wird 
aus 0000 0110 einfach eine 110? Egal wie breit das Signal eigentlich 
definiert ist?

Und zweite Frage - nur zum Verständnis - wie mache ich dann eine 
Schleife, bei der das rechte, als das LSB, zuerst abgearbeitet werden 
soll?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> dabei werden also auch führende Nullen gestrichen, zB wird
> aus 0000 0110 einfach eine 110?
Die werden eigentlich nicht gestrichen. Das Ignorieren führender 
Nullen ergibt sich einfach aus der Berechnung 0 * 0 = 0.
1
  :
2
  variable temp : integer := 0;    --<<< Defaultwert 0
3
begin
4
  for i in v'range loop
5
   temp := temp * 2;               --<<< 0 * 0 = 0
6
   :

> wie mache ich dann eine Schleife, bei der das rechte, als das LSB,
> zuerst abgearbeitet werden soll?
Ganz einfach: umgekehrt   ;-)
1
  :
2
  for i in v'reverse_range loop
3
   :

EDIT:
Zum Nachschlagen das hier
http://www.eda.org/rassp/vhdl/guidelines/vhdlqrc.pdf

von Schnapphase (Gast)


Lesenswert?

Vielen Dank für deine Hilfe!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.