www.mikrocontroller.net

Forum: FPGA, VHDL & Co. signed division in VHDL


Autor: Gregor der Dritte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich multipliziere zwei signed Zahlen (16 Bit) und (8Bit) in einen 
24Bit-Vektor, was offenbar funktioniert und im ModelSIM auch korrekt 
angezeigt wird. Da ich mit 16 Bit weiterrechnen muss, möchte ich runden 
und teilen.

Daher habe ich folgendes:
ergebnis24_temp <= (input * faktor + 128);
ergebnis16 <= ergebnis24_temp (23 downto 8);

Die "23" werden angemeckert, weil sie angeblich nicht dem signed Typ 
entsprechen.

# ** Fatal: (vsim-3471) Slice range (23 downto 8) does not belong to the 
prefix index range (15 downto 0).

Zuvor hatte ich probiert:
ergebnis16 <= ergebnis24_temp / 256;

Dann war ihm aber das Ergebnis zu gross. Er will - trotzdem nie mehr als 
16 bit rauskommen können - auf einen 24Bit-Vector schreiben.

Wie mache ich das am Besten?
Erst alles wieder nach std_logic_vector und dann cutten?

Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ergebnis24_temp
> ergebnis16
Welchen Typ haben die?
Welche Libs verwendest du?

Zeig doch mal mehr vom Code... :-/

Autor: Gregor der Dritte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem gelöst! Ich hatte nur einen Kopierfehler und bezog mich auf das 
falsche Signal, das zu cutten war. So, wie es oben ist, geht es nämlich 
sehr wohl.

Ich verwende die Definitionenen:
use IEEE.std_logic_1164.all;
--use IEEE.std_logic_misc.all;
-- use IEEE.std_logic_arith.all;
-- use IEEE.std_logic_signed.all;
-- use IEEE.std_logic_signed.all;
use IEEE.numeric_std.all;

signal ergebnis : ergebnis24_temp (23 downto 0) := to_signed (0,24);  


Autor: Lothar Miller (lkmiller) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Gregor der Dritte schrieb:
> Ich verwende die Definitionenen: ...
Donnerwetter, da hast aber schon alles Mögliche probiert  ;-)
Als Tipp: bleib bei der numeric_std.

Autor: Gregor der Dritte (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Naja, ich habe es auskommentniert, damit klar ist, dass es NICHT benutzt 
wird.

Autor: Harald (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Warum eigentlich INT und nicht REAL?

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.