Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Проблема с тактовыми сигналами
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
Грендайзер
Здравствуйте. Хочу затактировать с помощью 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 (но при этом не использовать для инвертирования пользовательскую логику)?
Golikov A.
Ну можно использовать DCM/PLL блок, которых в спартанах хватает, особенно если вы их не используете. Поставьте ему 1 к 1, и сформируйте 2 сигнала прямой и инверсный.

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

Это беспорно. Собственно в гайде так и написано, единственное, что после выходов DCM должны стоять BUFG, а так как их не так много, я бы и хотел узнать, можно как то без них обойтись?
Bad0512
Цитата(Грендайзер @ May 30 2017, 13:55) *
Это беспорно. Собственно в гайде так и написано, единственное, что после выходов DCM должны стоять BUFG, а так как их не так много, я бы и хотел узнать, можно как то без них обойтись?

BUFG нужен в любом случае, но инвертор можно использовать не на пользовательской логике, а внутри OSERDES блока. Таким образом экономится PLL.
Golikov A.
А как инвертор из 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). Большое спасибо за помощь!
Bad0512
Цитата(Golikov A. @ May 30 2017, 14:50) *
А как инвертор из 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.


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

ODDR - частный случай OSERDES.
Грендайзер
Цитата
ODDR - частный случай OSERDES.

Да, это я понимаю, но как мне кажется генеить на нём внешний клок не слишком удобно, да и наверно избыточно. Впрочем если с BUFG напряг, то почему нет...
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.