Archief - [VHDL] Clock divider (25Mhz -> 5Khz & 1Hz)

Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.

yannick

Legacy Member
Goedemiddag,

Ik weet dat dit een long shot is want ik denk niet dat er veel mensen op dit forum zijn die weten wat vhdl is (ik kan me vergissen uiteraard :)).

Anyway, here goes:
Ik moet voor een soort eindwerkje een stopwatch maken in VHDL. Alles is zeer vlot gegaan en het is eigenlijk af, maar het probleem is dat de prof vroeg om het met zo weinig mogelijk flips flops mogelijk te maken.

Ik heb alles goed geoptimaliseerd gekregen behalve mijn clock divider (welke dus de meeste flip flops gebruikt, omdat hij hoge tellers heeft).
Ik ben al 2 weken aan het zoeken naar een betere manier voor deze clock divider.

Logisch moet hij zo in elkaar zitten:

Input is dus de main clock (25Mhz) en daaruit moet ik een 5Khz en 1hz clock krijgen
Code:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

entity clk_div is
	port(
		clk_default:         in std_logic;
		reset: in std_logic;
		clkout_5Khz:       out std_logic;
		clkout_1Hz:         out std_logic
	);
end clk_div;

architecture main of clk_div is
signal internalclock: std_logic;
begin

	process1:process(clk_default,reset)
	variable cnt:integer range 0 to 2500;
	begin
		if reset='0' then internalclock <= '0';cnt:=0;           
                elsif (clk_default'event and clk_default='1')then
			if cnt = 2500 then
				internalclock<='1';
				cnt:=0;
			else
				internalclock<='0';
				cnt:=cnt+1;
			end if;	
		end if;
		clkout_5Khz<=internalclock;
	end process;

	process2:process(internalclock,reset)
	variable cnt:integer range 0 to 5000;
	begin
		if reset='0' then clkout_1Hz<='0';cnt:=0;           
                elsif (internalclock'event and internalclock='1')then
			if cnt = 5000 then
				clkout_1Hz<='1';
			else
				clkout_1Hz<='0';
				cnt:=cnt+1;
			end if;	
		end if;
	end process;

end main;

Met deze methode krijg ik na het synthetiseren:
Total logic cells required: 47
Total flipflops required: 27

Ik zou graag het aantal flipflops onder de 20-22 hebben, maar ik ben dus clueless hoe omdat ik in mijn inziens altijd zal moeten tellen tot 12 500 000 (de helft van een 25Mhz clock omdat ik enkel op de rising edge van de clock tel ).

Zoals ik al zei is de kans klein dat iemand mij hiermee kan helpen, maar ik wou toch eens proberen. Graag had ik het zelf gekund, maar ne mens moet ook weten wanneer hij om hulp moet vragen :D.

Mvg
Yannick Wellens

Reptiel

Legacy Member
veel succes allesinds

VHDL zit al wat te ver voor mij, jammer, want ik heb een jaar of 5 geleden ook een keer zoiets gemaakt.

Krueger

Legacy Member
Mij lijkt het in ieder geval niet mogelijk om minder dan 20 FF te hebben, voor de reden die je zelf aanhaalt. Tenzij je kan starten met een tragere klok natuurlijk.

Svenvdb

Legacy Member
Bij mij zit het ook net iets te ver om nog een goed antwoord te vinden.
Maar op het eerste zicht kan dit volgens mij toch niet korter. ( tenzij het echt veel te ver zit :) )

R|Jonas

Legacy Member
Bij mij zit het wat verser maar ik heb nooit geprobeerd om het aantal flip flops te minimaliseren. Als het werkt, was het goed :) Mss werken met clk <= not(clk) methodes ofzo?

yannick

Legacy Member
Bedankt voor de hulp alleszins :D.
Ik zal het eens vragen aan de prof en zal dan haar antwoord hier ff posten, ter informatie gewoon :).

Mvg
Yannick

Fraggie

Legacy Member
Ik zit in de knoop met het volgende:
je hebt een klok van 25MHz, en om de 2500 pulsjes inverteer je je klok. Dus je het per periode 5000pulsjes van 25MHz, dat komt neer op een nieuwe klok van 5kHz.

Nu werk je verder met die 5kHz en per 5000 pulsjes inverteer je je 1Hz klok. Maar voor de periode van die 1Hz klok heb je wel 10000 pulsjes van 5kHz, wat neer komt op 0.5Hz? ipv 1Hz?

Of kijk ik over iets?
Het archief is een bevroren moment uit een vorige versie van dit forum, met andere regels en andere bazen. Deze posts weerspiegelen op geen enkele manier onze huidige ideeën, waarden of wereldbeelden en zijn op sommige plaatsen gecensureerd wegens ontoelaatbaar. Veel zijn in een andere tijdsgeest gemaakt, al dan niet ironisch - zoals in het ironische subforum Off-Topic - en zouden op dit moment niet meer gepost (mogen) worden. Toch bieden we dit archief nog graag aan als informatiedatabank en naslagwerk. Lees er hier meer over of start een gesprek met anderen.
Terug
Bovenaan