Den Volladdierer habe ich im Menü "Project" -> "Add/Remove Files" in den
Ripple Carry Addierer eingebunden (siehe Anhang). Das scheint noch nicht
zu funktionieren. Ich erhalte folgende Fehlermeldung:
'Info: Elaborating entity "Volladdierer" for hierarchy
"Volladdierer:\g1:0:fm"
Error: Port "c" does not exist in macrofunction "\g1:3:fm"'
Woran kann das liegen? Ich komme da nicht weiter.
>Habt ihr noch Verbesserungen vorzuschlagen.
Geht es dir nur um das Zweierkomplement?
Dann gibt es kürzere und übersichtlichere Wege: Antatt die Struktur zu
beschreiben ist es i.A. besser lesbar, das Verhalten zu beschreiben:
1
libraryIEEE;
2
USEieee.std_logic_1164.ALL;
3
USEieee.std_logic_unsigned.all;
4
USEieee.numeric_std.ALL;
5
6
entityKomplementis
7
generic(n:natural:=4);
8
Port(x:inSTD_LOGIC_VECTOR(n-1downto0);
9
z:outSTD_LOGIC_VECTOR(n-1downto0));
10
endKomplement;
11
12
architectureVerhaltenofKomplementis
13
begin
14
z<=(notx)+1;
15
endVerhalten;
Oder alternativ mit der aktuellen numeric_std-Lib:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.numeric_std.ALL;
4
5
entityKomplementis
6
generic(n:natural:=4);
7
Port(x:inSTD_LOGIC_VECTOR(n-1downto0);
8
z:outSTD_LOGIC_VECTOR(n-1downto0));
9
endKomplement;
10
11
architectureBehavioralofKomplementis
12
begin
13
z<=std_logic_vector((notunsigned(x))+1);
14
endBehavioral;
Oder so:
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.numeric_std.ALL;
4
5
entityKomplementis
6
generic(n:natural:=4);
7
Port(x:inSTD_LOGIC_VECTOR(n-1downto0);
8
z:outSTD_LOGIC_VECTOR(n-1downto0));
9
endKomplement;
10
11
architectureBehavioralofKomplementis
12
begin
13
z<=std_logic_vector(0-signed(x));
14
endBehavioral;
Es gibt also etliche elegantere Methoden, als Berechnungen über eine
Struktur zu beschreiben. Aber zum Lernen einer Strukturbeschreibung ist
dieser Umweg (handgestrickte Addierer usw.) ok.
Klar geht das einfacher. Das sollte wir aber so lösen. Schaltung des
Volladdiers umsetzen, daraus einen Ripple Carry Addierer machen und den
zur Berechnung des Komplements verwenden.
Das ganze Verfahren (mit dem Schlüsselwörtern "component" und "port map"
errinert mich irgendwie an die Vererbung bei der objektorientierten
Programmierung.
Habe das Programm noch ein weinig erweitert (sihe Anhang). Das Problem
ist, dass ich mich noch verhauen habe:
Error (10344): VHDL expression error at ALU.vhd(57): expression has 9
elements, but must have 8 elements
Die Fehlermeldung kommt aus diesem
OK, Fehler gefunden: port z in Komponente Komplement muss natürlich von
n nach 0 gehen.
Die ganzen Dateien (bis auf den Universaladdierer) werden korrekt
gefunden und eingebunden. Den habe ich mit dem "Mega Wizard" erstellt.
Da scheint Quartus noch ein bischen rumzuzicken. Könnt ihr mir sagen,
woran das liegt?