line44 schrieb:
> korrigiert mich, wenn ich falsch liege
Du liegst falsch.
Das Problem liegt darin, dass Concurrent-Syntaxelemente (nebenläufige
Beschreibung) in einer sequentiellen Beschreibung (Prozess) verwendet
werden:
with...select ist Concurrent und hat in einem Prozess nichts zu suchen.
So, damit ist der gemeldete Fehler behoben.
Ein Fauxpas ist auch noch drin, der für eine falsche Simulation sorgt:
1 | PROCESS(Temperatur, Tempsensor)
|
2 | BEGIN
|
3 | :
|
4 | :
|
5 | IF TagNacht = '1' THEN
|
TagNacht fehlt in der Sensitivliste....
Was aber viel, viel schlimmer ist: das Design wird im echten Leben nie
zuverlässig laufen!
Warum behaupte ich das und bin mir sogar noch sicher, dass ich Recht
habe?
Sieh dir mal das hier an:
1 | PROCESS(Temperatur, Tempsensor)
|
2 | BEGIN
|
3 |
|
4 | IF Temperatur < "10010" THEN
|
5 | Tempsensor(2) <= '1';
|
6 | TempsensorNODE(2) <= Tempsensor(2);
|
7 |
|
8 | ELSIF Temperatur > "11010" THEN
|
9 | Tempsensor(1) <= '1';
|
10 | TempsensorNODE(1) <= Tempsensor(1);
|
11 |
|
12 | ELSIF Temperatur <= "11010" OR Temperatur >= "10010" THEN
|
13 | Tempsensor(0) <= '1';
|
14 | TempsensorNODE(0) <= Tempsensor(0);
|
15 | END IF;
|
Und jetzt nehmen wir mal an, dass sich Temperatur von 11111 nach 00000
ändert. Weil jetzt aber garantiert nicht alle Bits gleichzeitig
umschalten, kann für einen kurzen Augenblick jeder beliebige Wert
zwischen 11111 und 00000 auftreten. So auch 11011 oder 11000
oderwasweißichauchimmer...
Und was wird jetzt diese Schaltung in diesen paar picoSekunden machen?
Richtig: ein paar Speicherelemente bekommen mit, dass da was war, andere
nicht und heraus kommt Müll. Nicht immer, aber einmal pro halbe Stunde
oder einmal am Tag, oder jede Minute...
Kurz: diesen Fehler wirst du ewig suchen. Und viel dabei lernen!
So, und jetzt kommt der Fachbegriff zum Thema: du hast ein Latch gebaut.
Eigentlich nicht nur eines, sondern viele....