記事一覧

大雑把に1Hzをクロックする

2013年06月12日(水)00時26分

33MHzのクロックから約1Hzをつくります。

(33,000,000)10 *1 = (1 1111 0111 1000 1010 0100 0000) *2
なので 33MHzは25bit
そこで、33,000,000 / 2^25 *3 を計算すると 0.9834766Hz
1 / 0.9834766Hz ≒ 1.0168秒
まぁ、これくらいなら、よしとしましょうか(^_^;)

ここで、2進数のおさらい

例えば4bitは

0000
0001
0010
0011
0100
0101
0110
0111
1000
1001
---

1bit目に注目すると、0 1 0 1 0 1 0 1...
2bit目に注目すると、0 0 1 1 0 0 1 1...
3bit目に注目すると、0 0 0 0 1 1 1 1...

そうです、パルス、クロックですね。

最上位bitは1/2のサイクルで0,1を繰り返しているので、
25bitの最上位bitが0.9834766Hz、大雑把に1Hzのクロックということです。

また、下に1bitずらしていけば、2Hz 4Hz 8Hz...をつくることができます。

なお、非同期リセットを入れときました。
負論理になっています。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

entity  DIVIDER is
    port(
        CLK             : in  std_logic;
        RESET           : in  std_logic;    
        DIV_CLK_1HZ     : out std_logic;
        DIV_CLK_2HZ     : out std_logic;
        DIV_CLK_64HZ    : out std_logic
    );
end DIVIDER;

architecture RTL of DIVIDER is
    signal DIV_COUNTER : std_logic_vector(24 downto 0);

begin

    process(CLK,RESET)
    begin
        if (RESET = '0') then
            DIV_COUNTER <= (others => '0');
        elsif (CLK'event and CLK = '0') then
            DIV_COUNTER <= DIV_COUNTER + 1;
        end if;
    end process;
    
    DIV_CLK_1HZ <= not DIV_COUNTER(24);
    DIV_CLK_2HZ <= not DIV_COUNTER(23);
    DIV_CLK_64HZ <= not DIV_COUNTER(18);

end RTL;

*1:10進法の33,000,000という意味です
*2:同様に 2進数の 1 1111 0111 1000 1010 0100 0000 です
*3:2の25乗