Hallo Mikrocontroller-Community,
Habe dieses Forum erst vor kurzem entdeckt, und bin erstaunt welche
Vielfältigen Themen es umfasst.
Nun, wie Ihr aus meinem Betreff schon erahnen könnt, habe ich ein
Problem eine ALU im VHDL-Code zu schreiben.
Ich sollte das bauen (Bild im Anhang).
Mein Code:
1
LIBRARYIEEE;
2
USEIEEE.STD_LOGIC_1164.ALL;
3
USEIEEE.STD_LOGIC_ARITH.ALL;
4
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
ENTITYaluIS
7
PORT(Daten:INSTD_LOGIC_VECTOR(1downto0);
8
Funktion:INSTD_LOGIC_VECTOR(2downto0);
9
Ausgang:OUTSTD_LOGIC_VECTOR(1downto0));
10
ENDalu;
11
12
ARCHITECTUREcombOFaluIS
13
BEGIN
14
WITHFunktionSELECT
15
Ausgang(0)<='0'WHEN"000",
16
'1'WHEN"001",
17
(Daten(0)*Daten(1))WHEN"010",
18
(Daten(0)NANDDaten(1))WHEN"011",
19
(Daten(0)==Daten(1))WHEN"100",
20
not(Daten(0))WHEN"101",
21
Daten(0)WHEN"110",
22
((Daten(0)andnot(Daten(1)))or(not(Daten(0))andDaten(1)))WHEN"111",--Summe eines Halbaddierers, da nur A und B
23
24
'0'WHENOTHERS;
25
26
27
28
Ausgang(1)<='0'WHEN"000",
29
'1'WHEN"001",
30
(Daten(0)+Daten(1))WHEN"010",
31
(Daten(0)NORDaten(1))WHEN"011",
32
(Daten(0)==not(Daten(1)))WHEN"100",
33
not(Daten(1))WHEN"101",
34
Daten(1)WHEN"110",
35
(Daten(0)ANDDaten(1))WHEN"111",--Übertrag(Carry) eines Halbaddierers, da nur A und B
36
37
'0'WHENOTHERS;
38
39
ENDcomb;
Habe jeweils Daten, Funktionen und die Ausgänge(F,G) zu einem Vektor
zusammengefasst.
Grundsätzlich nicht schwer, doch ich erhalte beim Compilieren immer
einen Fehler das er die Befehle wo ich addiere und multipliziere nicht
interpretieren kann in Englisch: can't interpret subprogram call.
Das müsste doch funktionieren, habe auch weiter Bibliotheken verwendet.
Weiteres verstehe ich nicht wie ich den Befehl A!=B in VHDL-Code
schreiben soll.
Hoffe Ihr könnt mir helfen
Um Antworten wäre ich euch sehr dankbar!
mfg
Für STD_LOGIC_VECTOR sind die Operationen wie + und * nicht definiert.
Du must quasi einen Typecast auf einen Numerischen Typ machen, den VHDL
versteht:
Oben:
use ieee.numeric_std.all;
Und dann:
(unsigned(Daten(0)) + unsigned(Daten(1))) WHEN "010",
Ich bekomme mit deinem Code schon beim Syntax-Check sowas:
1
INFO:HDLCompiler:1061 - Parsing VHDL file "F:/Projekte/FPGA/OneBitALU/obalu.vhd" into library work
2
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 19: Syntax error near "=".
3
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 28: Syntax error near ",".
4
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 29: Syntax error near ",".
5
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 30: Syntax error near ",".
6
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 31: Syntax error near ",".
7
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 32: Syntax error near "=".
8
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 33: Syntax error near ",".
9
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 34: Syntax error near ",".
10
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 35: Syntax error near ",".
11
ERROR:HDLCompiler:806 - "F:/Projekte/FPGA/OneBitALU/obalu.vhd" Line 37: Syntax error near "OTHERS".
12
ERROR:ProjectMgmt:496 - 10 error(s) found while parsing design hierarchy.
Die Zeile 19:
1
(Daten(0)==Daten(1))WHEN"100",
== gibt es in VHDL nicht... :-/
Es sein denn, du hast deinen eigenen Operator definiert...
> Weiteres verstehe ich nicht wie ich den Befehl A!=B in VHDL-Code> schreiben soll.
/= evtl...?
Sowas steht aber in jedemVHDL-Buch ziemlich am Anfang...
Knut schrieb:> Für STD_LOGIC_VECTOR sind die Operationen wie + und * nicht definiert.
Wenn das da steht:
Hallo zusammen,
Danke für eure SCHNELLEN Antworten...
Eben, ich habe die Operatoren wie folgt definiert:
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
und trotzdem gibt er mir eine Fehlermeldung aus das er die Befehle nicht
interpretieren kann, komisch..
Auch habe ich die Bibliothek die Knut vorgeschlagen hat verwendet, nur
schreibt er dann als Fehlermeldung das "numeric_std" in der Bibliothek
nicht existiert.
Abgesehen von der Zeile 19 und 32 mit dem "=" sollte das Programm ja
funktionieren, oder?....
Wie gesagt als Fehlermeldung bekomme ich nur das er die Befehle nicht
versteht, würdet Ihr das Programm anders schreiben?
Thorsten H. schrieb:> Abgesehen von der Zeile 19 und 32 mit dem "=" sollte das Programm ja> funktionieren, oder?....
Das ist kein Programm, das auf irgendeinem FPGA "läuft".
> Abgesehen von der Zeile 19 und 32 mit dem "=" sollte das Programm ja> funktionieren, oder?....
Nein.
Denn selbst wenn der Vergleich funktionieren würde, liefert er einen
boolean Wert zurück. Du mußt aber einen std_logic Wert an den Vektor
zuweisen.
Dein Problem mit dem Multiplizieren und Addieren ist, dass diese
Operationen nur für Vektoren definiert sind, nicht für einzelne Bits.
Als Workaround könntest du so schreiben:
(Daten(0 downto 0) * Daten(1 downto 1))
Blöd nur, dass dann aber das Ergebnis immer noch ein Vektor ist, den du
nicht auf ein einzelnes Bit zuweisen kannst...
So ginge das prinzipiell:
1
LIBRARYIEEE;
2
USEIEEE.STD_LOGIC_1164.ALL;
3
USEIEEE.STD_LOGIC_ARITH.ALL;
4
USEIEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
ENTITYaluIS
7
PORT(Daten:INSTD_LOGIC_VECTOR(1downto0);
8
Funktion:INSTD_LOGIC_VECTOR(2downto0);
9
Ausgang:OUTSTD_LOGIC_VECTOR(1downto0));
10
ENDalu;
11
12
ARCHITECTUREcombOFaluIS
13
signalm:std_logic_vector(1downto0);
14
signala:std_logic_vector(1downto0);
15
BEGIN
16
a<=Daten(0downto0)+Daten(1downto1);
17
m<=Daten(0downto0)*Daten(1downto1);
18
WITHFunktionSELECT
19
Ausgang(0)<='0'WHEN"000",
20
'1'WHEN"001",
21
m(0)WHEN"010",
22
(Daten(0)NANDDaten(1))WHEN"011",
23
-- (Daten(0) == Daten(1)) WHEN "100",
24
not(Daten(0))WHEN"101",
25
Daten(0)WHEN"110",
26
((Daten(0)andnot(Daten(1)))or(not(Daten(0))andDaten(1)))WHEN"111",--Summe eines Halbaddierers, da nur A und B
27
28
'0'WHENOTHERS;
29
30
31
32
WITHFunktionSELECT
33
Ausgang(1)<='0'WHEN"000",
34
'1'WHEN"001",
35
a(0)WHEN"010",
36
(Daten(0)NORDaten(1))WHEN"011",
37
-- (Daten(0) == not(Daten(1))) WHEN "100",
38
not(Daten(1))WHEN"101",
39
Daten(1)WHEN"110",
40
(Daten(0)ANDDaten(1))WHEN"111",--Übertrag(Carry) eines Halbaddierers, da nur A und B
41
42
'0'WHENOTHERS;
43
44
ENDcomb;
BTW:
(Daten(0) and not(Daten(1))) or (not(Daten(0)) and Daten(1))
Das ist ein
Daten(0) XOR Daten(1)
Thorsten H. schrieb:> Eben, ich habe die Operatoren wie folgt definiert:>> USE IEEE.STD_LOGIC_ARITH.ALL;> USE IEEE.STD_LOGIC_UNSIGNED.ALL;
Gewöhn Dir schnellstmöglich an die beiden Bibliotheken NICHT zu
verwenden!
Die waren nur eine Übergangslösung.
Benutze die numeric_std
Danke für eure Antworten, Lothar --> danke für den Code.
Habs jetzt so ziemlich verstanden, was die Fehler betrifft.
Nochmals danke und schönen Abend noch...
mfg