Forum: FPGA, VHDL & Co. VHDL type conversion / Subtraktion


von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Hallo,

ich möchte zwei unsigned Werte subtrahieren, was im Ergebnis 
möglicherweise negativ wird, und das Ergebnis dann auch als signed 
weiterverwenden. Das mache ich bis jetzt so:
1
...
2
3
signal a : std_logic_vector (9 downto 0) := ("0000000000"); -- 0
4
signal b : std_logic_vector (9 downto 0) := ("1111111111"); -- 1023
5
signal y : std_logic_vector (10 downto 0);
6
7
...
8
9
y(9 downto 0) <= signed(unsigned(a) - unsigned(b));
10
11
process (y)
12
begin
13
  if(unsigned(a) < unsigned(b)) then    
14
    y(10) <= '1';
15
  else
16
    y(10) <= '0';
17
  end if;
18
end process;
19
20
...

Könnte mir bitte jemand erklären, wie man das richtig macht?

Dane und VG

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


Lesenswert?

Md M. schrieb:
> Könnte mir bitte jemand erklären, wie man das richtig macht?
Man nimmt passende Datentypen für die Vektoren, man macht ein resize, 
dann castet man die Vektoren entsprechend und rechnet einfach mit 
signed.

> process (y)
BTW: in diese Sensitivliste gehören a und b statt y, wenn es schon 
unbedingt ein Prozess sein muss...

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Aha, vielen Dank. Auf die Idee, den resize auf Minuend und Subtrahend 
anzuwenden statt auf das Ergebnis, bin ich nicht gekommen.

1
entity subtraktion is
2
end entity subtraktion;
3
4
library std;
5
use std.textio.all;
6
7
library ieee;
8
use ieee.std_logic_1164.all;
9
use ieee.std_logic_textio.all;
10
use ieee.numeric_std.all;
11
12
architecture test of subtraktion is
13
14
  signal a : std_logic_vector (9 downto 0) := ("0000000000"); -- 0
15
  signal b : std_logic_vector (9 downto 0) := ("1111111111"); -- 1023
16
  signal y : signed (10 downto 0);
17
18
begin
19
20
  y <= signed(resize(unsigned(a), y'length)) - signed(resize(unsigned(b), y'length));
21
22
  process (y)
23
    variable my_line : line;
24
  begin
25
    write(my_line, std_logic_vector(y));
26
    writeline(output, my_line);
27
  end process;
28
29
end architecture;
1
$ ghdl -a --ieee=synopsys subtraktion.vhdl && ghdl -r --ieee=synopsys subtraktion
2
UUUUUUUUUUU
3
10000000001

>> process (y)
> BTW: in diese Sensitivliste gehören a und b statt y, wenn es schon
> unbedingt ein Prozess sein muss...

Da hatte das Synthese-tool auch schon gewarnt, hatte aber andere Sorgen, 
zumal es trotzdem funktioniert hat. Ohnehin: Nein, sollte nicht 
unbedingt ein Prozess sein.

: Bearbeitet durch User
von Markus F. (mfro)


Lesenswert?

Wenn Du sowieso vorzeichenbehaftet rechnen willst: warum definierst Du 
die Signale nicht gleich als signed und sparst dir die Typkonvertierung?

Dann sieht jeder, der deinen Code liest gleich, was Du da treibst.

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Hab ich mittlerweile so gemacht.

von A. F. (chefdesigner)


Lesenswert?

Wie macht man das bei gemischtem Code? Unser Codegenerator produziert 
VHDL mit Datentypen in Standard Logic. Könnte man sowas umschreiben 
lassen? Kennt da jemand tools?

Bisher mache ich einen Wrapper drum herum.

Die anderen schreiben ähnlich wie der TE mit Vektoren weiter.

von Md M. (Firma: Potilatormanufaktur) (mdma)


Lesenswert?

Andi F. schrieb:
> Wie macht man das bei gemischtem Code?

An den Schnittstellen casten?
http://www.lothar-miller.de/s9y/uploads/Bilder/Usage_of_numeric_std.pdf

von Markus F. (mfro)


Lesenswert?

Typkonvertierung im Port Mapping.

Das ist gleichzeitig auch so ungefähr das einzige, was man dort tun 
darf.

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.