記事一覧

正確に1Hzをクロックする

2013年06月11日(火)22時05分

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です。