Принудительный контакт в 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
);

Будет ли этот код в ucf заставлять инструмент распознавать выходной сигнал моего 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 могут адресовать только половину чипа (что, как я полагаю, станет проблематичным).

Спасибо,

Натан


person Nathan Hutton    schedule 18.03.2013    source источник
comment
Есть ли причина, по которой вы не можете просто использовать always @ (posedge CLK or negedge CLK)?   -  person N8TRO    schedule 19.03.2013
comment
@Nathan G - если вы попытаетесь это сделать, выдается ошибка - стиль описания, который вы используете для описания регистра или защелки, не поддерживается в текущей версии программного обеспечения. Я не могу легко представить, как вы будете управлять триггерами с обоих краев часов.   -  person Nathan Hutton    schedule 19.03.2013
comment
Это вопрос о применении ограничений часов для синтеза, а не реализации Verilog?   -  person Morgan    schedule 25.03.2013
comment
@Морган - это правильно   -  person Nathan Hutton    schedule 27.03.2013


Ответы (2)


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

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

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

person Doov    schedule 02.07.2013

Я хотел бы проверить это в первую очередь. Для семейства 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)
      [...]
   );
person GCon    schedule 29.06.2013