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". ?
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
Danke. Auf den Trick mit dem MSB bin ich nicht gekommen. Ichhätte jetzt zur Fallunterscheidung gegriffen
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;
Also das wäre mir zu schlecht zu lesen und das würde ich in einem Projektreview ablehnen. Ist zu fehlerträchtig. Gruss Axel
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.