33MHzのクロックから正確に1Hzをつくります。(分周)
クロックは負論理なので、立下りエッジをとっています。
クロックが33MHzということなので、33,000,000 / 2 = 16,500,000回ごとに0,1を交互に出力します。
したがって、立下りエッジが 16,500,000 - 1 = 16,499,999 になったときに出力を反転すればよいことになります。
ちなみに、(16499999)10*1 = (111110111100010100011111)2*2 で24bitです。
-- Divider 33MHz -> 1Hz
-- CLOCK: falling_edge
library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;
entity DIVIDER1HZ is
port(
CLK : in std_logic;
DIV_CLK : out std_logic
);
end DIVIDER1HZ;
architecture RTL of DIVIDER1HZ is
signal DIV_COUNTER : std_logic_vector(23 downto 0);
signal DIV_CLK_TMP : std_logic;
begin
process(CLK)
begin
if (CLK'event and CLK = '0') then
if (DIV_COUNTER = "111110111100010100011111") then -- 33M/2 - 1
DIV_COUNTER <= (others => '0');
DIV_CLK_TMP <= not DIV_CLK_TMP;
else
DIV_COUNTER <= DIV_COUNTER + 1;
end if;
end if;
end process;
DIV_CLK <= DIV_CLK_TMP;
end RTL;
*1:10進法の16499999という意味です。
*2:同様に2進法の111110111100010100011111です。