Chris schrieb:
> Nur ist jetzt auswertung dauerhaft auf 0.
Für alle, die irgendwann die Lösung wissen wollen:
In einem Porzess gilt die letzte Zuweisung an ein Signal. Bei dieser
Beschreibung gewinnt daher immmer die '0':
1 | elsif (rising_edge(clk1ms))then
|
2 | if (count1 > 500) then
|
3 | auswertung <= '1'; -- hier eine bedingte Zuweisung
|
4 | end if;
|
5 | count1 <= count1 +1;
|
6 | auswertung <= '0'; -- hier wird immer '0' zugewiesen
|
7 | end if;
|
Richtig wäre es so:
1 | elsif (rising_edge(clk1ms))then
|
2 | auswertung <= '0'; -- Defaultzuweisung von '0'
|
3 | if (count1 > 500) then
|
4 | auswertung <= '1'; -- hier eine bedingte Zuweisung
|
5 | end if;
|
6 | count1 <= count1 +1;
|
7 | end if;
|
Das ist übrigens genau das selbe, weiul sich der Wert eines Signals
immmer erst am Ende des Prozesses ändert. Wenn hier z.B. count1 mit 300
hereinkommt:
1 | elsif (rising_edge(clk1ms))then
|
2 | count1 <= count1 +1; -- dann ist der nächste Wert von count1 = 301
|
3 | auswertung <= '0';
|
4 | if (count1 > 500) then -- die Abfrage geht aber noch auf den aktuellen Wert von 300
|
5 | auswertung <= '1';
|
6 | end if;
|
7 | end if;
|
Und damit ist diese Abfrage falsch:
1 | elsif (rising_edge(clk1ms))then
|
2 | if (count1 > 500) then
|
Hier wird 501 Schritte gezählt (0,1,2,3...500).
Fazit: die Uhr geht um 0,2% falsch... :-o
Und mir gibt sehr zu denken, dass hier von einem clk1ms geschrieben
wird. Schlimmstenfalls könnten da sogar mehrere Takte im Design
beteiligt sein...