2017-04-14 9 views
1

スズについて言えば、16MHzクロックに分割したい100MHzクロック(Nexys 3 Spartan 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メガヘルツ、100メガヘルツから取得する最も簡単な方法は、4で乗算することで、その後、25で割るDCMも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) 
); 
によって出力を分割して同時に1 MHzのクロックを生成することができます

16MHzと1MHz出力の間には保証された位相関係はありません。

Spartan-6で利用可能なDCMおよびその他のクロッキングリソースの詳細については、ザイリンクスドキュメントUG382: Spartan-6 FPGA Clocking Resourcesを参照してください。

0

デジタル回路を備えた分数分周器を実装したいと思うようです。クロックの分割は分数なので、出力クロックは2クロック周期(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にリセットされないということである。ここで実装したものです。

関連する問題