Перейти к содержанию
    

Проблема с тактовыми сигналами

Здравствуйте. Хочу затактировать с помощью Spartan 6 внешнее устройство. Для чего хочу использовать ODDR2 блок. В документе UG382 написано, что для улучшения характеристик такого сигнала выходного сигнала, клоки подаваемые на данный приметив (прямой и инвертированный) нужно взять с разных выводов DCM, к которым подключены отдельные BUFG. Однако если DCM не используется, а клок идёт напрямую с ножки GCLK, то можно использовать 2 буффера BUFIO2 (картинка 1-15 UG382). При этом на картинке присутствует BUFG а в тексте нет. Но как бы то не было, я собрал всё как написано:

module S6_ADC
        (
            input wire CLK_100,
            output wire ADC_CLK,
            input wire [7:0] ADC_IN,
            output wire PWRDWN,
            output wire [7:0] ADC_O
        );



wire clk_to_ddr, clk_to_ddr_inv;
reg [7:0] adc_o_reg;
wire CLK_50, CLK_50_180, CLK_50_g;
    
//assign PWRDWN = ~LOCKED;
assign PWRDWN = 1'b0;

/*BUFG BUFG_inst (
      .O(CLK_50_g), // 1-bit output: Clock buffer output
      .I(CLK_100)  // 1-bit input: Clock buffer input
   );*/

BUFIO2 #(
        .DIVIDE(2),             // DIVCLK divider (1,3-8)
        .DIVIDE_BYPASS("TRUE"), // Bypass the divider circuitry (TRUE/FALSE)
        .I_INVERT("FALSE"),     // Invert clock (TRUE/FALSE)
        .USE_DOUBLER("TRUE")   // Use doubler circuitry (TRUE/FALSE)
    )
   BUFIO2_diret 
   (
      .DIVCLK(DIVCLK),             // 1-bit output: Divided clock output
      .IOCLK(clk_to_ddr),               // 1-bit output: I/O output clock
      .SERDESSTROBE(SERDESSTROBE), // 1-bit output: Output SERDES strobe (connect to ISERDES2/OSERDES2)
      .I(CLK_100)                        // 1-bit input: Clock input (connect to IBUFG)
   );
   
    BUFIO2 #(
      .DIVIDE(1),             // DIVCLK divider (1,3-8)
      .DIVIDE_BYPASS("TRUE"), // Bypass the divider circuitry (TRUE/FALSE)
      .I_INVERT("TRUE"),     // Invert clock (TRUE/FALSE)
      .USE_DOUBLER("FALSE")   // Use doubler circuitry (TRUE/FALSE)
   )
   BUFIO2_invert (
      .DIVCLK(DIVCLK),             // 1-bit output: Divided clock output
      .IOCLK(clk_to_ddr_inv),               // 1-bit output: I/O output clock
      .SERDESSTROBE(SERDESSTROBE), // 1-bit output: Output SERDES strobe (connect to ISERDES2/OSERDES2)
      .I(CLK_100)                        // 1-bit input: Clock input (connect to IBUFG)
   );


