Frage bezüglich Zahlenumwandlung.

Gast #6049218
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.
#6049234
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.
#6049584
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.
Persönliche Seite #6049866
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.

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