Forum: FPGA, VHDL & Co. Falsches Ergebnis bei Multiplikationen


von Johannes H. (Gast)


Angehängte Dateien:

Lesenswert?

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;

von Gustl B. (-gb-)


Lesenswert?

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.

: Bearbeitet durch User
von Johannes H. (Gast)


Lesenswert?

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

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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));

von Duke Scarring (Gast)


Lesenswert?

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

von Gustl B. (-gb-)


Lesenswert?

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 ...

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Gustl B. schrieb:
> Hat das irgendwelche nachteile gleich Interger zu nehmen oder eben was
> anderes als slv?
Beim Integer musst du im Auge behalten, wie breit der sein soll. Sonst 
textet dich die Toolchain evtl. wegen synthetisierten, aber letztlich 
nicht verwendeten Signalen zu...

von Gustl B. (-gb-)


Lesenswert?

Das ist mir bekannt. Gut dann ab jetzt unsigned oder signed ... Vielen 
Dank!

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
Noch kein Account? Hier anmelden.