2013-03-18 2 views
1

Я попытался найти ответ на этот вопрос, но безрезультатно. У меня возникают проблемы, когда я повторно синтезирую свой код, и я подозреваю, что это связано с проблемами с часами.Силовой контакт в Verilog для конкретной частоты

Я использую DCM для умножения внешнего кварцевого генератора с 25 МГц до 50 МГц. Тем не менее, я думаю, что инструмент не будет знать, какая частота является кварцевым генератором, так как это внешний физический компонент. Мой код ниже:

//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 
); 

Будет ли этот код в УКУ перегружайте признать результаты моего DCM в 50МГц?

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

Кроме того, я использую BUFG правильно? Xilinx говорит, что я должен использовать IBUFG для подключения внешних часов к моему DCM, и я получаю ошибки, заявляя, что мой BUFG может использовать только половину чипа (что, я думаю, станет неприятным).

спасибо,

Натан

+0

Есть ли причина, по которой вы не можете просто использовать 'always @ (posedge CLK или negedge CLK)'? – N8TRO

+0

@Nathan G - это вызывает ошибку, если вы попытаетесь это сделать - «Стиль описания, который вы используете для описания регистра или защелки, не поддерживается в текущем выпуске программного обеспечения». Я не могу легко представить, как вы будете управлять флип-флопами с обоих краев тактовых импульсов. –

+0

Это вопрос о применении ограничений часов для синтеза, а не для реализации Verilog? – Morgan

ответ

0

Я хотел бы, чтобы проверить это первое. Для семейства FPGA Spartan-3, используя один из 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) 
     [...] 
    ); 
1

Я думаю, что ваши ограничения часов отключены. Вы должны ограничить ввод в DCM - DCM знает, что делать с выходами. Вот что я хотел бы использовать:

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

где clk_in является кристалл (CLK_crystal в вашем случае). Убедитесь, что кристалл подключен к часовому штырю на вашем устройстве.

Смежные вопросы