Forum: FPGA, VHDL & Co. 4Bit Multiplikator aus 2 3Bit Zahlen


von tim_boc (Gast)


Lesenswert?

Hallo,
im Studium haben wir seit kurzem die VHDL-Programmiersprache (auf 
Testboards mit Lattice Mach xo2) und die aufgabe lautet:

"Die 3 Bit-Zahlen A und B werden im Zweierkomplement dargestellt. A 
besteht aus den Bits A2-A0, B besteht aus den Bits B2-B0. Das Resultat 
der Multiplikation ist die 4 Bit-Zahl Z, die ebenfalls im 
Zweierkomplement dargestellt wird. Z besteht aus den Bits Z3-Z0. 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."

Nun habe ich folgendes Programm geschrieben:
1
library ieee;
2
use ieee.std_logic_1164.all;
3
use IEEE.std_logic_signed.all;
4
use ieee.numeric_std.all;
5
6
-- Multiplikation mit positiven und negativen Zahlen
7
entity lab2_3_mul is 
8
port(  A, B : in signed(2 DOWNTO 0);
9
Z : out signed(3 DOWNTO 0)  );
10
end lab2_3_mul;
11
12
architecture behavior of lab2_3_mul is
13
signal t: integer(-16 TO 9);  
14
15
begin
16
  
17
main: process(A, B)
18
begin
19
20
  t <= resize(A * B, 5);  -- Zwischenergebnis
21
  
22
  ueberlauf:  if (t > "00111") then  -- wenn groesser als 7
23
          Z <= "0111";    -- ergebnis = 7
24
        elsif (t < "11000") then   -- wenn kleiner als -8
25
          Z <= "1000";      -- ergebnis = -8
26
        else  
27
          Z <= resize(A * B, 4);  
28
        end if ueberlauf;
29
  
30
end process main;
31
end behavior;

Bei berechnungen ohne überlauf passt auch alles, nur leider bekomme ich 
die If-Bedingung mit dem zwischenergebnis t nicht hin. Habe zwar schon 
vieles durchsucht, aber alles bezieht sich Multiplikationen ohne 
Überlauf.
Vielleicht kann mir ja jemand einen einfachen tipp geben.

mfg
Tim

von Power Ingenieur (Gast)


Lesenswert?

Warum rechnest Du nicht einfach das volle Ergebnis und limitierst den 
Überlauf weg?

Warum gibt es überhaupt einen Überlauf?
Wenn ich 3bitter multipliziere, komme ich auf einen 6 Bit Vektor.

-8 x -8 = 64

Mit welcher Begründung soll das nicht rauskommen dürfen?

von berndl (Gast)


Lesenswert?

Power Ingenieur schrieb:
> Warum gibt es überhaupt einen Überlauf?
> Wenn ich 3bitter multipliziere, komme ich auf einen 6 Bit Vektor.
>
> -8 x -8 = 64
>
> Mit welcher Begründung soll das nicht rauskommen dürfen?

vlt. weil 3bit signed 'minimal' -4 sind? Und
-4 x -4 = +16
Macht also 5bit im Ergebnis...

@tim_boc: Warum um Himmels Willen verwendest du da als Ergebnis einen 
Integer? Nimm doch einfach einen signed (5:0) (wegen 2x3bit 
Eingangssignalen), schau nach ob du +16/-12 als Ober/Untergrenze 
verletzt und 'clippe' dann.

PS: Und was soll die IEEE.std_logic_signed in deinem Code?

von tim_boc (Gast)


Lesenswert?

also die deklaration von "t" hab ich jetzt geändert in

signal t: signed(4 DOWNTO 0);

in der simulation funktioniert es leider noch nicht.
das prinzip der if abfrage möchte ich so beibehalten, was muss ich in 
den bedingungen ändern? und was bedeutet clippen?    (1. Semester)

mfg
Tim

von Power Ingenieur (Gast)


Lesenswert?

berndl schrieb:
> Power Ingenieur schrieb:
>
>> Warum gibt es überhaupt einen Überlauf?
>
>> Wenn ich 3bitter multipliziere, komme ich auf einen 6 Bit Vektor.
>
>>
>
>> -8 x -8 = 64
>
>>
>
>> Mit welcher Begründung soll das nicht rauskommen dürfen?
>
>
>
> vlt. weil 3bit signed 'minimal' -4 sind? Und
>
> -4 x -4 = +16
>
> Macht also 5bit im Ergebnis...

ändert nichts am prinzipiellen Vorgehen

wenn ein "Überlauf" detektiert wird, reicht die Berechnung mit 3 Bit 
weil mehr Codes nicht vorkommen können. Sowas "kommplexes" baut man als 
Tabelle.

3x3
3x2
3x1
2x2
2x1
 und die inversen

von Rado (Gast)


Lesenswert?

Hallo,

also dieselbe Aufgabe - dasselbe Problem....neue Ideen ?


mfg
Rado

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


Lesenswert?

Rado schrieb:
> neue Ideen
Wozu brauch man da Ideen?
Das ist doch nur stupides Hinschreiben einer Berechnung:
1. Multiplikation
2. Bereichsprüfung und Sättigung
Und mit den richtigen Datentypen (integer) kümmert sich der Synthesizer 
um die nötigen Bitbreiten. Resultat: 5 Zeilen Code. 10, wenn man es 
umständlich schreibt...

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


Lesenswert?

Hier mal ein Denkanstoß:
1
-- Multiplikation mit positiven und negativen Zahlen
2
library ieee;
3
use ieee.numeric_std.all;
4
5
entity lab2_3_mul is 
6
  port( A, B : in signed(2 DOWNTO 0);
7
           Z : out signed(3 DOWNTO 0)  );
8
end lab2_3_mul;
9
10
architecture behavior of lab2_3_mul is
11
  signal i: integer;  
12
begin
13
  i <= to_integer(A) * to_integer(B);   -- Zwischenergebnis
14
  Z <= to_signed(7,4)  when i>7  else   -- Sättigung auf +7
15
       to_signed(-8,4) when i<-8 else   -- Sättigung auf -8
16
       to_signed(i,4);                  -- Ergebnis = -8..7
17
end behavior;

: Bearbeitet durch Moderator
von Weltbester FPGA-Pongo (Gast)


Lesenswert?

Power Ingenieur schrieb:
> Warum gibt es überhaupt einen Überlauf?
Weil negative Zahlen den Bitvektor voll auslasten.

> Wenn ich 3bitter multipliziere, komme ich auf einen 6 Bit Vektor.
>
> -8 x -8 = 64

Nö, das wären 4 Bit Vektoren!

3 bit sind maximal -4 x -4 = 16, DAS ist der einzig mögliche Überlauf.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Noch was ganz anderes:
Biste dir sicher, dass die interne MUltiplikation genutzt werden darf?
Die Aufgabe klingt für mich so als wolle der Aufgabensteller auch einen 
Booth Multiplizierer mit Radix 2 sehen (oder ne andere signed MUL 
IMplementation).

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


Lesenswert?

Mw E. schrieb:
> Biste dir sicher, dass die interne MUltiplikation genutzt werden darf?
Wenn ich eine Aufgabe mit einem FPGA lösen soll, dann sollte ich dort 
auch alle die verfügbaren Komponenten verwenden dürfen. Oder wie könnte 
man sich sicher sein, dass man die FPGA-Taktverteilung verwenden darf?


tim_boc schrieb:
> die aufgabe lautet: ...
Oder andersrum: die gestellte Aufgabe wurde gelöst. Von einem "möglichst 
umständlich" war in der Aufgabenstellung nicht die Rede...

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

@lkmiller
Bei uns in Computerarithmetik gabs sone ähnliche Aufgabe und da wars 
eben nicht erlaubt den internen Multiplizierer zu nutzen.
Es ging ja genau darum einen Multiplizierer zu schreiben, der auch 
saturieren sollte.
Finde aber den Code nicht mehr.

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.