2 Zähler Varianten wollte ich testen, und ich habe sie simuliert.Die erste Variante ist OK,aber bei der zweiten Variante bekomme ich im Modelsim eine Fehlermeldung: Fatal: (vsim-3421) Value 101 for count is out of range 100 downto 0. Im Code wird doch der Zähler nach Erreichen des Wertes 100 zurück gesetzt. Also warum wird hier weiter gezählt?Oder muss einen Else-Zweig dran? signal count : integer range 100 downto 0 ; process(clk) begin if (rising_edge(clk)) then count <= count +1; clkDiv2 <='0'; if (count =100) then count <= 0; clkDiv2 <= '1'; end if; end if; end process; Danke
Hab das gefunden: Beitrag "Re: VHDL Integer Counter" Signal A integer ...; ... (Annahme: A=5) Process... begin ... A<=A+1; if (A=6) then ... (wird nicht ausgeführt, da A erst am Prozessende aktualisiert wird!) end if; end Process... Ich hoffe das hilft...
hp-freund schrieb: > if (A=6) then ... (wird nicht ausgeführt, da A erst am Prozessende Das ist schon klar.Leider selbst bei Variablen,die einen Wert sofort übernehmen,spuckt der Simulator immer den gleichen Fehler. Ich kann aber mir diesen Überlauf nicht erklären....
Neira schrieb: > Fatal: (vsim-3421) Value 101 for count is out of range 100 downto 0. > > Im Code wird doch der Zähler nach Erreichen des Wertes 100 zurück > gesetzt. Das schon, aber vorher wird er auf 101 gezählt. Sieh dir das mal an:
1 | process(clk) begin |
2 | if (rising_edge(clk)) then |
3 | count <= count +1; -- Der Prozess verhält sich gleich, egal, ob diese Zeile hier.... |
4 | clkDiv2 <='0'; |
5 | if (count =100) then |
6 | count <= 0; |
7 | clkDiv2 <= '1'; |
8 | end if; |
9 | count <= count +1; -- oder hier ist. Du kannst sogar beide Zeilen drinlassen... :-o |
10 | end if; |
11 | end process; |
Das ist das Verhalten von Signalen! Richtig ginge das also so:
1 | process(clk) begin |
2 | if (rising_edge(clk)) then |
3 | clkDiv2 <='0'; |
4 | if (count = 100) then |
5 | count <= 0; |
6 | clkDiv2 <= '1'; |
7 | else
|
8 | count <= count +1; |
9 | end if; |
10 | end if; |
11 | end process; |
> signal count : integer range 100 downto 0 ;
Integer ist definiert als xx to yy
Machs also besser so:
signal count : integer range 0 to 100;
BTW: ein Zähler, der auf ein Zähler mit 0 to 100 hat 101 Zählschritte...
:-o
count wird erst nach durchlaufen des Prozesses zugewiesen, d.h. du startest den Prozess auch nochmal, wenn count schon 100 ist, da du dann aber nochmal versuchst 1 zu addieren meckert er, auch wenn er eigentlich den Wert rücksetzen würde. (hoff das stimmt soweit) Wenn du das maximum von count auf 101 setzt passt alles, und mehr flipflops werden deswegen auch nicht benötigt
Lothar Miller schrieb: > Richtig ginge das also so: process(clk) begin > if (rising_edge(clk)) then > clkDiv2 <='0'; > if (count = 100) then > count <= 0; > clkDiv2 <= '1'; > else > count <= count +1; > end if; > end if; > end process; diese Variante verwende ich mittlerweile. Ich wollte die andere Variante testen. obstistgut schrieb: > Wenn du das maximum von count auf 101 setzt passt alles, Mit count auf 101 bin außerhalb von dem Bereich <0 - 100>.Die Simulation würde auch einen Fehler melden. Ich bleib bei der funktionierenden Variante! Gruß
Neira schrieb: > Ich bleib bei der funktionierenden Variante! Aber auch die zählt 101 Takte. Das ist dir bewusst?
Lothar Miller schrieb: > Aber auch die zählt 101 Takte. Das ist dir bewusst? Ja, es ist mir bewusst.Ich glaube die if-Abfrage aber verhindert,dass das Signal count jemals 101 erreicht.Liege ich da richtig? Auf jeden Fall danke für eure Erklärungen.
Neira schrieb: > Ich glaube die if-Abfrage aber verhindert,dass > das Signal count jemals 101 erreicht.Liege ich da richtig? Ja.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.