Грендайзер 0 29 мая, 2017 Опубликовано 29 мая, 2017 · Жалоба Здравствуйте. Хочу затактировать с помощью 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 Что происходит? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 29 мая, 2017 Опубликовано 29 мая, 2017 · Жалоба Отставить. Прочитал в UG, что BUFIO2 может тактировать лишь OSERDES2. А есть ли способ тактировать входы ODDR без использования BUFG (но при этом не использовать для инвертирования пользовательскую логику)? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 мая, 2017 Опубликовано 30 мая, 2017 · Жалоба Ну можно использовать DCM/PLL блок, которых в спартанах хватает, особенно если вы их не используете. Поставьте ему 1 к 1, и сформируйте 2 сигнала прямой и инверсный. Если вам нужна 2 фронта сдвинутые на 180 градусов, они же откуда то должны взяться. Так что либо инверсия клока, либо DCM/PLL блок, как иначе то? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 30 мая, 2017 Опубликовано 30 мая, 2017 · Жалоба Так что либо инверсия клока, либо DCM/PLL блок, как иначе то? Это беспорно. Собственно в гайде так и написано, единственное, что после выходов DCM должны стоять BUFG, а так как их не так много, я бы и хотел узнать, можно как то без них обойтись? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 30 мая, 2017 Опубликовано 30 мая, 2017 · Жалоба Это беспорно. Собственно в гайде так и написано, единственное, что после выходов DCM должны стоять BUFG, а так как их не так много, я бы и хотел узнать, можно как то без них обойтись? BUFG нужен в любом случае, но инвертор можно использовать не на пользовательской логике, а внутри OSERDES блока. Таким образом экономится PLL. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Golikov 0 30 мая, 2017 Опубликовано 30 мая, 2017 · Жалоба А как инвертор из OSERDESа взять, я что-то не вижу его на схеме. по поводу BUFG не факт что он нужен в любом случае. https://forums.xilinx.com/t5/7-Series-FPGAs...ufg/td-p/495302 по спартанам https://www.xilinx.com/support/documentatio...uides/ug382.pdf Вроде как если взять близки DCM к выходам, то можно будет обойтись из без буферов. Хотя, наверное, в этом случае можно было и просто инвертор на входе второго клока поставить и не парится вообще. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 30 мая, 2017 Опубликовано 30 мая, 2017 · Жалоба Да мне не OSERDES нужен, а ODDR (я думал, что ODDR можно тактировать с помощью BUFIO2). Но в любом случае, я так понял что без BUFG не обойтись (во всяком случае для Spartan 6). Большое спасибо за помощь! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 31 мая, 2017 Опубликовано 31 мая, 2017 · Жалоба А как инвертор из 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Грендайзер 0 31 мая, 2017 Опубликовано 31 мая, 2017 · Жалоба ODDR - частный случай OSERDES. Да, это я понимаю, но как мне кажется генеить на нём внешний клок не слишком удобно, да и наверно избыточно. Впрочем если с BUFG напряг, то почему нет... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться