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