www.mikrocontroller.net

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


Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: noname (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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


Autor: Klaus Falser (kfalser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo liegt das Problem? Sind ca. 28 Bit.

Autor: Mark (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Christoph Kessler (db1uq) (christoph_kessler)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Rick Dangerus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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;

Autor: Falk (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Rudi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke Dir,
ich probiere's gleich aus.
Grüsse

Autor: juhu (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Joerg Wolfram (joergwolfram)
Datum:

Bewertung
0 lesenswert
nicht 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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [vhdl]VHDL-Code[/vhdl]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.