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

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.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.