Jump to content

    

Проверка плис при отсутствии clk

RobFPGA

вопрос скорее академический: а как можно хотя бы примерно оценить получающуюся частоту? (время задержки для lut1 специфицировано в даташитах?)

а то может статься, что частота генериться,  а наблюдать её на внешней ножке  не выходит  - слишком высока.

Share this post


Link to post
Share on other sites

Приветствую!

8 minutes ago, Doka said:

вопрос скорее академический: а как можно хотя бы примерно оценить получающуюся частоту

Теоретически по задержке в LUТ * 2  как минимальный ориентир . Ну а потом уточнить типичное время задержки на роутинг на тестовом дизайне на нужной FPGA.  Вот результат для вышеприведенного   кода с длиной в 10 LUT на чипе   Alveo U50  :biggrin:

Spoiler

Slack:                    inf
  Source:                 i_gen/genblk1[0].i_lut/O
                            (internal pin)
  Destination:            i_gen/genblk1[0].i_lut/I0
  Path Group:             (none)
  Path Type:              Max at Slow Process Corner
  Data Path Delay:        2.155ns  (logic 1.066ns (49.466%)  route 1.089ns (50.534%))
  Logic Levels:           10  (LUT1=10)

    Location             Delay type                Incr(ns)  Path(ns)    Netlist Resource(s)
  -------------------------------------------------------------------    -------------------
    SLICE_X117Y237       LUT1                         0.000     0.000 f  i_gen/genblk1[0].i_lut/O
                         net (fo=1, routed)           0.037     0.037    i_gen/stg[0]
    SLICE_X117Y237                                                    f  i_gen/genblk1[1].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_F6LUT_SLICEL_I0_O)
                                                      0.089     0.126 f  i_gen/genblk1[1].i_lut/O
                         net (fo=1, routed)           0.040     0.166    i_gen/stg[1]
    SLICE_X117Y237                                                    f  i_gen/genblk1[2].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_E6LUT_SLICEL_I0_O)
                                                      0.090     0.256 f  i_gen/genblk1[2].i_lut/O
                         net (fo=1, routed)           0.040     0.296    i_gen/stg[2]
    SLICE_X117Y237                                                    f  i_gen/genblk1[3].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_D6LUT_SLICEL_I0_O)
                                                      0.089     0.385 f  i_gen/genblk1[3].i_lut/O
                         net (fo=1, routed)           0.051     0.436    i_gen/stg[3]
    SLICE_X117Y237                                                    f  i_gen/genblk1[4].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_C6LUT_SLICEL_I0_O)
                                                      0.146     0.582 f  i_gen/genblk1[4].i_lut/O
                         net (fo=1, routed)           0.041     0.623    i_gen/stg[4]
    SLICE_X117Y237                                                    f  i_gen/genblk1[5].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_B6LUT_SLICEL_I0_O)
                                                      0.090     0.713 f  i_gen/genblk1[5].i_lut/O
                         net (fo=1, routed)           0.045     0.758    i_gen/stg[5]
    SLICE_X117Y237                                                    f  i_gen/genblk1[6].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_H5LUT_SLICEL_I0_O)
                                                      0.109     0.867 f  i_gen/genblk1[6].i_lut/O
                         net (fo=1, routed)           0.249     1.116    i_gen/stg[6]
    SLICE_X117Y237                                                    f  i_gen/genblk1[7].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_G5LUT_SLICEL_I0_O)
                                                      0.099     1.215 f  i_gen/genblk1[7].i_lut/O
                         net (fo=1, routed)           0.156     1.371    i_gen/stg[7]
    SLICE_X117Y237                                                    f  i_gen/genblk1[8].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_F5LUT_SLICEL_I0_O)
                                                      0.143     1.514 f  i_gen/genblk1[8].i_lut/O
                         net (fo=1, routed)           0.222     1.736    i_gen/stg[8]
    SLICE_X117Y237                                                    f  i_gen/genblk1[9].i_lut/I0
    SLICE_X117Y237       LUT1 (Prop_E5LUT_SLICEL_I0_O)
                                                      0.161     1.897 f  i_gen/genblk1[9].i_lut/O
                         net (fo=2, routed)           0.164     2.061    i_gen/stg[9]
    SLICE_X117Y237                                                    f  i_gen/genblk1[0].i_lut_i_1/I0
    SLICE_X117Y237       LUT1 (Prop_G6LUT_SLICEL_I0_O)
                                                      0.050     2.111 r  i_gen/genblk1[0].i_lut_i_1/O
                         net (fo=1, routed)           0.044     2.155    i_gen/I00
    SLICE_X117Y237       LUT1                                         r  i_gen/genblk1[0].i_lut/I0
  -------------------------------------------------------------------    -------------------

 

