VHDL type conversion / Subtraktion

OP (Firma: Potilatormanufaktur) #5469173
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
Moderator (Firma: Titel) Persönliche Seite #5469185
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...
OP (Firma: Potilatormanufaktur) #5469267
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.
Gast #5493854
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren