これに対する答えを探してみましたが、役に立ちませんでした。コードを再合成すると問題が発生します。クロックの問題が原因ではないかと思われます。
外部水晶発振器を 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 はチップの半分しかアドレス指定できないというエラーが表示されます (これは面倒になると思います)。
ありがとう、
ネイサン