Успехов! Rob.

Share this post


Link to post
Share on other sites
5 minutes ago, RobFPGA said:

Вот результат для вышеприведенного   кода с длиной в 10 LUT на чипе   Alveo U50

 

6 minutes ago, RobFPGA said:

Path Type: Max at Slow Process Corner

т.е. это не typical, а worst case.

т.о. на столе при +25С и номинальном Vint может оказаться на 20..50% резвее чем на "бумаге".

 

PS: интересно можно как-то репорты тайминг брать по typical corner ....

Share this post


Link to post
Share on other sites

Приветствую!

2 minutes ago, Doka said:

PS: интересно можно как-то репорты тайминг брать по typical corner ....

На сколько знаю в Vivado нет -  но можно прикинуть  мин-мах  и брать среднее.  Или даже  построить калибровочную кривую и меряя температуру и вольтаж динамически переключать число LUT в петле подстраивая частоту,  да еще и фазу ... "... И тут Остапа понесло ... " :biggrin: 

Успехов! Rob.

Share this post


Link to post
Share on other sites
1 hour ago, Doka said:

PS: интересно можно как-то репорты тайминг брать по typical corner

Смотря что для Вас typical. В PlanAhead'е (предшественник Вивады) можно было сгенерировать граничный репорт для заданной рабочей температуры. Не критическая, а, к примеру, та же комнатная. Там оно ориентировалось на какие-то таблицы внутренние и считало. Только смысл? Если кристалл обычно работает на одной температуре, но случись какой нежданчик, завсинет логика где-то или подключится много потребителей информации и температура скачкообразно вырастет -> все вычисления на смарку :smile:

Именно поэтому работники институтов, где изобрели и улучшают PLL до сих пор зарабатывают на хлеб до сих пор.

Share this post


Link to post
Share on other sites
В 05.12.2019 в 16:42, RobFPGA сказал:

Приветствую!

Ну и насколько я помню  в Spartan6  вроде есть похожий  встроенный клок ~50 MHz для конфигурации.    Почитайте внимательно Spartan-6 Configuration User guide and data sheet как к нему подключится, чтобы свое не ваять. 

Удачи! Rob.  

Нашел время поразбираться с этой плис. Вы были абсолютно правы по поводу внутреннего клока. Я немного потупил с его подключением, но все же заставить ПЛИС мигать светодиодом. При этом к ней не подключено ничего кроме jtag и питания. Весьма самодостаточная вещь оказалась. Пример кода для мигания светодиодом на тот случай, если какой нибудь новичок тоже тупить будет)) Мигает примерно раз в секунду.

