Forum: FPGA, VHDL & Co. Addition, Subtraktion mit unsigned


von Ben C. (bencharmin)


Lesenswert?

Hallo. Ich arbeite mit Quartus 2 mit einem Cyclone IV.

Ich habe jetzt zwei Zahlen im Format Unsigned, die ich addieren oder 
subtrahieren möchte.

Die Bitbreite beträgt je 16 Bit. 2^15 ist gerade die Mitte und gleich 
die Null.

Zahl1: +84 --> 2^15 + 84 = 32852 = 1000000001010100
Zahl2: -18 --> 2^15 - 18 = 32750 = 0111111111101110

Eigentlich erwarte ich jetzt dass es 84+(-18) rechnet und dann
66 = 32834 = 1000000001000010

Es kommt aber 65470 raus.
Die std_logic_vectoren lass ich mir dann am Rechner anzeigen.




Möchte ich diese jetzt addieren habe ich hier folgenden Code:
1
LIBRARY ieee ;
2
USE IEEE.std_logic_1164.all;
3
USE ieee.numeric_std.all;
4
5
ENTITY testblock IS
6
  PORT 
7
  (
8
  clk    : in std_logic;
9
  data_in_1   : in std_logic_vector(15 downto 0);
10
  data_in_2   : in std_logic_vector(15 downto 0);
11
  data_out_1  : out std_logic_vector(15 downto 0)
12
    );
13
END testblock;
14
15
ARCHITECTURE Verhalten OF testblock IS
16
  signal x : unsigned (15 downto 0);
17
BEGIN
18
  p: PROCESS (clk)
19
    BEGIN
20
      IF rising_edge(clk) THEN
21
      x <= unsigned(data_in_1) + unsigned(data_in_2);
22
      data_out_1 <= std_logic_vector(x);
23
      
24
      END IF;
25
  END PROCESS ;
26
END Verhalten ;

: Bearbeitet durch Moderator
von Lattice User (Gast)


Lesenswert?

Ben Charmin schrieb:
>
> Ich habe jetzt zwei Zahlen im Format Unsigned, die ich addieren oder
> subtrahieren möchte.
>
> Die Bitbreite beträgt je 16 Bit. 2^15 ist gerade die Mitte und gleich
> die Null.
>
Das ist nicht unsigned, sondern signed in Offsetcodierung. Im 
Gegensatz zur 2er Komplementcodierung ist das nicht einfach per cast als 
unsigned addieren bzw subtrahieheren.

Hint: MSB des Ergebnisses invertieren, dann stimmt es wieder.

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


Lesenswert?

Bitte die [ vhdl ] und [ /vhdl ] Tags ohne die Leerzeichen um den VHDL 
Code platzieren. Das ist gut fürs Syntax-Highlighting.

von Michael W. (Gast)


Lesenswert?

Lattice User schrieb:
> Das ist nicht unsigned, sondern signed in Offsetcodierung.
Müsste da nicht dasselbe rauskommen, wenn man schlichtweg "-" schreibt? 
Packt das der Compiler nicht?

von Bitflüsterer (Gast)


Lesenswert?

Es gibt genau eine interpretative und operationale Deutung von 
unsigned (im Zshg. mit ieee.numeric_std). Der Compiler kann ja nicht 
wissen, dass Du ieee.numeric_std schreibst, aber biased signed "denkst". 
Es ist also nicht sein Fehler.
Wie fast immer sitzt das Problem vor dem Monitor. :-)

von Bitflüsterer (Gast)


Lesenswert?

Du hast aber durchaus die Möglichkeit einen eigenen Typ zu definieren 
und die entsprechenden Operationen darauf. Dann weiss der Compiler was 
Du meinst.

von Ben C. (bencharmin)


Lesenswert?

ok danke. habe es jetzt so gemacht, dass ich das MSB invertiert habe. 
Jetzt passts.

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.