Hallo,
ich habe hier den Code eines Volladdierers (ich weiß, es geht einfacher.
aber es soll mit process und case Anweisung realisiert werden)
Ich bin der Meinung, dass der Code in Ordnung ist. Die Simulation
liefert aber unsinnige Werte. Wäre nett, wenn mal jemand drauf gucken
könnte
1
libraryIEEE;
2
useIEEE.STD_LOGIC_1164.ALL;
3
useIEEE.STD_LOGIC_ARITH.ALL;
4
useIEEE.STD_LOGIC_UNSIGNED.ALL;
5
6
7
entityFullAdderis
8
Port(X:inSTD_LOGIC;
9
Y:inSTD_LOGIC;
10
Cin:inSTD_LOGIC;
11
Cout:outSTD_LOGIC;
12
S:outSTD_LOGIC);
13
endFullAdder;
14
15
architectureBehavioralofFullAdderis
16
signaltemp:std_logic_vector(2downto0);--Hilfssignal, auf das die folgende Case-Abfrage erfolgt
17
begin
18
temp<=X&Y&Cin;-- Verkettung der Eingangssignale zu einem Vektor
Es könnte sein das der process nicht wie erwartet reagiert da du auf die
eigentlichen eingangssignale (X,Y,Cin) sensitiv bist und nicht auf das
zusammengesetzte temp signal was in deinem process verarbeitet wird.
Das würde ich auch sagen. Denn der Prozess Volladierer wird neu
berechnet, wenn sich die Ursprungssignale ändern. Und das passiert
gleichzeitig mit der Berechnung des Wertes von temp, denn dessen
Concurrent-Zuweisung könnte auch in einen Prozess geschrieben werden:
1
Verkettung:process(X,Y,Cin)
2
begin
3
temp<=X&Y&Cin;-- Verkettung der Eingangssignale zu einem Vektor
4
endprocess;
5
6
Volladdierer:process(X,Y,Cin)
7
begin
8
casetempis
9
when"000"=>Cout<='0';S<='0';
10
when"001"=>Cout<='0';S<='1';
11
when"010"=>Cout<='0';S<='1';
12
when"011"=>Cout<='1';S<='0';
13
when"100"=>Cout<='0';S<='1';
14
when"101"=>Cout<='1';S<='0';
15
when"110"=>Cout<='1';S<='0';
16
whenothers=>Cout<='1';S<='1';
17
endcase;
18
endprocessVolladdierer;
Das ist funktional genau gleich wie die ursprüngliche Beschreibung,
jetzt werden aber die zeitlichen Abläufe klarer: wenn sich z.B. X
ändert, werden beide Prozess gleichzeitig neu berechnet. Der Volladierer
nimmt aber den alten Wert von temp für seine Berechnungen.
Ein klarer Fall einer falschen, unvollständigen Sensitivliste :-o
Am einfachsten wäre eine Verkettung im Prozess:
1
Volladdierer:process(X,Y,Cin)
2
begin
3
caseX&Y&Cinis-- Verkettung der Eingangssignale zu einem Vektor
>Denn der Prozess Volladierer wird neu berechnet, wenn sich die>Ursprungssignale ändern. Und das passiert gleichzeitig mit der Berechnung>des Wertes von temp,...
aaargh.., ich Depp. Stimmt natürlich. Hatte ich übersehen. Vielen Dank
für die schnelle Hilfe!
@Lothar: Wenn ich die von dir vorgeschlagene Variante probiere erhalte
ich beim Syntaxcheck eine Fehlermeldung
"Can not determine the type of the selector & "
Eine Verkettung im Prozess wie z.B.
1
architectureBehavioralofFullAdderis
2
signaltemp:std_logic_vector(2downto0);--Hilfssignal, auf das die folgende Case-Abfrage erfolgt
3
begin
4
Volladdierer:process(X,Y,Cin)
5
begin
6
temp<=X&Y&Cin;-- Verkettung der Eingangssignale zu einem Vektor
7
casetempis
8
9
...
10
..
funkioniert auch nicht aus den gleichen Gründen wie zu Beginn. Das
Einzige was hier wohl hilft ist temp als Variable zu definieren.
@Mathi: Dein erster Vorschlag sollte funkionieren. Dein zweiter
Vorschlag funktioniert nur, wenn temp eine Variable ist. So hab ich's
jetzt auch und es passt.
Stimmt. Die zweite Version funktioniert auch. Ich hatte das temp in der
Sensitivitätsliste übersehen. Allerdings ist diese Version
"umständlich", da der Prozess 2 mal durchlaufen wird.