`timescale 1ns / 1ps

module blink(
		output led
    );
	 wire clk;
	 reg	[26 : 0] cntr	=	'd0;
	 
	 assign led = cntr[26];
	 
	 always @(posedge clk)
	 begin
			cntr	<=	cntr + 1'b1;
	 end
	 
	 STARTUP_SPARTAN6 STARTUP_SPARTAN6_inst (
      .CFGCLK (),      
      .CFGMCLK (clk),
      .EOS (),
      .CLK (1'b0),
      .GSR (1'b0),
      .GTS (1'b0),
      .KEYCLEARB (1'b0)
   );


endmodule

 

Edited by v_crys

Share this post


Link to post
Share on other sites
On 12/5/2019 at 8:35 PM, RobFPGA said:

Приветствую!

Можно  слепить генератор на внутренней логики  типа  петли из задержек и инвертора. Типа:   


module gen #(parameter LEN=5) (
  output bit clk_o
);

(* dont_touch="true" *)
wire [LEN-1:0]  stg;

generate
  for (genvar gi=0; gi<LEN; ++gi) begin
    LUT1 #(.INIT(2'b10)) i_lut (
      .O (stg[gi]                          ), // 1-bit output: LUT
      .I0((gi==0) ? ~stg[LEN-1] : stg[gi-1])  // 1-bit input: LUT
    );
  end
endgenerate

always @(posedge stg[LEN-1]) begin
  clk_o <= ~clk_o;
end

endmodule

Удачи! Rob.

Вот чисто моё имхо: напрасно вы, уважаемый, учите новичков подобного рода конструкциям. В плане плисоводческих трюков это выглядит конечно красиво, но тут в явном виде есть источник вечного геморроя начинающих, а именно gated clock.

И (с моей старческой методологической колокольни) гораздо правильне не использовать gated clock никогда и нигде, чем уметь пользоваться подобного рода трюками. И ещё замечу, что без соответствующего атрибута любой синтезатор эту конструкцию заоптимизирует.

Share this post


Link to post
Share on other sites

Приветствую!

15 hours ago, Bad0512 said:

Вот чисто моё имхо: напрасно вы, уважаемый, учите новичков подобного рода конструкциям. В плане плисоводческих трюков это выглядит конечно красиво, но тут в явном виде есть источник вечного геморроя начинающих, а именно gated clock.

И (с моей старческой методологической колокольни) гораздо правильне не использовать gated clock никогда и нигде, чем уметь пользоваться подобного рода трюками. И ещё замечу, что без соответствующего атрибута любой синтезатор эту конструкцию заоптимизирует.

Что ж  - судя по всему ваша колокольня очень высока и вам с нее наверное не видно что  в приведенном коде как раз присутствует  атрибут для синтеза - равно как  отсутствует gating clock в классическом понимании этого термина. Думаю что  вам как и новичкам тоже будет полезно это знать. 

Ну и мое имхо что основной источник геморроя для начинающих это отнюдь gating clock а  отсутствие опыта что и как можно сделать в той или иной ситуации. И если не объяснять  новичкам  возможные решения равно как и и нюансы применения этих решений они так и останутся новичками - суеверно крестящимися при упоминании какого либо страшного термина. Например того же devilish gating clock :diablo: Хотя это вполне стандартная методика применимая для решения некоторых задач даже в FPGA.

Удачи! Rob.  

Share this post


Link to post
Share on other sites
10 hours ago, RobFPGA said:

Приветствую!

Что ж  - судя по всему ваша колокольня очень высока и вам с нее наверное не видно что  в приведенном коде как раз присутствует  атрибут для синтеза - равно как  отсутствует gating clock в классическом понимании этого термина. Думаю что  вам как и новичкам тоже будет полезно это знать. 

Ну и мое имхо что основной источник геморроя для начинающих это отнюдь gating clock а  отсутствие опыта что и как можно сделать в той или иной ситуации. И если не объяснять  новичкам  возможные решения равно как и и нюансы применения этих решений они так и останутся новичками - суеверно крестящимися при упоминании какого либо страшного термина. Например того же devilish gating clock :diablo: Хотя это вполне стандартная методика применимая для решения некоторых задач даже в FPGA.

Удачи! Rob.  

1. Я не утверждал, что атрибут отсутствует - посмотрите оригинал.

2. Клок, сформированный на LUT  stg[LEN-1(из которого вы потом путем деления на триггере формируете выходной сигнал) - что это если не gated clock?

Share this post


Link to post
Share on other sites
On 9 января 2020 г. at 6:17 AM, Bad0512 said:

Вот чисто моё имхо: напрасно вы, уважаемый, учите новичков подобного рода конструкциям. В плане плисоводческих трюков это выглядит конечно красиво, но тут в явном виде есть источник вечного геморроя начинающих, а именно gated clock.

И (с моей старческой методологической колокольни) гораздо правильне не использовать gated clock никогда и нигде, чем уметь пользоваться подобного рода трюками. И ещё замечу, что без соответствующего атрибута любой синтезатор эту конструкцию заоптимизирует.

Я вот не плисовод особо, и моя колокольня не так высока, но я аплодирую стоя за этот код! И именно для новичков это хороший пример как можно и нужно! А в этой ситуации именно так и нужно, в других ситуациях (миллионы строк, стандартный библиотеки) нужно будет по-другому.
 

Share this post


Link to post
Share on other sites

Приветствую!

4 hours ago, Bad0512 said:

2. Клок, сформированный на LUT  stg[LEN-1(из которого вы потом путем деления на триггере формируете выходной сигнал) - что это если не gated clock?

Это не "gated clock"  - это  просто выход инвертора.  И то что на вход clk триггера clk_o  идет сигнал котрый (о боже!) не является выходом clock buffer никак не делает этот сигнал  ужасным "gated clock". Вы же не называете gated clockом выход с глобального клокового буфера? 

Для того чтобы clock стал gated его нужно пропустить через логический элемент AND/OR и неаккуратно управляя этим элементом разрешать или запрещать срабатывание триггера. 

Хотя в таком случае почти все клоки последних семейств (например в Xilinx) можно считать gated  - так как они управляются через BUFG_CTRL логику позволяющую управлять состоянием клока.  И как тогда быть бедному новичку  - ему же больно сидеть будет :biggrin:

Тактирование clk входа триггеров в FPGA  не только сигналами обычных клоков, а и сигналами формируемыми на лог примитивах или с  выходов других триггеров (ripple clock)  стандартная практика для решения некоторых задач. Естественно при полном понимании специфики  этого использования.

Удачи! Rob.

Share this post


Link to post
Share on other sites
On 1/10/2020 at 7:35 PM, RobFPGA said:

Приветствую!

Это не "gated clock"  - это  просто выход инвертора.  И то что на вход clk триггера clk_o  идет сигнал котрый (о боже!) не является выходом clock buffer никак не делает этот сигнал  ужасным "gated clock". Вы же не называете gated clockом выход с глобального клокового буфера? 

Для того чтобы clock стал gated его нужно пропустить через логический элемент AND/OR и неаккуратно управляя этим элементом разрешать или запрещать срабатывание триггера. 

Хотя в таком случае почти все клоки последних семейств (например в Xilinx) можно считать gated  - так как они управляются через BUFG_CTRL логику позволяющую управлять состоянием клока.  И как тогда быть бедному новичку  - ему же больно сидеть будет :biggrin:

Тактирование clk входа триггеров в FPGA  не только сигналами обычных клоков, а и сигналами формируемыми на лог примитивах или с  выходов других триггеров (ripple clock)  стандартная практика для решения некоторых задач. Естественно при полном понимании специфики  этого использования.

Удачи! Rob.

В моём понимании gated clock - это сигнал, используемый в дальнейшем для тактирования, полученный с выхода LUT. Ваш пример с BUFG_CTRL крайне неудачный, так как в этом элементе иемеется своя (и довольно навороченная кстати) логика, позволяющая избежать проблем при переключении клоков или включении - выключении. И это хорошо описано в мануалах.

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

On 1/10/2020 at 5:59 PM, prostoRoman said:

Я вот не плисовод особо, и моя колокольня не так высока, но я аплодирую стоя за этот код! И именно для новичков это хороший пример как можно и нужно! А в этой ситуации именно так и нужно, в других ситуациях (миллионы строк, стандартный библиотеки) нужно будет по-другому.
 

Этот код - это классический пример того, как одни разработчики (в данном случае плисоводы) исправляют косяки других разработчиков (схемотехников). То есть "костыль".Да, красивый, но всё же костыль. Потому что за отсутствие на ПЛИС постоянного независимого источника клока надо гнать из схемотехников ссаными тряпками.

 

Share this post


Link to post
Share on other sites
4 hours ago, Bad0512 said:

Потому что за отсутствие на ПЛИС постоянного независимого источника клока надо гнать из схемотехников ссаными тряпками.

Вы ошибаетесь трижды.

Во-первых не все проекты требуют тактирования для ПЛИСины внешним тактовым генератором (иногда клоковой достаточно от линии связи будь то I2C или SPI) - это редкие, но всё же имеющие место быть случаи

Во-вторых любой более-менее недревниц чип может генерировать клоковую частоту на базе встроенной PLL. Проверено лично на MAX10 и Spartan-6. Новее чипы и подавно способны на такое.

И в-третьих (о Боже, нет!) встроенные генераторы построены именно на принципе задержки в буффере/инверторе! И вот такой беспредел можно построить самому. Понятно, что для этого нужно иметь хотя-бы годиков 5 экспириенса в данной области и не бездумно копировать код/пример, а адекватно понимать что куда подать, как развести и законстрейнить (в случае использования в реальном серьёзном проекте). Ну или для ознакомления можно скопипастить и поекспериментировать в образовательных целях, чтобы понять, что такой клок сильно зависит как от температуры, так и от напряжения и других факторов.

И ничего криминального тут нет! До честных ПЛИС и CPLD именно так разработчики делали разные хитрости. В общем и продолжают делать тоже. Взять хотя-бы приборы для детектирования сигналов в БАКе. Я видовал даже схемы, половина которой тактируется на 200MHz а вторая на 201MHz. И там такие фокусы устраивают. И без gated clock ну никак не обойтись. Просто нужно правильно его использовать.

Share this post


Link to post
Share on other sites
20 minutes ago, Nick_K said:

Вы ошибаетесь трижды.

Во-первых не все проекты требуют тактирования для ПЛИСины внешним тактовым генератором (иногда клоковой достаточно от линии связи будь то I2C или SPI) - это редкие, но всё же имеющие место быть случаи

Во-вторых любой более-менее недревниц чип может генерировать клоковую частоту на базе встроенной PLL. Проверено лично на MAX10 и Spartan-6. Новее чипы и подавно способны на такое.

И в-третьих (о Боже, нет!) встроенные генераторы построены именно на принципе задержки в буффере/инверторе! И вот такой беспредел можно построить самому. Понятно, что для этого нужно иметь хотя-бы годиков 5 экспириенса в данной области и не бездумно копировать код/пример, а адекватно понимать что куда подать, как развести и законстрейнить (в случае использования в реальном серьёзном проекте). Ну или для ознакомления можно скопипастить и поекспериментировать в образовательных целях, чтобы понять, что такой клок сильно зависит как от температуры, так и от напряжения и других факторов.

И ничего криминального тут нет! До честных ПЛИС и CPLD именно так разработчики делали разные хитрости. В общем и продолжают делать тоже. Взять хотя-бы приборы для детектирования сигналов в БАКе. Я видовал даже схемы, половина которой тактируется на 200MHz а вторая на 201MHz. И там такие фокусы устраивают. И без gated clock ну никак не обойтись. Просто нужно правильно его использовать.

1. Использовать частоту от I2C нельзя, потому что она присутствует только при передаче данных. В остальное время - нет. С SPI подобная же история. Всё зависит от реализации, иногда частота присутствует всегда, а иногда только когда данные передаются. Делать свои автоматы зависимыми от такого клока - удел студентов из серии "никто так не делает, а я сделал".

2. Да, можно сгенерировать частоту на PLL. Но в отсутствии внешнего рефернеса её частота будет очень сильно зависеть от множества факторов, это значит мы сразу "помахали рукой" всем синхронным интерфенйсам от Aurora вплоть до UART. Я уж молчу про всякие синхронные модемы с восстановлениме тактовой и несущей и прочие частотно зависимые вещи.

3. Я не утверждаю, что так сделать нельзя. Я утверждаю, что это - пример костыля, когда сэкономили на копеечном кварцевом генераторе, и поимели себе на ровном месте вагон дерьма. А нужно было просто предусмотреть независимый стабильный клок. И всё.

При чём важно иметь именно независимый клок, а не навороченную внешнюю PLL с прогрузкой регистров по I2C / SPI. Почему? Потому что изначально эта PLL может не генерить вообще ничего (до прогрузки регистров). А чтобы прогрузить регистры (не важно чем, FSM там или soft processor) нужен клок.

Share this post


Link to post
Share on other sites

Приветствую!

4 hours ago, Bad0512 said:

В моём понимании gated clock - это сигнал, используемый в дальнейшем для тактирования, полученный с выхода LUT. Ваш пример с BUFG_CTRL крайне неудачный, так как в этом элементе иемеется своя (и довольно навороченная кстати) логика, позволяющая избежать проблем при переключении клоков или включении - выключении. И это хорошо описано в мануалах.

Такую же  "навороченную" логику  я воротил еще на MAX7000/Flex10k/VirtexE когда мне надо было переключать источник клока.  И все на обычной логике и триггерах.  А также делал классический gated clock на пол чипа чтобы синхронизировать обработку в сложной логике и не тянуть тучу сигналов СE на каждый триггер. И это не считалось чем-то зазорным. 

4 hours ago, Bad0512 said:

Одним из побочных косяков предложенной вами схемы является то обстоятельство, что частота полученного клока зависит от очень многих факторов и не поддаётся прогнозированию, поэтому про тайминг анализ можно забыть

Об этом естественно надо помнить. А вот тайминг анализ вполне себе  нормально работает если вы не пытаетесь задрать констрэйны по самые гланды. Для прогнозирования - слепили генератор, - оценили задержки по миниму и максимуму, накинули запасец и получили рабочий диапазон частот. В чем проблема для тайминг анализа? 

4 hours ago, Bad0512 said:

Этот код - это классический пример того, как одни разработчики (в данном случае плисоводы) исправляют косяки других разработчиков (схемотехников). То есть "костыль".Да, красивый, но всё же костыль. Потому что за отсутствие на ПЛИС постоянного независимого источника клока надо гнать из схемотехников ссаными тряпками.

Ситуации бывают разными, кто-то что-то забыл,  кто-то не проверил, ... - можно конечно стать в позу и обос.... "тряпку" - а можно найти рабочее решение не оглядываясь на "авторитеты".  

Еще раз повторюсь - IMHO хороший разработчик должен знать и уметь делать все, в том числе собирать "костыли" из подручных веточек. :yes3:

Удачи! Rob.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now