Hallo Leute,
Ich bin wie viele andere auch ein Neuling mit VHDL und soll für einen
Laborversuch ein 3-Bit Rechenwerk aufbauen, dass einen Addierer, einen
Subtrahierer, einen Multiplizierer und einen Dividierer beinhaltet und
über einen Multiplexer entsprechend der Steuersignale durchschaltet.
Dabei werden 2 3-Bit Werte eingelesen und als Zweierkomplement
"verwendet" (Wertebereich also -4 bis 3). Am Ausgang soll das Ergebnis
als 4-Bit Zahl ausgegeben und ebenfalls als Zweierkomplement dargestellt
werden (Wertebereich: -8 bis 7).
Bei der Multiplikation soll eine Berreichsüberschreitung im positiven
durch "1111" und im negativen durch "0000" dargestellt werden. Der
Dividierer soll keine Dezimalstellen anzeigen (Division mit Rest, ohne
den Rest anzuzeigen) aber eine eventuelle 0 am zweiten Ausgang abfangen.
Addierer, Subtrahierer und MUX funktionieren soweit, aber der
Multiplizierer und der Dividierer machen Probleme.
Dividierer
1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 |
|
5 | entity Labor_Aufgabe_4_Div is
|
6 | port(
|
7 | a,b : in std_logic_vector (2 downto 0);
|
8 | y : out std_logic_vector(3 downto 0)
|
9 | );
|
10 | end entity Labor_Aufgabe_4_Div;
|
11 |
|
12 | architecture behav of Labor_Aufgabe_4_Div is
|
13 | signal aint,bint : unsigned(3 downto 0);
|
14 | signal sum : unsigned(3 downto 0);
|
15 |
|
16 | begin
|
17 |
|
18 | aint <= unsigned (a(2)&a);
|
19 | bint <= unsigned (b(2)&b);
|
20 |
|
21 | Div : process(sum) is
|
22 | begin
|
23 | if b /= "000" then
|
24 | sum <= aint / bint;
|
25 | y <= std_logic_vector(sum);
|
26 | else
|
27 | y <= "1111";
|
28 | end if;
|
29 | end process;
|
30 |
|
31 | end architecture;
|
ich kriege bei der Simulation teils Dont cares raus, was ich mir noch
nicht so richtig erklären kann. Auch die "normalen" Ergebnisse stimmen
nicht ganz.
Wo liegt mein Denkfehler?
Der Multiplizierer funktioniert prinzipiell auch allerdings krieg ich es
nicht auf die Reihe die Berauchsüberschreitung aufzustellen. Ich hab
schon verschiedenste IF-Else-Verzweigungen zusammengeschrieben, aber
bisher kam nur Mist dabei heraus.
1 | library ieee;
|
2 | use ieee.std_logic_1164.all;
|
3 | use ieee.numeric_std.all;
|
4 |
|
5 | entity Labor_Aufgabe_3_Mult is
|
6 | port(
|
7 | a,b : in std_logic_vector (2 downto 0);
|
8 | y : out std_logic_vector(3 downto 0)
|
9 | );
|
10 | end entity Labor_Aufgabe_3_Mult;
|
11 |
|
12 | architecture behav of Labor_Aufgabe_3_Mult is
|
13 | signal aint,bint : unsigned(2 downto 0);
|
14 | signal sum : unsigned(5 downto 0);
|
15 |
|
16 | begin
|
17 |
|
18 | aint <= unsigned (a);
|
19 | bint <= unsigned (b);
|
20 | sum <= aint * bint;
|
21 |
|
22 | y <= std_logic_vector(sum(3 downto 0));
|
23 |
|
24 | end architecture;
|
So sieht das ganze bis jetzt aus (ohne Bereichsgrenzen). Außerdem können
nur 4 Bit am ausgang dargestellt werden, was einige Ergebnisse
verfälscht.
Ich würde mich über Denkanstöße mehr freuen als über Komplettlösungen,
da ich die Berschreibung auch gerne verstehen möchte und daher möglichst
viel selbst machen will. Deswegen sind Algorithmen wie der Dividierer
von lkmiller für mich eher unpassend.
Vielen Dank im Voraus
Grüße Thomas
Randinformation:
Software: Lattice Diamond 2.2
PLD: Lattice MachX02