Problem mit Vektorbreite in VHDL

Gast #543148
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 ?
#543198
@ 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
Gast #543948
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
Gast #544055
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?
#544291
> 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
Gast #546486
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.
Gast #546496
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 19 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.