Forum: FPGA, VHDL & Co. Zähler Frage


von Neira (Gast)


Lesenswert?

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

von hp-freund (Gast)


Lesenswert?

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...

von Neira (Gast)


Lesenswert?

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....

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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

von obstistgut (Gast)


Lesenswert?

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

von Neira (Gast)


Lesenswert?

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ß

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

Neira schrieb:
> Ich bleib bei der funktionierenden Variante!
Aber auch die zählt 101 Takte. Das ist dir bewusst?

von Neira (Gast)


Lesenswert?

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.

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

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
Noch kein Account? Hier anmelden.