mikrocontroller.net

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


Autor: Larry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Oli (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wieso will Modelsim nur 8 bit haben? MAcht keinen Sinn!

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Larry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Larry (Gast)
Datum:

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

Autor: Larry (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Poste einmal dein Programm, dann kann man Dir vielleicht besser helfen.

Autor: Klaus Falser (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.