1

我试图寻找这个问题的答案,但无济于事。当我重新综合我的代码时遇到问题,我怀疑这是由于时钟问题。

我正在使用 DCM 将外部晶体振荡器从 25MHz 放大到 50MHz。但是,我认为该工具不会知道晶体振荡器的实际频率,因为它是一个外部物理组件。我的代码如下:

//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?Xilinx 说我应该使用 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

我本来想先测试一下。对于 Spartan-3 系列 FPGA,使用其中一个 DCM。这是 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 回答