Adder/Subtracter Map Problem

OP (Firma: Personal) #2318092
Lesenswert?

Hallo :),

ich habe den Folgenden Code geschrieben, für einen Adder und Subtracter 
für Unsigned und Signed Werten zusammen. Den Code wollte ich auf mein 
Spartan 3AN Starter Kit anwenden:
1
--------------------------------------------------
2

3
library IEEE;
4
use IEEE.STD_LOGIC_1164.ALL;
5
use IEEE.NUMERIC_STD.ALL;
6

7
entity AdderSubtracter is
8
   Generic ( N : Natural := 2);
9
    Port ( a : in  STD_LOGIC_VECTOR(N downto 0);
10
           b : in  STD_LOGIC_VECTOR(N downto 0);
11
           sel : in  STD_LOGIC_VECTOR(1 downto 0);
12
           y : out  STD_LOGIC_VECTOR(N downto 0));
13
end AdderSubtracter;
14

15
architecture Behavioral of AdderSubtracter is
16

17
begin
18
  y <= STD_LOGIC_VECTOR(UNSIGNED(a)+UNSIGNED(b)) when sel = "00" else
19
      STD_LOGIC_VECTOR(SIGNED(a)+SIGNED(b))     when sel = "01" else
20
      STD_LOGIC_VECTOR(UNSIGNED(a)-UNSIGNED(b)) when sel = "10" else
21
      STD_LOGIC_VECTOR(SIGNED(a)-SIGNED(b))     when sel = "11" else
22
      (others => '0');
23
      
24

25
end Behavioral;
26

27
-----------------------------------------------

Die Constaints Datei sieht so aus:
1
###############################################
2

3
NET "a[0]" LOC = V8;
4
NET "a[1]" LOC = U10;
5
NET "b[0]" LOC = U8;
6
NET "b[1]" LOC = T9;
7
NET "y[0]" LOC = R20;
8
NET "y[1]" LOC = T19;
9
NET "y[2]" LOC = U20;
10

11
NET "sel[0]" LOC = T15 | IOSTANDARD = LVCMOS33 | PULLDOWN;
12
NET "sel[1]" LOC = T14 | IOSTANDARD = LVCMOS33 | PULLDOWN;
13

14
###############################################
Das Synthesiswerkzeug gibt aber eine Warnung bei dem Prozess "Map", mit 
dem Folgenden Log:

WARNING:PhysDesignRules:367 - The signal <sel<0>_IBUF> is incomplete. 
The signal
   does not drive any load pins in the design.

Ich habe ein Paar codes geschrieben mit der selben Methode und habe 
keine Probleme bekommen.

Könnt ihr bitte mir erklären warum ich diese Warnung bekomme?

Danke sehr :)
Moderator (Firma: Titel) Persönliche Seite #2318170
Lesenswert?

Weil die Ergebnisse von
 STD_LOGIC_VECTOR(UNSIGNED(a)+UNSIGNED(b)) when sel = "00" else
und
 STD_LOGIC_VECTOR(SIGNED(a)+SIGNED(b))     when sel = "01" else
in der Hardware absolut identisch sind, wird das Bit 0 hier nicht 
gebraucht.

Das selbe gilt für
      STD_LOGIC_VECTOR(UNSIGNED(a)-UNSIGNED(b)) when sel = "10" else
und
      STD_LOGIC_VECTOR(SIGNED(a)-SIGNED(b))     when sel = "11" else
Beide Zeilen ergeben die exakt gleiche Hardware, deshalb wird das Bit 
0 nicht benötigt.

Das teilt dir die Synthese mit:
> The signal <sel<0>_IBUF> ...
>  ...  does not drive any load pins in the design.
(Firma: Leckermittag.de) #2318195
Lesenswert?

Noch kurz zur Erklärung: Der Grund dahinter ist, dass das Ergebnis (N+1) 
Bits breit ist, genau wie die beiden Inputs. Das Ergebnis einer 
korrekten Addition müsste mindestens (N+2) Bits breit sein, um den 
Überlauf zu fassen, und nur der Überlauf unterscheidet sich bei signed 
vs. unsigned.

Dasselbe gilt auch für die Subtraktion.

(Klugscheißermodus: Dasselbe gilt übrigens auch für die Multiplikation, 
auch wenn es weniger bekannt ist. Bei der Division ist das IIRC anders.)
OP (Firma: Personal) #2318210
Lesenswert?

Vielen Danke für die Antwort :),

das ist aber ein bißchen komisch. Was ist denn der Unterschied zwischen 
Signed und Unsigned?

Im Buch, davon ich VHDL lerne (Curcuit Design with VHDL, 2004), gibt es 
eine Übung für einen Signed/Unsigned Adder/Subtractor. Wie könnte man 
sowas bauen wenn die Operator die gleichen Effekte auf Signed und 
Unsigned haben?
Moderator (Firma: Titel) Persönliche Seite #2318261
Lesenswert?

Samer Afach schrieb:
> Was ist denn der Unterschied zwischen Signed und Unsigned?
Es gibt keinen. Lediglich die Operanden und das Ergebins wird anders 
interpretiert. Bei 3 Bit:
binär  signed  unsinged
111    -1       7
110    -2       6
101    -3       5
100    -4       4
011     3       3
010     2       2
001     1       1
000     0       0
111    -1       7
110    -2       6
101    -3       5
100    -4       4


Und jetzt rechne einfach mal unsinged 2+3
2  = 010
3  = 011
2+3= 101 = 5 ok

Und jetzt mal unsigned 5+4
5   =  101
4   =  100
4+5 = 1001  = 9
9 passt aber nicht mehr in 3 Bit, deshalb ist hier
das Ergebnis dann 001 = 1 und ein Überlauf.


Und jetzt rechne mal signed 2+3
2  = 010
3  = 011
2+3= 101 = -1  hoppla

Obwohl der Rechenweg sowohl signed wie auch unsigned exakt gleich ist, 
und auf Bitebene das selbe herauskommt, kommt ein anderes Ergebnis 
heraus, weil die Interpretation anders ist.

Wie du ein Ergebnis interpretierst, interessiert den Synthesizer nicht 
die Bohne und deshalb sagt er dir:
Eine Addition ist eine Addition, egal ob signed oder unsigned.
Eine Subtraktion ist eine Subtraktion, egal ob signed oder unsigned.

Lattice User schrieb:
> Das Erkennen des Overflows unterscheidet sich.
Kurz: die Interpretation des Ergebnisses ist unterschiedlich.

Samer Afach schrieb:
> Im Buch, davon ich VHDL lerne (Curcuit Design with VHDL, 2004), gibt es
> eine Übung für einen Signed/Unsigned Adder/Subtractor.
Schmeiß das Buch weg.
OP (Firma: Personal) #2318297
Lesenswert?

Vielen Dank für die Antwort und für die Erklärung!

und... HAHAHAHAHAHA! ich mag was du gesagt hast "Schmeiß das Buch weg" 
:P.

Dieses Buch habe ich Online gefunden, und habe ich kostenlos 
heruntergeladen. Es wurde nicht gescannt, sondern sehr gut geschrieben. 
Man kann dadurch sehr einfach suchen und Information finden.

Ich will nicht ein Buch kaufen, bis ich sicher bin, dass es das richtige 
Buch ist. Könnt ihr bitte mir ein Paar Bücher empfehlen?
Was sind die besten Bücher der Welt für VHDL?

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