|
|
  |
Проблема с тактовыми сигналами |
|
|
|
May 29 2017, 19:53
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Здравствуйте. Хочу затактировать с помощью 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 Что происходит?
|
|
|
|
|
May 30 2017, 06:55
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата Так что либо инверсия клока, либо DCM/PLL блок, как иначе то? Это беспорно. Собственно в гайде так и написано, единственное, что после выходов DCM должны стоять BUFG, а так как их не так много, я бы и хотел узнать, можно как то без них обойтись?
|
|
|
|
|
May 31 2017, 02:17
|
Знающий
   
Группа: Свой
Сообщений: 802
Регистрация: 11-05-07
Из: Томск
Пользователь №: 27 650

|
Цитата(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.
|
|
|
|
|
May 31 2017, 06:02
|
Местный
  
Группа: Участник
Сообщений: 368
Регистрация: 18-04-11
Из: Город-герой Москва
Пользователь №: 64 451

|
Цитата ODDR - частный случай OSERDES. Да, это я понимаю, но как мне кажется генеить на нём внешний клок не слишком удобно, да и наверно избыточно. Впрочем если с BUFG напряг, то почему нет...
|
|
|
|
|
  |
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|