Forum: FPGA, VHDL & Co. Multiplizierer für zwei 3 Bit-Zahlen


von Maria S. (Firma: KIT) (slowargent29)


Lesenswert?

Multiplizierer für zwei 3 Bit-Zahlen

Anstatt der Addition aus Teil 1 soll nun eine Multiplikation ausgeführt 
werden. Im Fall einer Bereichsüberschreitung wird bei einem positiven 
Resultat die maximal mit Z darstellbare positive Zahl angezeigt. Ist das 
Resultat bei einer Bereichsüberschreitung negativ, so wird die minimal 
darstellbare negative Zahl angezeigt.


Unserer Vorüberlegung:
1
library ieee ;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
entity Multi is
5
port(
6
   A, B : in signed(2 downto 0); 
7
    Z : out signed(7 downto 0)
8
     
9
    );
10
end entity Multi;
11
architecture behavior of Multi is
12
  
13
      signal X : signed (3 downto 0);
14
    signal Y : signed (3 downto 0);
15
     signal z1 : signed (7 downto 0);
16
    
17
 begin
18
  X<=('0' & A);
19
  Y<=('0' & B);
20
  main :process( X, Y)
21
     begin
22
            
23
   z1 <=   X * Y;
24
    if  z1  > "00000111"  then 
25
           z1 <= "00001111" ;
26
       elsif  z1 < "11111000" then 
27
              z1 <= "00001000"  ;
28
   end if ; 
29
    z<=z1;
30
  end process main;
31
       
32
   
33
end behavior;



-> erbitten um geeigneten Lösungsvorschlag :)

: Bearbeitet durch Moderator
von Martin K. (mkmannheim) Benutzerseite


Lesenswert?

Da fehlt wohl noch ein ELSE für den Fall, dass der Bereich ok ist.

von Maria S. (Firma: KIT) (slowargent29)


Lesenswert?

mit Else sind wir nicht zum Erfolg bekommen. Erbitte genaueren 
Lösungsvorschlag.

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


Lesenswert?

Maria S. schrieb:
> -> erbitten um geeigneten Lösungsvorschlag :)
Was funktioniert mit dem geposteten Vorschlag nicht? Was erwartet ihr, 
was passiert stattdessen? Was sagt der Simulator? Wie lässt sich das 
erklären?

Martin K. schrieb:
> Da fehlt wohl noch ein ELSE für den Fall, dass der Bereich ok ist.
Das ist nicht das Problem, denn wenn alles ok ist, muss nach der 
Multiplikation eh' nichts mehr gemacht werden.

Das einfach Problem hier ist das Verhalten von Signalen in Prozessen. 
Das Signal z1 übernimmt das Ergebnis der Multiplikation nicht sofort, 
sondern erst am Ende des Prozesses. Für solche Berechnungen muss das 
Zwischenergebnis z1 eine Variable sein.

Alternativ würde es reichen, wenn z1 in die Sensitivliste aufgenommen 
wird, damit der Prozess nach Zuweisung eines neuen Wertes an z1 noch 
einmal durchlaufen wird.

Alternativ: die Aufgabe einfach ohne Prozess lösen. Und genau so würde 
ich das machen:
1
library ieee ;
2
use ieee.std_logic_1164.all;
3
use ieee.numeric_std.all;
4
entity Multi is
5
port(
6
   A, B : in signed(2 downto 0); 
7
    Z : out signed(7 downto 0)
8
     
9
    );
10
end entity Multi;
11
architecture behavior of Multi is
12
  
13
   signal X  : signed (3 downto 0);
14
   signal Y  : signed (3 downto 0);
15
   signal z1 : signed (7 downto 0);
16
    
17
begin
18
19
   X <= ('0' & A);
20
   Y <= ('0' & B);
21
         
22
   z1 <=   X * Y;
23
24
   z <= "00001111" when  z1 > "00000111"  else 
25
        "00001000" when  z1 < "11111000"  else
26
        z1;
27
   
28
end behavior;
Wozu für jeden Witz einen Prozess anfangen?

von Duke Scarring (Gast)


Lesenswert?

Maria S. schrieb:
>     if  z1  > "00000111"  then
>            z1 <= "00001111" ;
>        elsif  z1 < "11111000" then
>               z1 <= "00001000"  ;
>    end if ;

Da hier der Datentyp signed verwendet wird, kann man das lesbarer mit 
Integern hinschreiben:
1
  if  z1 > 7 then
2
    z1 <= to_signed( 15, z1'length);
3
  elsif  z1 < -8 then
4
    z1 <= to_signed(  8, z1'length);
5
  else
6
    z1 <= z1;   -- überflüssig, erhöht aber ebenfalls das Verständnis beim Lesen
7
  end if ;
Dann fällt eventuell auch auf, warum das nicht wie gewünscht 
funktioniert.

Der Tipp von Lothar erhöht m.E. ebenfalls die Lesbarkeit, wobei ich noch 
anzumerken hätte, das statt
> X <= ('0' & A);
> Y <= ('0' & B);
resize angebracht wäre, damit es auch mit negativen Zahlen stimmt:
1
  X <= resize( A, X'length);
2
  Y <= resize( B, Y'length);

Duke

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


Lesenswert?

Duke Scarring schrieb:
> Der Tipp von Lothar erhöht m.E. ebenfalls die Lesbarkeit, wobei ich noch
> anzumerken hätte, das statt
>> X <= ('0' & A);
>> Y <= ('0' & B);
> resize angebracht wäre, damit es auch mit negativen Zahlen stimmt:
Korrekt, denn sonst müsste man nicht hinterher den negativen Bereich 
abfragen, weil ja eh' nur positive Werte herauskommen können...

Wers unbedingt zu Fuß machen will, der kann auch einfach das MSB nochmal 
vorn anhängen:
1
  X <= A(2) & A;
2
  Y <= B(2) & B;

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.