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 ?
@ 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
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
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?
> 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
Ich probiere es, Danke. Leider habe ich zuvor nicht mit der numeric gearbeitet.
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.
Poste einmal dein Programm, dann kann man Dir vielleicht besser helfen.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.