ODDR2 #(
      .DDR_ALIGNMENT("C0"), // Sets output alignment to "NONE", "C0" or "C1" 
      .INIT(1'b0),    // Sets initial state of the Q output to 1'b0 or 1'b1
      .SRTYPE("ASYNC") // Specifies "SYNC" or "ASYNC" set/reset
    ) ODDR2_inst (
      .Q(ADC_CLK),   // 1-bit DDR output data
      .C0(clk_to_ddr),   // 1-bit clock input
      .C1(clk_to_ddr_inv),   // 1-bit clock input
      .CE(1'b1), // 1-bit clock enable input
      .D0(1'b1), // 1-bit data input (associated with C0)
      .D1(1'b0), // 1-bit data input (associated with C1)
      .R(1'b0),   // 1-bit reset input
      .S(1'b0)    // 1-bit set input
   );        

always@(posedge CLK_100)
adc_o_reg <= ADC_IN;

assign ADC_O = adc_o_reg;

endmodule

 

В итоге получил от такую ошибку

ERROR:Place:1136 - This design contains a global buffer instance,
   <CLK_100_ibuf>, driving the net, <CLK_100_c>, that is driving the following
   (first 30) non-clock load pins.
   < PIN: BUFIO2_invert.I; >
   < PIN: BUFIO2_diret.I; >
   < PIN: BUFIO2_diret.IB; >
   This is not a recommended design practice in Spartan-6 due to limitations in
   the global routing that may cause excessive delay, skew or unroutable
   situations.  It is recommended to only use a BUFG resource to drive clock
   loads. If you wish to override this recommendation, you may use the
   CLOCK_DEDICATED_ROUTE constraint (given below) in the .ucf file to demote
   this message to a WARNING and allow your design to continue.
   < PIN "CLK_100_ibuf.O" CLOCK_DEDICATED_ROUTE = FALSE; >
ERROR:Pack:1654 - The timing-driven placement phase encountered an error.

Я добавил рекомендуемый констрейн:

PIN "CLK_100_ibuf.O" CLOCK_DEDICATED_ROUTE = FALSE;

Но опять получил ошибку:

ERROR:Place - ConstraintResolved NO placeable site for BUFIO2_invert
ERROR:Place - SIO has over-constrained componet BUFIO2_invert to have to
   placeable sites. Constraints come from driver constraints AND load IO
   constraints

Что происходит?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Отставить. Прочитал в UG, что BUFIO2 может тактировать лишь OSERDES2. А есть ли способ тактировать входы ODDR без использования BUFG (но при этом не использовать для инвертирования пользовательскую логику)?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну можно использовать DCM/PLL блок, которых в спартанах хватает, особенно если вы их не используете. Поставьте ему 1 к 1, и сформируйте 2 сигнала прямой и инверсный.

 

Если вам нужна 2 фронта сдвинутые на 180 градусов, они же откуда то должны взяться. Так что либо инверсия клока, либо DCM/PLL блок, как иначе то?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Так что либо инверсия клока, либо DCM/PLL блок, как иначе то?

Это беспорно. Собственно в гайде так и написано, единственное, что после выходов DCM должны стоять BUFG, а так как их не так много, я бы и хотел узнать, можно как то без них обойтись?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Это беспорно. Собственно в гайде так и написано, единственное, что после выходов DCM должны стоять BUFG, а так как их не так много, я бы и хотел узнать, можно как то без них обойтись?

BUFG нужен в любом случае, но инвертор можно использовать не на пользовательской логике, а внутри OSERDES блока. Таким образом экономится PLL.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как инвертор из OSERDESа взять, я что-то не вижу его на схеме.

 

по поводу BUFG не факт что он нужен в любом случае.

https://forums.xilinx.com/t5/7-Series-FPGAs...ufg/td-p/495302

по спартанам

https://www.xilinx.com/support/documentatio...uides/ug382.pdf

Вроде как если взять близки DCM к выходам, то можно будет обойтись из без буферов. Хотя, наверное, в этом случае можно было и просто инвертор на входе второго клока поставить и не парится вообще.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Да мне не OSERDES нужен, а ODDR (я думал, что ODDR можно тактировать с помощью BUFIO2). Но в любом случае, я так понял что без BUFG не обойтись (во всяком случае для Spartan 6). Большое спасибо за помощь!

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А как инвертор из OSERDESа взять, я что-то не вижу его на схеме.

 

по поводу BUFG не факт что он нужен в любом случае.

https://forums.xilinx.com/t5/7-Series-FPGAs...ufg/td-p/495302

по спартанам

https://www.xilinx.com/support/documentatio...uides/ug382.pdf

Вроде как если взять близки DCM к выходам, то можно будет обойтись из без буферов. Хотя, наверное, в этом случае можно было и просто инвертор на входе второго клока поставить и не парится вообще.

Если клоковый сигнал надо притащить на OSERDES, то тут без клоковых цепей не обойтись никак. Можно видимо заменить BUFG на BUFIO или что-то подобное, но тут надо тщательно рассматривать конкретику проекта.

Инвертор там есть, поглядите в XDE.

 

 

Да мне не OSERDES нужен, а ODDR (я думал, что ODDR можно тактировать с помощью BUFIO2). Но в любом случае, я так понял что без BUFG не обойтись (во всяком случае для Spartan 6). Большое спасибо за помощь!

ODDR - частный случай OSERDES.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

ODDR - частный случай OSERDES.

Да, это я понимаю, но как мне кажется генеить на нём внешний клок не слишком удобно, да и наверно избыточно. Впрочем если с BUFG напряг, то почему нет...

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...