4 signed-Zahlen addieren

Gast #417906
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".

?
Gast #417908
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
Gast #417910
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;
Gast #417912
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!

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