Forum: FPGA, VHDL & Co. Adder/Subtracter Map Problem


von Samer A. (Firma: Personal) (thedestroyer)


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 :)

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


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.

von Martin G. (Firma: Leckermittag.de) (morin)


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.)

von Samer A. (Firma: Personal) (thedestroyer)


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?

von Lattice User (Gast)


Lesenswert?

Samer Afach schrieb:
> das ist aber ein bißchen komisch. Was ist denn der Unterschied zwischen
> Signed und Unsigned?

Das Erkennen des Overflows unterscheidet sich.

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


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.

von Samer A. (Firma: Personal) (thedestroyer)


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?

von Duke Scarring (Gast)


Lesenswert?

Samer Afach schrieb:
> Was sind die besten Bücher der Welt für VHDL?
Da gibt es leider (noch) keine. Bisher hat jedes seine Macken...

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


Lesenswert?

Samer Afach schrieb:
> Was sind die besten Bücher der Welt für VHDL?
Kauf dir auch den
Ashenden: Designers Guide to VHDL

von Samer A. (Firma: Personal) (thedestroyer)


Lesenswert?

Ahhh!! Vielen Dank man! ich hab das Buch online gefunden!

The Designer's Guide to VHDL - Third Edition.

Ich werde es probieren, wenn ich es mag, kaufe ich es! :)

Danke sehr!! :D

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.