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


von Gregor der Dritte (Gast)


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:
1
ergebnis24_temp <= (input * faktor + 128);
2
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:
1
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?

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

> ergebnis24_temp
> ergebnis16
Welchen Typ haben die?
Welche Libs verwendest du?

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

von Gregor der Dritte (Gast)


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:
1
use IEEE.std_logic_1164.all;
2
--use IEEE.std_logic_misc.all;
3
-- use IEEE.std_logic_arith.all;
4
-- use IEEE.std_logic_signed.all;
5
-- use IEEE.std_logic_signed.all;
6
use IEEE.numeric_std.all;
7
8
signal ergebnis : ergebnis24_temp (23 downto 0) := to_signed (0,24);

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


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.

von Gregor der Dritte (Gast)


Lesenswert?

Naja, ich habe es auskommentniert, damit klar ist, dass es NICHT benutzt 
wird.

von Harald (Gast)


Lesenswert?

Warum eigentlich INT und nicht REAL?

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.