mikrocontroller.net

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


Announcement: there is an English version of this forum on EmbDev.net. Posts you create there will be displayed on Mikrocontroller.net and EmbDev.net.
von Spaex (Gast)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Max K. schrieb:
> im Zweierkompliment einlesen

Oh Mann, es heisst wirklich

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

von Max K. (spaex)


Bewertung
0 lesenswert
nicht lesenswert
Sorry mein Fehler.

von Markus F. (mfro)


Bewertung
0 lesenswert
nicht lesenswert
Max K. schrieb:
> if Produkt > '7'
> -- Syntaxfehler 1

Da hat er recht. Da fehlt doch was?

von Max K. (spaex)


Bewertung
0 lesenswert
nicht 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)


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

von Jürgen S. (engineer) Benutzerseite


Bewertung
0 lesenswert
nicht 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)


Bewertung
1 lesenswert
nicht lesenswert
Dankeschön funktioniert jetzt alles einwandfrei.

Vielen Dank für eure Hilfe:)

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.