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.
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
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;
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.
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.
@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
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;
@ 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
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
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.