将Verilog中的引脚强制为特定频率

时间:2013-03-18 15:40:00

标签: verilog clock xilinx

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

我使用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只能解决一半芯片(我想这会变得麻烦)。

感谢,

内森

2 个答案:

答案 0 :(得分:1)

我认为你的时钟限制是关闭的。您应该限制DCM的输入 - DCM知道如何处理输出。这是我要用的:

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

其中clk_in是晶体(在你的情况下是CLK_crystal)。确保晶振已连接到设备上的时钟引脚。

答案 1 :(得分: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)
      [...]
   );