Zähler Frage

Gast #2129951
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
Moderator (Firma: Titel) Persönliche Seite #2130246
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
Gast #2130251
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
Gast #2130289
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ß

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren