1

これに対する答えを探してみましたが、役に立ちませんでした。コードを再合成すると問題が発生します。クロックの問題が原因ではないかと思われます。

外部水晶発振器を 25MHz から 50MHz に逓倍するために DCM を使用しています。ただし、水晶発振器は外部の物理コンポーネントであるため、ツールは水晶発振器の実際の周波数を認識していないと思います。私のコードは以下の通りです:

//since our crystal oscillator is only 25Mhz, we use a DCM to multiply it by two since the desired is 50Mhz
DCM #(
    .CLKFX_DIVIDE   (2), 
    .CLKFX_MULTIPLY (4) 
) dcm_master (
    .CLKFB    (CLK_FB), 
    .CLKIN    (CLK_crystal), 
    .RST      (DcmReset),    
    .CLK0     (MasterClk0Unbuf), 
    .CLK90    (), 
    .CLK180   (), 
    .CLK270   (), 
    .CLK2X    (), 
    .CLK2X180 (),    
    .CLKFX    (MasterClkFxUnBuf), 
    .CLKFX180 (),
    .CLKDV    (), 
    .LOCKED   (DcmLocked),
    .STATUS   (),
    .PSCLK    (1'b0),
    .PSEN     (1'b0),
    .PSINCDEC (1'b0),
    .PSDONE   ()    
); 

//we provide feedback to the DCM's phase input (possibly not neccessary)
BUFG bufg_master_dcm_clk_0  ( .I(MasterClk0Unbuf),  .O(CLK_FB) );
BUFG bufg_master_dcm_clk_fx ( .I(MasterClkFxUnBuf), .O(CLK_FX) );

//code taken from xilinx. We toggle using a bufgmux between the onboard and external clock
// BUFGMUX: Global Clock Buffer 2-to-1 MUX
// Spartan-3
// Xilinx HDL Libraries Guide, version 13.2
BUFGMUX BUFGMUX_inst (
.O(CLK), // Clock MUX output
.I0(CLK_FX), // Clock0 input
.I1(CLK_local), // Clock1 input
.S(sw[6]) // Clock select input
);

UCF のこのコードにより、ツールは DCM の出力を 50MHz として認識するようになりますか?

PIN "bufg_master_dcm_clk_fx.O" TNM_NET = CLK50;
TIMESPEC TS_CLKBuf = PERIOD "CLK50" 100 MHz HIGH 50%;  

さらに、BUFG を正しく使用していますか? ザイリンクスは、IBUFG を使用して外部クロックを DCM に接続する必要があると言いますが、BUFG はチップの半分しかアドレス指定できないというエラーが表示されます (これは面倒になると思います)。

ありがとう、

ネイサン

4

2 に答える 2

1

クロックの制約がオフになっていると思います。DCM への入力を制限する必要があります。DCM は出力の処理方法を認識しています。これが私が使用するものです:

NET clk_in TNM_NET = tnm_clk_in;
TIMESPEC TS_clk_in = PERIOD tnm_clk_in 40ns;

ここで、clk_in はクリスタル (この場合は CLK_crystal) です。クリスタルがデバイスのクロックピンに接続されていることを確認してください。

于 2013-07-02T00:19:32.770 に答える
0

最初にこれをテストしたかったのです。FPGA の Spartan-3 ファミリでは、DCM の 1 つを使用します。これは、ISE が生成するテンプレートです。

専用の CLK2X があることに注意してください。

また、ユーザー マニュアルによると、.CLKFB は BUFG ソースで駆動する必要があります。

     wire i_FeedBack;
     wire o_FeedBack;

     BUFG clkFBBuf(
            .I(i_FeedBack),
            .O(o_FeedBack)
     );


     DCM #(
 [...]
  .CLKFX_DIVIDE(1),   // Can be any integer from 1 to 32
  .CLKFX_MULTIPLY(2), // Can be any integer from 2 to 32
 [..]

 ) DCM_inst (
      .CLK0(i_FeedBack),     // 0 degree DCM CLK output
      .CLK2X(CLK2X),   // 2X DCM CLK output
      [...]
      .CLKFX(CLKFX),   // DCM CLK synthesis out (M/D)
      .CLKFB(o_FeedBack),   // DCM clock feedback
      .CLKIN(clk),   // Clock input (from IBUFG, BUFG or DCM)
      [...]
   );
于 2013-06-29T10:57:14.737 に答える