Forum: FPGA, VHDL & Co. Frage bezüglich Zahlenumwandlung.


von Spaex (Gast)


Lesenswert?

Hay,

Ich verzweifel grad an einer Aufgabe mit VHDL in Lattice Diamond.
Und zwar möchte ich einen Addierer realisieren der zwei 3 Bit große 
Zweierkompliment zahlen miteinander addiert und das Ergebniss als 4 Bit 
Zweierkompliment ausgibt.

Von der Grundüberlegung hab ich mir folgendes gedacht: Der Wertebereich 
für das Ergebniss liegt zwischen -8 und 6.

Da ich keinen Plan hatte wie ich VHDL sag er soll mir zwei 
std_logic_vector im Zweierkompliment miteinander addieren hab ich die 
zwei Zweierkomplimente in Dezimalzahlen umgerechnet und das Ergebniss 
wird nun auch richtig berechnet. Jedoch scheitere ich grad an der 
Ausgabe meines Ergebniss durch eine Umwandlung mittels numeric_std in 
das Zweierkompliment

Sprich mein Zwischenergebniss ist:   zerg := Zahl1 + Zahl2;
Und mein Ergebniss möchte ich ausgeben mittels:
  E <= std_logic_vector(to_signed(0-unsigned(zerg)),4);
im Zweierkompliment.

Jetzt krieg ich aber folgende zwei Errors:
  ERROR - Addierer.vhd(54,50-54,51) (VHDL-1154) near std_logic_vector ; 
type conversion expects one single argument
  ERROR - Addierer.vhd(12,1-58,27) (VHDL-1284) unit behavior ignored due 
to previous errors

Beide müssen an der Zeile:   E <= 
std_logic_vector(to_signed(0-unsigned(zerg)),4);
Liegen da ohne diese keine Errors entstehen.
Kann mir da wer sagen was ich falsch mach?
Die Zeile soll ja eine Integer Variable im Zweierkompliment ausgeben.

von Samuel C. (neoexacun)


Lesenswert?

Zuviel Gedanken gemacht. Im Zweierkomplement kannst du ganz normal 
addieren. Erweitere die Vektoren einfach um eine Stelle und addiere sie.

Ob das jetzt vorzeichenlose oder vorzeichenbehaftete (im 
Zweierkomplement) Zahlen sind, macht dafür keinen Unterschied. Nur wenn 
du Überläufe erkennen willst, musst du das unterschiedlich tun.

: Bearbeitet durch User
von S. R. (svenska)


Lesenswert?

Die Eingangsvektoren musst du natürlich vorzeichenbehaftet erweitern, 
d.h. du verdoppelst das höherwertigste Bit. Der Rest ist eine ganz 
normale binäre Addition (deswegen nutzt man ja das Zweiterkomplement).

von Max K. (spaex)


Lesenswert?

Vielen Dank habs jetzt hinbekommen dank eurer Hilfe. Jedoch schon wieder 
ein Problem:


architecture Multiplizierer of Test is
begin
  main:process (A3, B3) is
  variable a: signed(2 downto 0);
  variable b: signed(2 downto 0);
  variable Produkt: integer;

  begin
    a := signed(A3);
    b := signed(B3);

    Produkt := to_integer(a) * to_integer(b);
    if Produkt > '7'
    Z <= std_logic_vector(to_signed(7)); -- Syntaxfehler 1
    elsif Produkt < '-8'                 -- Syntaxfehler 2
    Z <= std_logic_vector(to_signed(-8));
    else                                 -- Syntaxfehler 3
    Z <= std_logic_vector(to_signed(Produkt));
    end if;

  end process main;
end architecture Multiplizierer;

(Z ist weiter oben im Programm was alles problemlos funktioniert 
geregelt.)

Das Programm soll 2 Zahlen mit je 3 Bit im Zweierkompliment einlesen und 
Multiplizieren (funktioniert soweit auch). Jetzt soll jedoch noch das 
extra eingebaut werden da meine Ausgabe in 4 Bit erfolgt das wenn die 
Zahl größer 7 ist immer 7 angegeben wird und wenn die Zahl kleiner als 
-8 wird soll immer -8 angezeigt werden.

Jedoch sagt mir Lattice Diamond dass ich an Z (Zeile Syntaxfehler 1), 
elsif(Syntaxfehler 2) und bei else (syntaxfehler 3) einen Syntaxfehler 
habe den ich grad nicht finde. Wenn ich die If Abfragen entferne 
funktioniert das gesamte Programm einwandfrei.

: Bearbeitet durch User
von OMG (Gast)


Lesenswert?

Max K. schrieb:
> im Zweierkompliment einlesen

Oh Mann, es heisst wirklich

Zweierkomplement, nicht Zweierkompliment.
-----------^----  -----------------^----

von Max K. (spaex)


Lesenswert?

Sorry mein Fehler.

von Markus F. (mfro)


Lesenswert?

Max K. schrieb:
> if Produkt > '7'
> -- Syntaxfehler 1

Da hat er recht. Da fehlt doch was?

von Max K. (spaex)


Lesenswert?

Markus F. schrieb:
> Max K. schrieb:
>> if Produkt > '7'
>> -- Syntaxfehler 1
>
> Da hat er recht. Da fehlt doch was?

if Produkt > '7' then

So?

von Samuel C. (neoexacun)


Lesenswert?

- Ein Integer gehört nicht in Hochkommata.
- Die Funktion to_signed() erwartet 2 Parameter.

von J. S. (engineer) Benutzerseite


Lesenswert?

Der Code hat noch andere Probleme. Wieso wird vom Produkt gesprochen, 
das Ergebnis aber auf -8 getestet? Hört sich eher nach der Summe zweier 
-4 an. An der Stelle juckt es mich wieder in den Fingern darauf 
hinzuweisen, bei Multiplikationen den Zahlenraum generell auf n und -n 
einzuschränken, also hier auf -7 und +7. Damit fallen bei 
Multiplikationen 1 Bits im Endvektor weg, hier +/-49 (6 Bit) statt 
+56/-64 (7 Bit), Beim Quadrieren sind es sogar 2 Bits.

von Max K. (spaex)


Lesenswert?

Dankeschön funktioniert jetzt alles einwandfrei.

Vielen Dank für eure Hilfe:)

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.