2013-08-08 1 views

답변

2

기본 클럭은 외부 클럭을 기반으로해야하며 Spartan-3 FPGA의 내부 리소스를 통해서만 생성 될 수 없습니다. 필요한 경우, Spartan-3 FPGA DCM (Digital Clock Manager) 리소스를 사용하여 외부 클럭을 스케일 할 수 있습니다. 합성 VHDL 코드 자체는 시계를 생성 할 수 없습니다.

높은 주파수 (예 : 100MHz)에서 기본 클록을 얻으면이를 쉽게 분리하여 외부 입력의 샘플링을 위해 1kHz의 표시를 생성 할 수 있습니다.

+0

스파르탄 3 디바이스 DCM은 (메모리가 ~ 4MHz 인 경우) 몇 MHz 미만의 것을 출력 할 수 없다고 생각합니다. 간단하게 사용할 수있는 논리가 트릭을 수행해야한다고 명시했습니다. – Doov

+0

@FarhadA 아니, 왜? http://www.xilinx.com/support/documentation/user_guides/ug331.pdf 스파르탄 3a-dsp의 최소 DCM 입력 주파수는 5MHz입니다 (동일한 PDF의 81 페이지 참조). 최소 clkfx 출력은 5MHz입니다 (~ 4MHz I 기준). 스파르탄 3a-dsp에서 할 수있는 가장 좋은 것은 16입니다. 5MHz/16은 312kHz입니다 (따라서 몇 MHz 미만이지만 내 포인트는 여전히 유효합니다). 마지막으로 1000Hz * 16 <<< 5MHz를 확인했습니다. 내가 여기에 뭔가를 놓치지 않는 한 ... – Doov

+0

음 @Doov "DFS 유닛 클럭 입력 주파수 요구 사항"에서 "입력 클록 주파수 범위"아래 섹션을 놓친 것 같습니다.당신이 그걸보고 "디지털 주파수 합성기 (DFS)"를 검색하면, 당신이 말한 것은 DLL에만 유효하지만 "DFS_FREQUENCY_MODE"가 사용될 때는 그렇지 않다는 것을 알 수 있습니다. – FarhadA

1

사용할 수있는 클록 주파수에 따라 다릅니다. 20MHz 클록 소스가있는 경우 1KHz를 얻으려면 20000으로 나눠야합니다. VHDL로 할 수도 있고 DCM을 사용하여 할 수도 있습니다.

이는 20MHz의 입력에서 1kHz의 클럭을 생성하는 방법에 대한 일 예에서이다

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 

entity clk20Hz is 
    Port (
     clk_in : in STD_LOGIC; 
     reset : in STD_LOGIC; 
     clk_out: out STD_LOGIC 
    ); 
end clk200Hz; 

architecture Behavioral of clk20Hz is 
    signal temporal: STD_LOGIC; 
    signal counter : integer range 0 to 10000 := 0; 
begin 
    frequency_divider: process (reset, clk_in) begin 
     if (reset = '1') then 
      temporal <= '0'; 
      counter <= 0; 
     elsif rising_edge(clk_in) then 
      if (counter = 10000) then 
       temporal <= NOT(temporal); 
       counter <= 0; 
      else 
       counter <= counter + 1; 
      end if; 
     end if; 
    end process; 

    clk_out <= temporal; 
end Behavioral; 
+0

이 시계를 20000으로 나누시겠습니까? –

+0

그럼 매 20k 펄스마다 전체 사이클을 제공하는 매 10k 사이클마다 시계를 토글합니다 – FarhadA

+2

마다 10001 사이클이 아닌가요? –

5

낮은 주파수 클록 신호를 생성하는 카운터를 사용하지 않는다.

FPGA의 여러 클록 주파수는 다양한 디자인 문제를 야기하는데, 그 중 일부는 "고급 주제"라는 제목 아래에 있으며 필요한 경우 모두 처리되고 해결 될 수 있지만 단일 고속 클록은 더 간단하고 일반적으로 더 나은 실행 (동기식 설계)입니다.

대신 FPGA 보드가 제공하는 빠른 클럭을 사용하고 클럭 신호가 아닌 클록 인 에이블로서 클럭 신호로 사용하여보다 낮은 주파수 타이밍 신호를 생성하십시오.

DLL, DCM, PLL 및 기타 클럭 관리자는 용도가 있지만 1kHz 클록 신호를 생성하는 것은 일반적으로 제한 사항이 허용 되더라도 좋은 용도로 사용되지 않습니다. 이 응용 프로그램은 단지 클럭 활성화를 위해 울부 짖고 있습니다 ...

또한 마법 번호를 사용하지 마십시오. VHDL 컴파일러가 작업을 수행하게하십시오! 타이밍 요구 사항을 패키지에 넣었으므로 테스트 벤치와이를 사용해야하는 다른 요소와 타이밍 요구 사항을 공유 할 수 있습니다.

package timing is 

    -- Change the first two constants to match your system requirements... 
    constant Clock_Freq : real := 40.0E6; 
    constant Sample_Rate : real := 1000.0; 

    -- These are calculated from the above, so stay correct when you make changes 
    constant Divide  : natural := natural(Clock_Freq/Sample_Rate); 
    -- sometimes you also need a period, e.g. in a testbench. 
    constant clock_period : time := 1 sec/Clock_Freq; 

end package timing; 

그리고 다음과 같이 우리는 샘플러를 작성할 수 (나는 시계가 시계가 수의 사용을 명확히하기 위해 별도의 프로세스로 출력 가능 분할했지만, 두 프로세스가 쉽게 몇 가지 더 하나에 출시 될 수있다 "샘플"신호는 불필요합니다.)

library IEEE; 
use IEEE.STD_LOGIC_1164.ALL; 
use IEEE.numeric_std.all; 
use work.timing.all; 

entity sampler is 
    Port (
     Clock : in std_logic; 
     Reset : in std_logic; 
     ADC_In : in signed(7 downto 0); 
     -- signed for audio, or unsigned, depending on your app 
     Sampled : out signed(7 downto 0); 
    ); 
end sampler; 

architecture Behavioral of Sampler is 
    signal Sample : std_logic; 
begin 

    Gen_Sample : process (Clock,Reset) 
    variable Count : natural; 
    begin 
     if reset = '1' then 
      Sample  <= '0'; 
      Count  := 0; 
     elsif rising_edge(Clock) then 
      Sample  <= '0'; 
      Count  := Count + 1; 
      if Count = Divide then 
       Sample <= '1'; 
       Count := 0; 
      end if; 
     end if; 
    end process; 

    Sample_Data : process (Clock) 
    begin 
     if rising_edge(Clock) then 
      if Sample = '1' then 
       Sampled <= ADC_In; 
      end if; 
     end if; 
    end process; 

end Behavioral;