2007년 7월 19일 목요일

Emailing: [VHDL] 02-홀수클럭 분기

 

[VHDL] 02-홀수클럭 분기

하드웨어

2005/12/28 11:50

홀수 클럭 분주는 짝수 클럭의 분주와는 조금 다른 프로세스를 거치게 됩니다.

짝수 클럭분주에서는 원하는 클럭의 절반까지만 카운트 하면 되지만, 홀수에서는 원하는 클럭 만큼 카운트 해야 문제 없이 분주가 이루어 지기 때문에 사용되는 어레이가 좀더 늘어나게 됩니다.(물론 다른 방법을 사용해서 줄여주는 방법도 있지만 기본적인 정석으로 설명할까 합니다.)

또한 홀수분주의 클럭 카운터에서는 라이징 에지와 폴링 에지를 모두 이용해야 하므로, 두개의 프로세스로 나누어서 구성해야 합니다.

VHDL에서는 하나의 프로세스에서 동일한 신호가 라이징 에지와 폴링에지를 모두 이용할 수 없기 때문에 별도의 신호를 만들어서 동작하도록 해야 하기 때문입니다.

 

아래는 5분주를 하는 클럭의 코드 입니다.

-- Clk_Gen.vhd

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

Entity Clk_gen is
    Port(
  clk_in : in std_logic;    --클럭입력
  div5 : out std_logic    --5분주 클럭
          );
End Clk_gen;

Architecture arch_Clk_gen of Clk_gen is
 signal cnt_div : std_logic_vector(2 downto 0) := "111";
 signal div_temp : std_logic := '0';
Begin
counter : Process(clk_in)
 Begin
  If clk_in'event and clk_in = '1' then
   cnt_div <= cnt_div + '1';
   If cnt_div = 4 then
    cnt_div <= "000";
   End If;
 End If;
    End process;
div5_clock : Process(clk_in, cnt_div)
 Begin
  If (cnt_div > 2 or (cnt_div = 2 and clk_in = '0')) then
   div5 <= '0';
  Else
   div5 <= '1';
  End If;
 End Process;
End arch_Clk_gen;

 

확실히 검증까지는 안해봐서 에러 없이 동작 하는지는 확인을 안해봤네요 하지만 문제는 없을 것이구요.

 

대신 다른 문제점이 숨어 있습니다.(공부하는 초반에는 걱정할 필요가 없긴 합니다만, 실제 구성에서는 매우 치명적인 문제가 될 소지가 있지요)

문제는 역시 폴링 에지를 이용하는 클럭 반전 위치 에서인데요.

이부분을 처리하는 과정에서 위의 코드를 그대로 쓴다면, 프로그램이나, 실제 사용할 FPGA, CPLD등의 게이트 성능에 따라서 게이트 시간 차에 의한 클리핑이 발생할 수 있습니다.

이 결과를 확인하는 방법은 역시 시뮬레이션인데 폴링에지에서 반전되는 클럭을 확대해서 보시면 나올 수도 있습니다.

출력하기 취소

댓글 없음: