4Bit Multiplikator aus 2 3Bit Zahlen

Gast #3165470
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
Gast #3165494
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?
Gast #3165543
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?
Gast #3165596
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
Gast #3165782
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
Moderator (Firma: Titel) Persönliche Seite #4568730
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...
Moderator (Firma: Titel) Persönliche Seite #4569035
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;
Gast #4569448
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.
(Firma: fritzler-avr.de) #4569622
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).
Moderator (Firma: Titel) Persönliche Seite #4571052
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...
(Firma: fritzler-avr.de) #4572231
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren