Frage bezüglich Zahlenumwandlung.

Gast #6049218
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
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
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
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

Eine eigene Frage? Dieser Thread ist über 6 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.