2017-04-14 2 views
1

주석에서 말했듯이, 16MHz 클록으로 나눠서 원하는 100MHz 클럭 (Nexys 3 스파르탄 6 보드에서 가져온 것)이 있습니다. 문제없이 1Mhz 및 60Hz 클럭을 만들었지 만 깨끗한 16MHz 신호를받는 데 문제가 있습니다.100MHz 클록을 16MHz 클록으로 나누기 [Verilog]

여기에 나는 현재 시험하고있어 무엇 :

module clk_gen(
    input clk_100MHz, 
     output reg clk_16MHz, 
    output reg clk_1MHz, 
    output reg clk_1s); 

integer count_16MHz; 
integer count_1MHz; 
integer count_1s; 
integer skip_cnt; 

initial begin 
    count_16MHz = 1; 
    count_1MHz = 1; 
    count_1s = 1; 
    skip_cnt = 1; 
    clk_1s = 1'b0; 
    clk_1MHz = 1'b0; 
    clk_16MHz = 1'b0; 
end 

//16MHz 
[email protected](posedge clk_100MHz) begin 
    //8*(100Mhz/6.25) == 7*(100MHz/6)+((100MHz/8)) 
    if((skip_cnt == 8) & (count_16MHz == 4)) begin 
     clk_16MHz = ~clk_16MHz; 
     skip_cnt = 1; 
     count_16MHz = 1; 
    end 
    else if((skip_cnt < 8) & (count_16MHz == 3)) begin 
     clk_16MHz = ~clk_16MHz; 
     skip_cnt = skip_cnt + 1; 
     count_16MHz = 1; 
    end 
    count_16MHz = count_16MHz + 1; 
end 
//1MHz 
[email protected](posedge clk_100MHz) begin 
    if(count_1MHz == 50) begin 
     clk_1MHz = ~clk_1MHz; 
     count_1MHz = 1; 
    end 
    count_1MHz = count_1MHz + 1; 
end 

내 1MHz의를 가지고 60Hz의가 (1 초) 분할하지만, 16MHz 일이 고통되고 있습니다. 더 나은 방법이 있습니까 (Verilog에 머무르는 동안)?

불행히도 1MHz 클럭주기 사이에 16 번 발생하는 시프 팅 동작으로 인해 매우 엄격한 16MHz가 필요합니다. 내 유일한 다른 공격 방법은 아마도 1MHz를 느리고 더 쉽게 16으로 나눈 값으로 낮추는 것입니다.

답변

0

FPGA에서 사용할 수있는 클럭킹 리소스를 사용하십시오.

Spartan-6을 사용하고 있으므로 DCM_CLKGEN 및 DCM_SP 프리미티브에 액세스 할 수 있습니다. 이들을 설정하는 가장 쉬운 방법은 자일링스 클록 킹 마법사를 사용하는 것이지만, Verilog로 실제로하고 싶다면 직접 DCM_CLKGEN을 인스턴스화 할 수 있습니다. 다음 16

DCM_CLKGEN #(
    .CLKIN_PERIOD("100 MHZ"), 
    .CLKFX_MULTIPLY(4), 
    .CLKFX_DIVIDE(25), 
    .CLKFXDV_DIVIDE(16) 
) clkgen_100to16and1 (
    .RST  (1'b0), 
    .CLKIN (clk_100MHz), 
    .CLKFX (clk_16MHz), 
    .CLKFXDV (clk_1MHz) 
); 
의한 출력을 나누어 DCM가 동시에 1 MHz의 클럭을 생성 할 수있다 (25)에 의해 나누어, 4 곱하기 100 MHz의 MHz의 16 내지

쉬운 방법을 얻는

16MHz와 1MHz 출력 간에는 보장 된 위상 관계가 없음에 유의하십시오.

Spartan-6에서 사용할 수있는 DCM 및 기타 클럭 리소스에 대한 자세한 내용은 Xilinx 문서 UG382: Spartan-6 FPGA Clocking Resources을 참조하십시오.

0

디지털 회로로 분수 클럭 분배기를 구현하려는 것 같습니다. 클록의 분할이 분수이기 때문에 출력 클록은 두 클럭주기 (100MHz 클럭의 6 ~ 7주기 사이)에서 지터가되지만 평균은 100/16 = 6.25주기가됩니다. 시계 기간이 발생했을 때 그것은 단지 (100)에 의해 감소됩니다,

[email protected](posedge clk_100MHz) begin 
    count_16MHz = count_16MHz + 16; 
    if(count_16MHz >= 100) begin 
    clk_16MHz = 1; 
    count_16MHz = count_16MHz - 100; 
    end 
    else if(count_16MHz >= 50) begin 
    clk_16MHz = 0 
    end 
end 

디바이더에 대한 중요한 것은 그것이 0으로 재설정되지 않는다는 것입니다 : 여기에 구현입니다.