Falsches Ergebnis bei Multiplikationen

Gast #4901222
Hallo Leute :)

ich habe ein Problem und zwar war es meine Idee, einen 3x3 Bit 
Multiplizierer zu entwerfen. Eigentlich ganz einfach, nur das mir beim 
Simulieren vor allem bei höheren Zahlen ein Schwachsinn rauskommt. 
Irgendwie "vergisst" mir der Simulator die "höheren" Bits auf ein '1' zu 
schalten. Im Anhang befindet sich ein Screenshot von der Simulation. Ich 
hoffe Ihr könntet mir da weiterhelfen.

Lg
1
library IEEE;
2
use IEEE.std_logic_1164.all;
3
use IEEE.numeric_std.all;
4

5
entity mult is 
6
  generic (BITS : natural := 2);
7
  port (a_i : in  signed(BITS downto 0);
8
      b_i : in  signed(BITS downto 0);
9
      q_o : out signed(5 downto 0));
10
end entity mult;
11

12
architecture rtl of mult is
13
begin
14
  q_o <= a_i * b_i;
15
end architecture rtl;
Angehängte Dateien:
Das passt schon, ist eben signed im Zweierkomplement. Wenn Du sowieso 
keine negativen Zahlen brauchst, dann solltest Du unsigned verwenden.

Ich verwende für die Ausgänge und Eingänge immer std_logic_vector und in 
der Komponente dann das was ich brauche also Integer, Unsigned oder 
Signed.
Gast
Verdammt, stimmt wie habe ich das nur vergessen können. Kann man den 
Thread irgendwie löschen, das ist mir zu peinlich :D

Spaß bei Seite, vielen Dank für die Antwort.

Lg
Moderator (Firma: Titel) Persönliche Seite
Johannes H. schrieb:
> Kann man den Thread irgendwie löschen, das ist mir zu peinlich :D
Lass mal. Es ist nichts so schlecht, dass es nicht noch als schlechtes 
Beispeil taugen könnte... ;-)

Z.B. ist deine Definition von BITS extrem irreführend (und du selber 
hast dann auch ein Problem damit). Denn tatsächlich haben die Vektoren 3 
Bits. Und mit dieser Zahl wirds dann gleich ganz einfach generisch:
1
  generic (BITS : natural := 3);
2
  port (a_i : in  unsigned(  BITS-1 downto 0);
3
        b_i : in  unsigned(  BITS-1 downto 0);
4
        q_o : out unsigned(2*BITS-1 downto 0));
Gast
Gustl B. schrieb:
> Ich verwende für die Ausgänge und Eingänge immer std_logic_vector und in
> der Komponente dann das was ich brauche also Integer, Unsigned oder
> Signed.
Kann man machen, hat dann aber u.U. den Spaß, daß man in jede Komponente 
erst reinschauen muß, ob der slv jetzt signed oder unsigned ist.
Bei Signalen, die das FPGA nicht verlassen, verwende ich gleich den 
richtigen Typ in der Portdefinition.

Duke
OK, ja stimmt, bei Generics verwende ich auch Integer/Natural. Irgendwo 
habe ich das her mit den slv an den Schnittstellen, vielleicht weil 
Xilinx das so macht? Aber stimmt, einen sinnvollen Grund gibt es da 
nicht.

Ich betrachte jede Komponente dann als abgeschlossen und dokumentiere 
für mich die Schnittstelle, da muss ich dann nicht mehr reingucken 
sondern direkt bei der Schnittstellendefinition steht da was das ist.

Hat das irgendwelche nachteile gleich Interger zu nehmen oder eben was 
anderes als slv? Weil dann mache ich das ab jetzt auch so ...

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 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.