Stephane1976
Stefke
ENTITY Klokdeler IS
PORT ( clk : IN STD_LOGIC;
reset : IN STD_LOGIC;
Q1 : BUFFER STD_LOGIC);
-- Q2 : BUFFER STD_LOGIC;
-- Q10 : BUFFER STD_LOGIC;
-- Q50 : BUFFER STD_LOGIC);
END Klokdeler;
ARCHITECTURE Behavioral OF Klokdeler IS
BEGIN
divider : PROCESS(clk, reset) IS
-- Interface signalen
VARIABLE cnt : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF(reset = '1') THEN
cnt := (OTHERS => '0');
ELSIF rising_edge(clk) THEN
IF(count1 = 49999999) THEN
cnt := 0;
Q2 <= NOT Q2;
ELSE
count1 := count1 + 1;
Q2 <= '0';
END IF;
END IF;
END PROCESS divider;
-- deler_50MHz : PROCESS(clk) IS
-- VARIABLE count2 : INTEGER := 0;
--
-- BEGIN
-- -- Frequentie van 1Hz
--
---- IF(count1 = 49999999) THEN
---- count1 := 0;
---- q1 <= '1';
---- ELSE
---- count1 := count1 + 1;
---- q1 <= '0';
---- END IF;
--
-- IF (rising_edge(clk)) then
--
-- -- Frequentie van 2Hz
-- IF(count2 = 24999999) THEN
-- count2 := 0;
-- Q2 <= NOT Q2;
-- ELSE
-- count2 := count2 + 1;
-- END IF;
-- END IF;
--
-- -- Frequentie van van 5Hz
-- -- IF(count5 = 10000000) THEN
-- -- count5 := 0;
-- -- q5 <= '1';
-- -- ELSE
-- -- count5 := count5 + 1;
-- -- q5 <= '0';
-- -- END IF;
--
-- -- Frequentie van
--
---- IF(count10 = 5000000) THEN
---- count10 := 0;
---- q10 <= '1';
---- ELSE
---- count10 := count10 + 1;
---- q10 <= '0';
---- END IF;
----
---- -- Frequentie van
---- IF(count50 = 5000000) THEN
---- count50 := 0;
---- q50 <= '1';
---- ELSE
---- count10 := count10 + 1;
---- q50 <= '0';
---- END IF;
--
-- END PROCESS deler_50MHz;
END Behavioral;
Kan iemand eens nazien dat het met één deeltal kan werken en hoe kan ik die uitgangen als bitvectors zetten want dat aanvaard de compiler niet als je iets toekent met logische operatoren.
- [edit - Aart] Tag verplaats imv leesbaarheid.
[Bericht gewijzigd door Aart op (1%)]
flipflop
"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein
TS, waarom wil je zoveel verschillende klokken maken? Je kunt beter het hele design op een enkere source clk laten lopen. Vervolgens maak je pulsjes op een lagere frequentie. Daarmee laat je dan bepaalde acties op een lagere snelheid lopen. Dus zoeiets:
PROCESS(clk, reset) IS
signal divider : STD_LOGIC_VECTOR(7 DOWNTO 0);
BEGIN
IF(reset = '1') THEN
divider <= (OTHERS => '0');
ELSIF rising_edge(clk) THEN
divider <= divider + 1;
END IF;
END PROCESS;
sec_pulse <= divider(7);
PROCESS(clk, reset) IS
signal count : STD_LOGIC_VECTOR(3 DOWNTO 0);
BEGIN
IF(reset = '1') THEN
count <= (OTHERS => '0');
ELSIF rising_edge(clk) THEN
IF(sec_pulse='1') THEN
count <= count + 1;
-- en al het andere wat je elke
-- seconde tick wilt doen
END IF;
END IF;
END PROCESS;
Op deze manier heb je nog maar een clk in je systeem, en dus ook een veel simpeler constraint voor je synthese.
Paar tips nog:
- Gebruik geen variabelen in synthetiseerbare code. Werkt alleen maar verwarrend als je vars en signals gaat mixen.
- Gebruik liever geen TABs, het schiet aan alle kanten buiten mn scherm. Gewoon spaties werkt veel handiger.
PS, code gaat nog niet helemaal goed omdat sec-pulse langer dan 1 clk cycle hoog is. Maar het gaat om het idee.