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.
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
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).
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
Max K. schrieb: > im Zweierkompliment einlesen Oh Mann, es heisst wirklich Zweierkomplement, nicht Zweierkompliment. -----------^---- -----------------^----
Markus F. schrieb: > Max K. schrieb: >> if Produkt > '7' >> -- Syntaxfehler 1 > > Da hat er recht. Da fehlt doch was? if Produkt > '7' then So?
- Ein Integer gehört nicht in Hochkommata. - Die Funktion to_signed() erwartet 2 Parameter.
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.