Doka 1 6 декабря, 2019 Опубликовано 6 декабря, 2019 · Жалоба RobFPGA вопрос скорее академический: а как можно хотя бы примерно оценить получающуюся частоту? (время задержки для lut1 специфицировано в даташитах?) а то может статься, что частота генериться, а наблюдать её на внешней ножке не выходит - слишком высока. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 6 декабря, 2019 Опубликовано 6 декабря, 2019 · Жалоба Приветствую! 8 minutes ago, Doka said: вопрос скорее академический: а как можно хотя бы примерно оценить получающуюся частоту Теоретически по задержке в LUТ * 2 как минимальный ориентир . Ну а потом уточнить типичное время задержки на роутинг на тестовом дизайне на нужной FPGA. Вот результат для вышеприведенного кода с длиной в 10 LUT на чипе Alveo U50 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. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Doka 1 6 декабря, 2019 Опубликовано 6 декабря, 2019 · Жалоба 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 .... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 6 декабря, 2019 Опубликовано 6 декабря, 2019 · Жалоба Приветствую! 2 minutes ago, Doka said: PS: интересно можно как-то репорты тайминг брать по typical corner .... На сколько знаю в Vivado нет - но можно прикинуть мин-мах и брать среднее. Или даже построить калибровочную кривую и меряя температуру и вольтаж динамически переключать число LUT в петле подстраивая частоту, да еще и фазу ... "... И тут Остапа понесло ... " Успехов! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 6 декабря, 2019 Опубликовано 6 декабря, 2019 · Жалоба 1 hour ago, Doka said: PS: интересно можно как-то репорты тайминг брать по typical corner Смотря что для Вас typical. В PlanAhead'е (предшественник Вивады) можно было сгенерировать граничный репорт для заданной рабочей температуры. Не критическая, а, к примеру, та же комнатная. Там оно ориентировалось на какие-то таблицы внутренние и считало. Только смысл? Если кристалл обычно работает на одной температуре, но случись какой нежданчик, завсинет логика где-то или подключится много потребителей информации и температура скачкообразно вырастет -> все вычисления на смарку Именно поэтому работники институтов, где изобрели и улучшают PLL до сих пор зарабатывают на хлеб до сих пор. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
v_crys 0 5 января, 2020 Опубликовано 5 января, 2020 (изменено) · Жалоба В 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 Изменено 5 января, 2020 пользователем v_crys Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 9 января, 2020 Опубликовано 9 января, 2020 · Жалоба 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 никогда и нигде, чем уметь пользоваться подобного рода трюками. И ещё замечу, что без соответствующего атрибута любой синтезатор эту конструкцию заоптимизирует. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 9 января, 2020 Опубликовано 9 января, 2020 · Жалоба Приветствую! 15 hours ago, Bad0512 said: Вот чисто моё имхо: напрасно вы, уважаемый, учите новичков подобного рода конструкциям. В плане плисоводческих трюков это выглядит конечно красиво, но тут в явном виде есть источник вечного геморроя начинающих, а именно gated clock. И (с моей старческой методологической колокольни) гораздо правильне не использовать gated clock никогда и нигде, чем уметь пользоваться подобного рода трюками. И ещё замечу, что без соответствующего атрибута любой синтезатор эту конструкцию заоптимизирует. Что ж - судя по всему ваша колокольня очень высока и вам с нее наверное не видно что в приведенном коде как раз присутствует атрибут для синтеза - равно как отсутствует gating clock в классическом понимании этого термина. Думаю что вам как и новичкам тоже будет полезно это знать. Ну и мое имхо что основной источник геморроя для начинающих это отнюдь gating clock а отсутствие опыта что и как можно сделать в той или иной ситуации. И если не объяснять новичкам возможные решения равно как и и нюансы применения этих решений они так и останутся новичками - суеверно крестящимися при упоминании какого либо страшного термина. Например того же devilish gating clock Хотя это вполне стандартная методика применимая для решения некоторых задач даже в FPGA. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 10 января, 2020 Опубликовано 10 января, 2020 · Жалоба 10 hours ago, RobFPGA said: Приветствую! Что ж - судя по всему ваша колокольня очень высока и вам с нее наверное не видно что в приведенном коде как раз присутствует атрибут для синтеза - равно как отсутствует gating clock в классическом понимании этого термина. Думаю что вам как и новичкам тоже будет полезно это знать. Ну и мое имхо что основной источник геморроя для начинающих это отнюдь gating clock а отсутствие опыта что и как можно сделать в той или иной ситуации. И если не объяснять новичкам возможные решения равно как и и нюансы применения этих решений они так и останутся новичками - суеверно крестящимися при упоминании какого либо страшного термина. Например того же devilish gating clock Хотя это вполне стандартная методика применимая для решения некоторых задач даже в FPGA. Удачи! Rob. 1. Я не утверждал, что атрибут отсутствует - посмотрите оригинал. 2. Клок, сформированный на LUT stg[LEN-1] (из которого вы потом путем деления на триггере формируете выходной сигнал) - что это если не gated clock? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
prostoRoman 0 10 января, 2020 Опубликовано 10 января, 2020 · Жалоба On 9 января 2020 г. at 6:17 AM, Bad0512 said: Вот чисто моё имхо: напрасно вы, уважаемый, учите новичков подобного рода конструкциям. В плане плисоводческих трюков это выглядит конечно красиво, но тут в явном виде есть источник вечного геморроя начинающих, а именно gated clock. И (с моей старческой методологической колокольни) гораздо правильне не использовать gated clock никогда и нигде, чем уметь пользоваться подобного рода трюками. И ещё замечу, что без соответствующего атрибута любой синтезатор эту конструкцию заоптимизирует. Я вот не плисовод особо, и моя колокольня не так высока, но я аплодирую стоя за этот код! И именно для новичков это хороший пример как можно и нужно! А в этой ситуации именно так и нужно, в других ситуациях (миллионы строк, стандартный библиотеки) нужно будет по-другому. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 10 января, 2020 Опубликовано 10 января, 2020 · Жалоба Приветствую! 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 логику позволяющую управлять состоянием клока. И как тогда быть бедному новичку - ему же больно сидеть будет Тактирование clk входа триггеров в FPGA не только сигналами обычных клоков, а и сигналами формируемыми на лог примитивах или с выходов других триггеров (ripple clock) стандартная практика для решения некоторых задач. Естественно при полном понимании специфики этого использования. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 20 января, 2020 Опубликовано 20 января, 2020 · Жалоба 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 логику позволяющую управлять состоянием клока. И как тогда быть бедному новичку - ему же больно сидеть будет Тактирование clk входа триггеров в FPGA не только сигналами обычных клоков, а и сигналами формируемыми на лог примитивах или с выходов других триггеров (ripple clock) стандартная практика для решения некоторых задач. Естественно при полном понимании специфики этого использования. Удачи! Rob. В моём понимании gated clock - это сигнал, используемый в дальнейшем для тактирования, полученный с выхода LUT. Ваш пример с BUFG_CTRL крайне неудачный, так как в этом элементе иемеется своя (и довольно навороченная кстати) логика, позволяющая избежать проблем при переключении клоков или включении - выключении. И это хорошо описано в мануалах. Одним из побочных косяков предложенной вами схемы является то обстоятельство, что частота полученного клока зависит от очень многих факторов и не поддаётся прогнозированию, поэтому про тайминг анализ можно забыть. On 1/10/2020 at 5:59 PM, prostoRoman said: Я вот не плисовод особо, и моя колокольня не так высока, но я аплодирую стоя за этот код! И именно для новичков это хороший пример как можно и нужно! А в этой ситуации именно так и нужно, в других ситуациях (миллионы строк, стандартный библиотеки) нужно будет по-другому. Этот код - это классический пример того, как одни разработчики (в данном случае плисоводы) исправляют косяки других разработчиков (схемотехников). То есть "костыль".Да, красивый, но всё же костыль. Потому что за отсутствие на ПЛИС постоянного независимого источника клока надо гнать из схемотехников ссаными тряпками. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Nick_K 0 20 января, 2020 Опубликовано 20 января, 2020 · Жалоба 4 hours ago, Bad0512 said: Потому что за отсутствие на ПЛИС постоянного независимого источника клока надо гнать из схемотехников ссаными тряпками. Вы ошибаетесь трижды. Во-первых не все проекты требуют тактирования для ПЛИСины внешним тактовым генератором (иногда клоковой достаточно от линии связи будь то I2C или SPI) - это редкие, но всё же имеющие место быть случаи Во-вторых любой более-менее недревниц чип может генерировать клоковую частоту на базе встроенной PLL. Проверено лично на MAX10 и Spartan-6. Новее чипы и подавно способны на такое. И в-третьих (о Боже, нет!) встроенные генераторы построены именно на принципе задержки в буффере/инверторе! И вот такой беспредел можно построить самому. Понятно, что для этого нужно иметь хотя-бы годиков 5 экспириенса в данной области и не бездумно копировать код/пример, а адекватно понимать что куда подать, как развести и законстрейнить (в случае использования в реальном серьёзном проекте). Ну или для ознакомления можно скопипастить и поекспериментировать в образовательных целях, чтобы понять, что такой клок сильно зависит как от температуры, так и от напряжения и других факторов. И ничего криминального тут нет! До честных ПЛИС и CPLD именно так разработчики делали разные хитрости. В общем и продолжают делать тоже. Взять хотя-бы приборы для детектирования сигналов в БАКе. Я видовал даже схемы, половина которой тактируется на 200MHz а вторая на 201MHz. И там такие фокусы устраивают. И без gated clock ну никак не обойтись. Просто нужно правильно его использовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Bad0512 2 20 января, 2020 Опубликовано 20 января, 2020 · Жалоба 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) нужен клок. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
RobFPGA 27 20 января, 2020 Опубликовано 20 января, 2020 · Жалоба Приветствую! 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 хороший разработчик должен знать и уметь делать все, в том числе собирать "костыли" из подручных веточек. Удачи! Rob. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться