Hallo,
zu untenstehenden Beispielprogramm eines Volladierers habe ich folgende
Aussage in einem VHDL-Buch gefunden und verstehe sie nicht so ganz:
"Die Wahl einer Variablen ist ist in dieser Anwendung zwingend, da
sofort nach der Wertzuweisung in der case-Anweisung auf den
Variablenwert zugegriffen werden soll. Bei Verwendung eines Signals
würde in der case-Anweisung fehlerhafterweise immer auf den im letzten
Prozessdurchlauf zugewiesenen Signalwert zugegriffen"
Diese Aussage verstehe ich nicht. Werte werden lediglich an
Ausgangssignale zugewiesen aber diese haben ohnehin keinen Einfluss auf
den Durchlauf des Prozesses. Abgerfragt werden lediglich die
Eingangssignale. Sinn würde es evt. machen, wenn die Ausgänge auf die
Eingänge rückwirken aber dies ist hier nicht der Fall.
Vielleicht mach ich aber auch einen Denkfehler und jemand kann mir das
erklären?
Aus meiner Sicht, hast du Recht. Die Ausgänge werden nur geschrieben und
die Eingänge nur gelesen. Somit brauchst man die Variablen gar nicht.
Und selbst wenn, macht es in diesem Fall keinen Unterschied, ob es ein
Signal oder Variable ist.
Mein Eindruck beim drueberfliegen: Verklag' den Autor!
Wer wegen 2-3 Zeilen weniger Code so einen Schwachsinn produziert der
soll Baeckerei-Fachverkaeufer werden...
Wenn du hier Signale hättest, müsstest du schreiben
1
TEMP_IN<=CIN&BI&AI;
2
caseTEMP_INis...
und TEMP_IN in dei Sensitivliste aufnehmen.
Insgesamt ist das Beispiel so unnötig kompliziert an den Haaren durch
die Brust gezogen... :-/
BTW:
Ein "normaler" Mensch würde TEMP_IN weglassen und schreiben:
1
caseCIN&BI&AIis...
Oder gleich so:
1
P1:process(CIN,BI,AI)
2
begin
3
caseCIN&BI&AIis
4
when"000"=>COUT<='0';SI<='0';
5
when"011"=>COUT<='1';SI<='0';
6
when"101"=>COUT<='1';SI<='0';
7
when"110"=>COUT<='1';SI<='0';
8
when"111"=>COUT<='1';SI<='1';
9
whenothers=>COUT<='0';SI<='1';
10
endcase;
11
endprocessP1;
Da sehe ich gleich, wie Carry und Sum sich verhalten.
Das scheint mir sogar noch besser lesbar ;-)
Ja, ich hab auch das Gefühl, dass viel zu oft Sachen in einen Prozess
gesteckt werden, die auch mit nem einfachen concurrent-statement
beschrieben werden könnten.
Gibts irgendeinen Grund dafür, das zu machen? Oder ist das nur die Macht
der Gewohnheit, alles sequenziell Formulieren zu wollen?
Die andere Frage ist, ob es einen Grund dagegen gibt, wenn sich der
Entwickler damit wohler fühlt.
Das Beispiel oben ist sicher auch ohne Variablen lösbar, aber es ist aus
einem LEHRBUCH! Irgendwelche Beispiele muss es da auch geben. Streng
genommen könnte man alles auch ohne Variablen lösen, aber sie sind halt
Bestandteil der Sprache und wenn man weiß was man tut geht die Welt auch
nicht unter.
(Ja, ich weiß das die Designrules vieler Firmen Variablen verbieten. War
bei uns auch so.)
> Die andere Frage ist, ob es einen Grund dagegen gibt, wenn sich der> Entwickler damit wohler fühlt.
Ja, die gibt es aus meiner Sicht. Bei concurrent hat man weniger
Fehlerquellen. Sensitivitylist, ungewollte Latches...
> Bei concurrent hat man weniger ... ungewollte Latches...
Das geht auch concurrent ganz einfach :-o
Ich habe mir angewöhnt, nach Möglichkeit Prozesse zu takten und
Kombinatorik concurrent zu beschreiben. Wobei eine Abweichung in die
eine oder andere Richtung nur die Regel bestätigt:
>Ja, die gibt es aus meiner Sicht. Bei concurrent hat man weniger>Fehlerquellen. Sensitivitylist, ungewollte Latches...
Da warnt der Synthesizer und folglich sollte man dem dann auch
nachgehen.
Ich finde, dass sich Logik in einem prozess meist besser lesen lässt,
aber das ist dann wohl geschmacksache.
Meine Meinung:
Krause Logik wird mit concurrent Statements beschrieben.
Getaktete Logik innerhalb eines 'process'.
Macht den Code lesbarer und klarer/verstaendlicher.
> Das ist jetzt aber nicht wirklich dein Ernst :o)
Oh, doch... ;-)
> Sowas macht man einfach nicht!
Synthesizer können heute einiges mehr als vor 10 Jahren, warum sollte
man diese Möglichkeiten nicht ausnutzen?
http://www.lothar-miller.de/s9y/archives/47-wait-im-Prozess.html
Ich werde bei Gelegenheit mal ausprobieren, was aus dieser Beschreibung
wird:
1
toggle<=nottogglewhenrising_egde(clk)anddoit='1';-- concurrent getaktet mit enable ;-)
hi,
naja ab einer nennenswerten designgroesse wuerde ich micht nicht mehr
mit einer kombinatorischen beschreibung abgeben. das ist nicht mehr
sinnvoll debugbar. ich setzte daher lieber auf sequentielle prozesse.
mit ein paar einfachen regeln und synthesechecks ist das auch fuer
komplexe module zu handhaben.
rdg
/uwe