Forum: FPGA, VHDL & Co. Zähler bis 200000000


von Rudi (Gast)


Lesenswert?

Hallo zusammen,
ich brauche für mein Project einen Zähler der bis ca. 200 000 000 
hochzählt und dabei den aktuellen Stand ausgibt. Kann mich jemand dabei 
helfen bzw. hat jemand schon was in der Richtung gemacht?
Grüße.
R.

von noname (Gast)


Lesenswert?

Jo, du brauchst mehrere 8-Bit Zähler als Dekade verschaltet
1 Stuffe: kleine Stellen
2 Stuffe: 10e2
3 Stuffe: 10e4
4 Stuffe: 10e6
5 Stuffe: 10e8


von Klaus F. (kfalser)


Lesenswert?

Wo liegt das Problem? Sind ca. 28 Bit.

von Mark (Gast)


Lesenswert?

constant MAX_COUNTER : integer := 200000000;
signal counter : integer range 0 to MAX_COUNTER;

...

process(clock)
begin
   if rising_edge(clock) then
      counter <= (counter + 1) mod MAX_COUNTER; -- oder so...
   end if;
end process;

von Christoph db1uq K. (christoph_kessler)


Lesenswert?

Das Problem ist bei dieser Breite, dass die max. Zählfrequenz sinkt, 
wenn der Übertrag nicht vernünftig gemacht ist. Also sollte dazu 
mindestens der Fitter auf "Delay"-Optimierung eingestellt sein, sonst 
kann die Frequenz schnell auf 1/2 oder 1/4 eines kleineren Zählers 
sinken.

von Rudi (Gast)


Lesenswert?

Es ist mir klar wie ich den Zähler realisiere, nun möchte ich abhängig 
von einer Eingangstaste im laufenden Betrieb den Zähler einen neuen 
Maximum zuweisen wie folgt:

when "0001" => s_max_counter <= 100;      -- 10^2
when "0010" => s_max_counter <= 1000;     -- 10^3
when "0011" => .....
               .....
for i in s_max_counter downto 0 loop
    s_max_counter <= (s_max_counter-1);
end loop;
led <= '1';


Da die for-Schleife nur mit statischen grenzen synthesefähig ist, frage 
ich mich ob und wie man dieses Problem umgehen kann.

von Rick Dangerus (Gast)


Lesenswert?

@Rudi:
In dem Du für den Maximalwert entwirfst. Außerdem solltest Du Dir 
nochmal GENAU die Funktion der for-Schleife in VHDL anschauen.

Rick

von Rudi (Gast)


Lesenswert?

Hab da folgende variante ausprobiert. Sollte synthsefähig sein, mag das 
Precision RTL Synthese tool aber nicht wegen dem "mod" operator. Hat 
jemand schon Erfahrung mit diesem Problem.


process(clock)
begin
   if rising_edge(clock) then
      counter <= (counter + 1) mod MAX_COUNTER;
   end if;
end process;

von Falk (Gast)


Lesenswert?

@ Rudi

>Hab da folgende variante ausprobiert. Sollte synthsefähig sein, mag das

Xilinx ISE mag das nicht, MOD ist nur statisch synthetisierbar.

>Precision RTL Synthese tool aber nicht wegen dem "mod" operator. Hat
>jemand schon Erfahrung mit diesem Problem.

process(my_input)
begin
  case my_input is
    when "00" => max_cnt <= 100;
    when "01" => max_cnt <= 1000;
    when "10" => max_cnt <= 10000;
    when "11" => max_cnt <= 100000;
  end case;
end process;

process (clk)
begin
  if rising_edge(clk) then
    if cnt=max_cnt then
      cnt <= 0;
    else
      cnt <= cnt +1;
    end if;
  end if;
end process;

Das Ganze ist natürlich noch ohne Pipelining und wird bei grossen 
Zählerbreiten schon etwas langsamer. Aber 100 MHz sollen auf jeden Fall 
drin sein.

MFG
Falk

von Rudi (Gast)


Lesenswert?

Danke Dir,
ich probiere's gleich aus.
Grüsse

von juhu (Gast)


Lesenswert?

Na, da muss ich gleich mal fragen: wie bekommt man den schneller hin? 
was kann man da in die pipeline schubsen und wie sehen die anderen 
Alternativen aus?

Grüße

von Joerg W. (joergwolfram)


Lesenswert?

Das kommt darauf an, wie die Zählersignale weiterverarbeitet werden. Für 
Frequenzteiler-Anwendungen kann man den Zähler auch in 2 Teilzähler 
aufteilen (Vorteiler-Prinzip). Im Beispiel von Falk würde dann z.B. der 
erste Zähler konstant 0-99 zählen, der zweite maximal bis 0-999. Für 
z.B. einen Adresszähler bei dem alle Bits benötigt werden, geht das 
natürlich nicht.

Gruss Jörg

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.