Forum: FPGA, VHDL & Co. 4 signed-Zahlen addieren


von Mirco (Gast)


Lesenswert?

Ich mache gerade DA in einer Firma für Digital Design und habe ein
Problem mit VHDL:

Ich will 4 Zahlen addieren, komme aber nicht auf das Ergebnis:

result <= std_logic_vestor(signed(a)+ signed(b) + .... c + d);

Alle (a,b,c,d) haben 16 bit+signum, also (16 downto 0), doch das
Ergebnis ist angeblich auch nur 17 Bit, obwohl die Werte den vollen
Bereich überdecken!  Wenn ich "result" als 18 downto 0 deklariere,
geht es von der Synthese nicht. Bleibe ich bei 16..0 - dann läuft das
Ergebnis unter! Bei anderen Additionen hänge ich vor den ersten Term
immer eine Null davor, um die Conversion zu zwingen, ein Bit mehr zu
reservieren:

result <= std_logic_vestor(unsigned("00" & a)+ signed(b) + .... c +
d);

Hier geht das natürlich nicht, wegen "siged".

?

von T.M. (Gast)


Lesenswert?

Signed wird doch in VHDL als 2er-Komplement realisiert, was brauchst du
da ein "signum"?

von TobiFlex (Gast)


Lesenswert?

Hallo,
"Bei anderen Additionen hänge ich vor den ersten Term
immer eine Null davor,"

Wenn das signed sein soll expandierst du den term mit dem MSB.


.... <= (a(16)&a(16)&a(16 downto 0));

Dann erhälst du den gleichen vorzeichenbehafteten Wert nur eben mit ein
paar mehr Bits.

Viele Grüße
TobiFlex

von Mirco (Gast)


Lesenswert?

Danke. Auf den Trick mit dem MSB bin ich nicht gekommen. Ichhätte jetzt
zur Fallunterscheidung gegriffen

von Alexander Lindert (Gast)


Lesenswert?

Hallo,
dafür wärs ausnahmsweise geschickt, eine VARIABLE zu verwenden!
Variablen erzeugen bei jeden "Aufruf" in einem Process Hardware,
Signale werden überschrieben (Defaultzuweisungen vor/ für case).
Ausserhalb von processes sollte man niemals an mehreren Stellen auf ein
Signal schreiben, dass führt bei resolved types zu schwer findbaren
Fehlern und bei unresolved types zu compilerfehlern! (viel besser)
Ausnahmen sind FPGA PIN's die als in und out verwendet werden!

& fügt nur Arrays zusammen!
Sum(16 downto 0) <= '0' & A(7 downto 0) & B(7 downto 0);

Lösung so etwa (in einen Takt!!!!):

type x is array (natural range<>) of std_ulogic_vector(15 downto 0);
signal A : x (1 to 4);
signal Sum, NextSum : std_ulogic_vector(15 downto 0);
begin
process (rst, Clk) is
begin
if rst = '0' then
Sum <= to_signed(0,16);
elsif rising_edge(Clk) then
Sum <= NextSum;
end if;
end process;

process (A) is
variable vSum : std_ulogic_vector(Sum'range);
begin
for i in 1 to 4 loop
vSum := vSum + A(i);
end if;
NextSum <= vSum;
end process;

von Axel (Gast)


Lesenswert?

Also das wäre mir zu schlecht zu lesen und das würde ich in einem
Projektreview ablehnen. Ist zu fehlerträchtig.

Gruss
Axel

von Alexander Lindert (Gast)


Lesenswert?

type x is array (natural range<>) of signed(15 downto 0);
signal Sum, NextSum : signed(17 downto 0);
Sum <= to_signed(0,18);
variable vSum : signed(17 downto 0);
Drittletzte Zeile: end loop;

Tut mir leid, compiliert habe ich es nicht und werde ich auch nicht,
darum passieren mir diese Schlampigkeitsfehler. Ich bin aber davon
überzeugt, dass man nun die restlichen Fehler mit dem Compiler finden
und leicht eliminieren kann. Sogar die sign-extension müsste passen!
Wer Rechtschreibfehler findet, kann sie behalten!

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.