Forum: FPGA, VHDL & Co. Unsigned zu Signed Fehlermeldungen in Modelsim


von Simon (Gast)


Lesenswert?

Hallo,
ich habe folgenden Code um meine Eingangssignale die in unsigned(5 
downto 1), also 0..63 vorliegen in den Wertebereich von signed -32..31 
zu verschieben:
1
signal din : unsigned(Width downto 0);
2
signal d_r : signed(Width downto 0);
3
signal dout : signed(Width downto 0);
4
5
d_r <= signed(din);
6
dout  <= d_r + 2**(Width-1);

Funktioniert auch so wie es soll, allerdings bekomme ich viele Warnungen 
in Modelsim dieser Art:

# ** Warning: NUMERIC_STD.TO_SIGNED: vector truncated
#    Time: 592 ns  Iteration: 0  Instance: /xxx

Wie kann ich das warnungsfrei schreiben?

gruß und danke schonmal,

Simon

von hjk (Gast)


Lesenswert?

Die Frage ist doch was passieren soll.

unsigned passt nunmal nicht in signed, er weiß nicht was er mit Zahlen > 
31 machen soll.

Wenns nur um 0..31 geht dürfte sowas funktionieren:

d_r <= '0' & signed(din(Width-1 downto 0));

von Thomas R. (Firma: abaxor engineering) (abaxor)


Lesenswert?

Die Warnung: NUMERIC_STD.TO_SIGNED: vector truncated kommt weil

2**(Width-1) ein Integer und damit 32 Bit lang ist. Das muss auf width 
Bit gekürzt werden.

Wenn du eine unsigned Konstante mit der Länge width anlegst, ist die 
Warnung weg.


Tom

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


Lesenswert?

Simon schrieb:
> meine Eingangssignale die in unsigned(5 downto 1), also 0..63
> vorliegen in den Wertebereich von signed -32..31 zu verschieben
Wie schon gefragt: was soll dann daraus werden?
Füll mal die rechte Spalte dieser Tabelle aus:
unsigned  | signed
----------+-------
  0       |   ?
  1       |   ?
 30       |
 31       |
 32       |
 62       |
 63       |

von Simon (Gast)


Lesenswert?

Lothar, hier ist die ausgefüllte Tabelle. Wie gesagt, es kommt das raus, 
was ich haben möchte. Nur die Warnungen stören mich.

Das hier teilweise Überläufe stattfinden ist mir klar und ist ja auch 
beabsichtigt. Geht es vielleicht eleganter (bei gleichem oder besserem 
Ressourcenverbrauch)?

unsigned  | signed
----------+-------
  0       | -32
  1       | -31
 30       | -2
 31       | -1
 32       | 0
 62       | 30
 63       | 31

Ich werde mal den Tipp mit 2**(Width-1) als unsigned Konstante 
ausprobieren.

Danke für eure Hilfe schonmal!

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


Lesenswert?

Simon schrieb:
> Geht es vielleicht eleganter
Du musst offenbar nur das vorderste Bit invertieren...

> Nur die Warnungen stören mich.
Ohne Warnungen sollte es gehen, wenn du den Umweg über std_logic machst. 
Etwa so:
1
dout <= signed( std_lgoc_vector( not din(WIDTH) & din(WIDTH-1 downto 0) ) );

von Simon (Gast)


Lesenswert?

Dass sich durch die Addition nur das höchste Bit invertiert hätte mir 
eigentlich auch auffallen können...

Danke Lothar, so werde ich es umsetzen.

Im ersten Post hätte es übrigens bei den Signaldeklarationen (Width-1 
downto 0) heißen müssen.

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.