www.mikrocontroller.net

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


Autor: Mirco (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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".

?

Autor: T.M. (Gast)
Datum:

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

Autor: TobiFlex (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Mirco (Gast)
Datum:

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

Autor: Alexander Lindert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Axel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Alexander Lindert (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.