2007년 7월 19일 목요일

Emailing: [VHDL]01-클럭 짝수분주

 

[VHDL]01-클럭 짝수분주

하드웨어

2005/12/26 10:55

VHDL을 하면서 가장 처음 접하는것이 클럭 분주일 것입니다.

가장 간단하면서도 가장 많이 쓰이고, 가장 중요한 것이기 때문이지요.

 

짝수분주는 단순히 자신이 원하는 분주의 수를 반으로 나눠서 그 위상을 반전시켜주기만 하면 아주 간단 합니다.

물론 분주의 숫자가 커지면 카운터를 사용하는것이 간단하게 구성되지만, 2분주나 4분주 같은경우에는 굳이 카운터를 쓰지 않아도 되지요..

 

2분주를 하기 위해서 필요한건 사실 FF하나만 쓰면 되니까 정말 필요한건 거의 없구요.

우선 2분주의 예를 보겠습니다.

 

-- Clk_div2.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity Clk_div2 is
    Port(
  clk_in : in std_logic;    --원 소스클럭 입력

  reset : in std_logic;     --초기화를 위한 리셋입력
  div2 : out std_logic      --2분주된 클럭 출력

          );
End Clk_div2;

 

Architecture arch_Clk_div2 of Clk_div2 is
Begin
Clock_div : Process(clk_in)
 Begin

  If reset = '1' then

    div2 <= '0';

  ElsIf clk_in'event and clk_in = '1' then
    div2 <= not div2;
  End If;
 End process;
End arch_Clk_div2;

 

아키텍쳐 부분에서 해주는것 없이 아주 간단하게 해결되지요??

그저 클럭이 high로 바뀔때마다 출력되는 div2의 값을 반전만 시켜주면 2분주가됩니다.

4분주의 경우에는 ElsIf 안에 한번 더 div2가 바뀔때마다 반전 시켜서 출력해 주면 끝이구요..

그 이상의 경우에도 마찬가지 방법을 적용하면 됩니다. 하지만 숫자가 늘어나면 자신도 햇갈리니까 카운터를 쓸 수 밖에 없겠지요??

그럼 이제 카운터를 사용한 16분주를 구성해 보겠습니다.

16분주로 구성하려면 카운터는 8까지 셀 수 있어야 하니까 3비트 카운터가 있어야 되겠군요.

-- Clk_div16.vhd

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

Entity Clk_div16 is
    Port(
  clk_in : in std_logic;    --원 소스클럭 입력

  reset : in std_logic;     --초기화를 위한 리셋입력
  div16 : out std_logic    --16분주된 클럭 출력

          );
End Clk_div16;

 

Architecture arch_Clk_div16 of Clk_div16 is

  signal cnt8 : std_logic_vector(2 downto 0); --8개를 세기 위한 3비트 카운터
Begin
Clock_div : Process(clk_in)
 Begin

  If reset = '1' then

    div16 <= '0';

    cnt8 <= "111";                                      --카운터 값을 초기화(리셋이 풀리면 카운터 값이 0이 되고, 이 첫클럭에서 분주를 시작하도록 하기위해서 111을 초기값으로 했습니다.)

  ElsIf clk_in'event and clk_in = '1' then

    cnt8 <= cnt8 + '1';
    If cnt8 = "000" then

      div16 <= not div16;

    End If;
  End If;
 End process;
End arch_Clk_div16;

이것도 역시 엄청 간단하지요??

짝수분주는 위의 예문처럼 아주 간단하게 해결됩니다...

음.. 하지만 위의 카운터를 사용한 16분주에는 정확히 자신이 원하는 결과는 나오지 않을 겁니다.

힌트를 드리자면, 리셋이 풀리면서 첫클럭이 들어올 때 동작한다는 내용이지요.

그래도 클럭은 정확히 16분주가 되지만 첫번째 클럭부터 동작하지는 않는다는 것이지요(사용하는 프로그램에 따라서 000에 반전되는것과, 001에 반전되는것이 있을껍니다.)

이에 관한 내용은 우선 이유를 생각해 보시길... 물론 여기에 관한 내용도 다른 주제로 여기에 올릴 예정 입니다.

출력하기 취소

댓글 없음: