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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Md M. (Firma: Potilatormanufaktur) (mdma)


Bewertung
0 lesenswert
nicht 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. (lkmiller) (Moderator) Benutzerseite


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht lesenswert
Hab ich mittlerweile so gemacht.

von Andreas F. (chefdesigner)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
-1 lesenswert
nicht lesenswert
Typkonvertierung im Port Mapping.

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [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 Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.