Forum: FPGA, VHDL & Co. Problem mit Vektorbreite in VHDL


von Larry (Gast)


Lesenswert?

Ich möchte folgendes Berechnen:

result_temp <= std_logic_vector(512 + unsigned(phase) * 160);

später dann result_temp herunterschneiden.

phase hat nur vier bit (3 downto 0)

Damit hätte ich erwartet, daß das REsultat minestens mal 10 Bit breit 
ist. Komischerweise bemängelt Modelsim, die Bitbreite des tempvektors 
und will ihn auf 7 downto 0 haben!

Wie ist das zu verstehen ?

von Falk B. (falk)


Lesenswert?

@ Larry

>result_temp <= std_logic_vector(512 + unsigned(phase) * 160);

Das Ergbnis muss mind. 12 Bit haben.

>später dann result_temp herunterschneiden.

???
herunterschneiden? Du meinst wohl eher die unteren Bits abschneiden?

>phase hat nur vier bit (3 downto 0)

Eben, die Zhal 160 ist eine 8 Bit Zahl, macht im Produkt 12 Bit. Die 
+512 sind da auch mit drin.

MFG
Falk

von Oli (Gast)


Lesenswert?

Wieso will Modelsim nur 8 bit haben? MAcht keinen Sinn!

von Klaus Falser (Gast)


Lesenswert?

Eigentlich sollte das Ergebnis nur 4 Bit haben, es werden die Funktionen 
aus numeric_std verwendet.

unsigned(phase) -> 4 bit

multiplikation unsigned(4 bit) mit natural(160) -> ergibt unsigned(4 
bit)

addition natural(512) mit unsigned(4 bit)  -> ergibt unsigned(4 bit)

cast auf std_logic_vector -> 4 bit

Grüße
Klaus

von Larry (Gast)


Lesenswert?

Richtig - es wird numeric lib bneutzt, aber woher weisst Du das?

Egaal - ich verstehe das so oder so nicht. Ich habe sonst eigentlich 
immer den Fall, daß mir Modelsim immer die Vektorbreite angibt: Wenn ich 
z.B. einen 7-Bit-Vektor mit einem 4-Bit-Vektor multipliziere, meckert er 
solange, bis ich den temp-vektor auf die gültige Breite stelle.

Wieso sollen das nun weniger sein? Wenn ich mit 512 multipliziere, 
kommen doch mindestens 9 Bit raus!

Jetzt mal anders gefragt: Wie muss ich das formulieren, daß es stimmt 
und ich keine Bits verliere?

Muss ich Nullen voranstellen?

Ich habe nun mal einfach 12 Nullen avor gemacht und erhalte: Length 
expected = 16, actual = 32. Das ist mir schleierhaft, warum.

Wer kann mir das erklären?

von Klaus F. (kfalser)


Lesenswert?

> Richtig - es wird numeric lib bneutzt, aber woher weisst Du das?

Weil es die von Dir verwendeten Funktionen nur im numeric_std package 
gibt.

> Wieso sollen das nun weniger sein? Wenn ich mit 512 multipliziere,
> kommen doch mindestens 9 Bit raus!

Die Funktion "*" im package numeric_std zwischen einer natürlichen Zahl 
A (das ist eine Zahl größer 0) und unsigned B ergibt ein Ergebnis mit 
der Länge der unsigned Zahl B!! Die Funktion (oder der Compiler) schaut 
nicht nach, wie groß die Zahl A ist.
Wenn Du eine bestimmte Länge brauchst, muß Du vorher auf die Läge 
konvertieren.

std_logic_vector(to_unsigned(512,12) + unsigned(phase) * 
to_unsigned(160, 12));

Das ergibt einen 12 Bit langen Vektor.

Klaus

von Larry (Gast)


Lesenswert?

Ich probiere es, Danke. Leider habe ich zuvor nicht mit der numeric 
gearbeitet.

von Larry (Gast)


Lesenswert?

So, nach der obigen Methode will er einen 16Bit Vektor haben und nicht 
12. Allerdings ist mir das auch wieder etwas logischer, da die 160 als 
X-Bit-Vektro mindestens mal 7 wären (128++) und der andere Faktor mit 9 
Bit ankommen. Das wäre dann 16. Ich frage mich nur, warum er das nich 
tvon alleine sieht.

von Klaus Falser (Gast)


Lesenswert?

Poste einmal dein Programm, dann kann man Dir vielleicht besser helfen.

von Klaus Falser (Gast)


Lesenswert?

Mein Fehler.

Nun hat man eine Multiplikation zwischen 2 unsigned Zahlen. Das Ergebnis 
ist dabei wieder unsigned und die Länge ist die Summe der Längen (4 + 12 
= 16).

Folgendes sollte richtig sein:

std_logic_vector(to_unsigned(512,12) + unsigned(phase) *
to_unsigned(160, 8));


Klaus

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.