Перейти к содержанию
    

des00

Модераторы
  • Постов

    9 579
  • Зарегистрирован

  • Победитель дней

    4

Сообщения, опубликованные des00


  1. 9 minutes ago, makc said:

    Во вложении документ 2010 года, который тоже говорит о 100 пс уже на Spartan-3: medvedrogina2010.pdf

    Чудеса?

    Чуть позже гляну, спасибо) 

    Про чудеса не знаю, не уверен) но повторюсь, у ТС  какая то мелкая ПЛИС с гражданской тактовой порядка 50-100МГц. Однотриггерный синхронизатор, даже при наличии комбинационной логики детектора фронта (уже намек что входные сигналы порядка 25-50МГц как максимум), идущей на мелкий КА и в отсутствии констрейнов и всех прочих свистоперделок без которых "CDC точно не заработает", будет с вероятностью 99.9% работать. Проблема у него где-то в другом месте. В этом контексте я и писал) Но полный код и результаты применения советов форума он не выкладывает. 

  2. 12 hours ago, Beby said:

    1. Вот, всё тоже самое, но в более красивом виде: XAPP094: Metastable Recovery in Virtex-II Pro FPGAs (v3.0, 10 February 2005, Author: Peter Alfke)
    Собственно именно на этот документ и попробовал съехать в 2011 году специалист Xilinx - и тут же получил отлуп. На тот момент Xilinx не выпустил ни одного документа по Metastable Recovery для ПЛИС новее Virtex-2Pro и, исходя из беседы, не планировал опубликовывать получаемые по Metastable Recovery данные в ближайшие несколько лет.

    2. Я правильно понимаю, первоначальны вы имели в виду другой документ, и можно продолжать надеяться на его успешный поиск ?

    был документ типа вот такого Refined metastability characterization using a time-to-digital converter - ScienceDirect,  только более свежий, где то года 2020-2021 го. Исследование, написанное не на коленке. Попал на него случайно, шарился по другому вопросу на форуме саппорта какого то вендора и случайно увидел ссылку.  К сожалению в свою файлопомойку я его тогда не сохранил. Но в памяти отразились итоговые таблицы, там были приведены данные на плис начиная с уровня первых максов-динозавров (~5нс), заканчивая последними 16нм хилыми, где и были указанны те самые 100-200пс . Может конечно у меня помутнение рассудка, но вот четко в памяти отразились цифры в таблицах. Я еще пороюсь по ieee, но при 14 часовом рабочем дне это несколько затруднительно. Прошу понять)

    Из того что нашел в своей файлопомойке это документ от SNUG Silicon Valley 2014, но это не он. Статья довольная старая и для азиководов, там разбирается современный 65нм триггер. 

    ЗЫ. А топик стартер, поставив дополнительный триггер, так и мучается) 

    document (1).pdf

  3. 3 hours ago, Jackov said:

    Ваш вопрос меня, немного, вводит в замешательство. Как минимум для того чтобы определить где заканчивается кадр, чтобы знать где контрольная сумма.

    Сейчас сдвинул сигнал и объединил по ИЛИ. Вроде работает.

    а блин, извините запарился, увидел Carrier Sense и не про то подумал. Тогда что-то очень странное если валид так колбасится. Он на каждом кадре так делает? 

  4. 20 minutes ago, makc said:

    Присоединяюсь к вопросу. Когда в давние времена интересовался этим вопросом, то находил информацию об обратной зависимости времени метастабильности и мощности триггера, поэтому для триггеров ячеек ввода-вывода приводились величины порядка 1 нс, а для внутренних триггеров всё было заметно хуже и ни о каких пикосекундах там речь даже близко не шла.

    не было там никакого заметно хуже, тот самый Питер Алфке писал http://www.pldworld.com/_xilinx/html/tip/metastability.htm еще в 2002 году

    • Like 1
  5. 27 minutes ago, Beby said:

      Если не сложно, найдите, пожалуйста, этот документ, было бы крайне интересно с ним ознакомится.

    Поищу на досуге, постараюсь найти

  6. 5 hours ago, repstosw said:

    Собственно,  как сложить два числа с остатком от деления на 65535 ?

    тоесть  (a+b)%65535 ?

    не прибегая к вычислению остатка от деления (в т.ч. и самого деления)

    да вроде всегда так делали, вычитанием если надо.

    c = a + b;
    
    rslt = (c >= 65535) ? (c - 65535) : c

    это в случае однорангового, когда с < 2*65535. А сложение двух элементов полей Галуа у вас как раз и замыкается в этом круге. Не знаю есть ли у вашего проца опции условного исполнения команд, но может быть это будет проще чем делить?

    UPD. Посмотрел выложенный код, чтобы применить этот подход вам надо полностью переписывать все что выложено. Например

    [MODNN(INDEX_OF[s[i]] + (FCR+i)*PRIM)];

    i тут бежит с 0 до NROOTS, и естественно здесь будет не одноранговое деление. Но, например тут не обязательно умножать да еще и каждый блок, т.к. мы работаем в поле, можно вычислить константы уже по модулю MODNN((FCR+i)*PRIM),  обеспечив уже попадание этого значения в кольцо 0..65534, а потом, прибавляя элемент INDEX_OF[bla bla bla], вы как раз и получите то что можно делить одним вычитанием. Но это надо полностью переписывать этот декодер и тогда он потеряет свою универсальность, выродившись в собственную кастомную разработку.

  7. 28 minutes ago, repstosw said:

    Хорош тем, что общий блок уже 65536 элементов, и процедура взятия остатка от деления на 65536 - это простейшее обнуление бит, старше 15-го,  что намного быстрее, чем взятие остатка от деления на 65535.   А взятие остатка - очень рутинная функция - она во всех циклах кодека присутствует - особенно во внутренних.

    так а там же оно аппроксимируется через одноранговое вычитание. ЕМНП все случаи этого остатка связаны с тем что делимое меньше двух делителей. 

  8. On 10/25/2023 at 8:55 PM, another_one said:

    Подскажите пожалуйста, кто знает, на каком математическом аппарате в основном строяться методики восстановления исходной информации(1 бита из двух) такие как Хемминг и ему подобные

    до кучи марелос-сарагоса, есть хорошие переводы, но в них есть ошибки в примерах)

     

  9. On 10/26/2023 at 10:09 PM, _4afc_ said:

    А можно пример современного "полуасинхронного" синхронизатора c на чистом verilog? С необходимыми констрейнами и атрибутами.

    самый лучший вариант из первых рук: сгенерировать xilinx gtp/gtx с полным обвесом и отреверсить) где то года с ~2019 там стали использоваться занятные переходы между доменами, которые до этого момента делались по другому. 

    On 10/29/2023 at 2:04 PM, jenya7 said:

    и всё таки даже сейчас раз в 4000 - 80000 обращений одно ломается. правда последующие отрабатываются нормально до следующей поломки.

    вам же написали, больше триггеров, больше) 

    ЗЫ. код у вас эквивалентный, проблема явно не там) 

    11 hours ago, Beby said:

    Будьте добры, уточните, пожалуйста, откуда вы добыли информацию о "100-200пс" для выхода триггера из метастабильного состояния в Xilinx 7-Series ?

    Какой то документ от хилых был, либо дока с иеее, на предмет оценки этого времени в современных плис. Надо поискать, но так под рукой сейчас нет. 

  10. Wimax 802.16-2012 BTC (TPC) кодек.

    Поддерживаются все компонентные коды с динамическим переключением, но без укорочения. 

    Ресурсы кодера  LUT/REG/RAMB     ~310/~300/1.5    >250MHz (up to 250Mbps)

    Ресурсы декодера для внешней метрики 4 бита: Decoder     : LUT/REG/RAMB     4.8k/5.2k/2.5    >250MHz (~100-200Mbps)

    Производительность для 4-х итераций. 

    (57, 64)x(57, 64) = 4889 tick
    
    (26, 32)x(26, 32) = 1561 tick
    
    (11, 16)x(11, 16) = 665 tick 
    
    (4, 8)x(4, 8)     = 345 tick 
    
    (63, 64)x(63, 64) = 4743 tick 
    
    (31, 32)x(31, 32) = 1417 tick 
    
    (15, 16)x(15, 16) = 521 tick 
    
    (7, 8)x(7, 8)    = 256 tick 

    Типовые характеристики для кода (26, 32)х(57, 64) 

    Quote

    # code 1482/2048 = 0.72 results
    # bits 1.48e+005 EbNo(SNR) = 2.00(3.61): ber = 4.41e-002. fer = 5.76e-002, ch_err = 6.55e-002
    # bits 1.48e+005 EbNo(SNR) = 2.50(4.11): ber = 1.26e-002. fer = 5.25e-002, ch_err = 5.39e-002
    # bits 1.48e+005 EbNo(SNR) = 3.00(4.61): ber = 3.04e-004. fer = 4.50e-002, ch_err = 4.48e-002
    # bits 1.48e+005 EbNo(SNR) = 3.50(5.11): ber = 0.00e+000. fer = 3.64e-002, ch_err = 3.54e-002
    # bits 1.48e+005 EbNo(SNR) = 4.00(5.61): ber = 0.00e+000. fer = 2.88e-002, ch_err = 2.79e-002
    # bits 1.48e+005 EbNo(SNR) = 4.50(6.11): ber = 0.00e+000. fer = 2.22e-002, ch_err = 2.16e-002
    # bits 1.48e+005 EbNo(SNR) = 5.00(6.61): ber = 0.00e+000. fer = 1.64e-002, ch_err = 1.60e-002
    # bits 1.48e+005 EbNo(SNR) = 5.50(7.11): ber = 0.00e+000. fer = 1.24e-002, ch_err = 1.16e-002

     

  11. 22 minutes ago, RobFPGA said:

    Имено так, поэтому я считаю правильно использовать решения гарантирующие  результат, а не зависящий от удачного расположения звёзд регистров, заполнения кристалла, прихоти алгоритмов P&R, ... 

    дадада, а потом начинается нечто подобное: подсобите люди добрые, не могу SPI slave на 100МГц сделать, где взять частоту 300/400МГц (с)

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

    UPD. Накину докучи, даже зайлинкс уже отказывается в собственных корках от многотриггерных синхронизаторв, заменя их на "полуасинхронные" (название мое), но нет, мы все же будем ставить по 3 и более триггера ибо это гарантия еще от дидов)

  12. 9 minutes ago, RobFPGA said:

    Какие там у TC времянки и где стоят надо не гадать, а смотреть логи и floorplan, репорты, ... 

    Попросите он покажет, вангую что там чип меньше 200го артикса, заполненный на 30% и частоты порядка тех что указал, и задержки роутинга именно этой цепи порядка пары нс.

    9 minutes ago, RobFPGA said:

    Но и без всяких логов понятно то что схема с одним триггером в CDC является грубой ошибкой часто приводящей к похожим эффектам.

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

    9 minutes ago, RobFPGA said:

    Поэтому первое что надо сделать это убрать этот источник проблем.  И проще всего это сделать, как и советовали выше, использовав готовый CDC, так как эти кролики модули не только "мясо" в виде 2-3 регистров но и ценный "мех" в виде ассоциированных к ним констрейнов ... 

    Ну пусть поставит, напишет результат, посмотрим поможет ли и чье вангование сильнее.

    9 minutes ago, RobFPGA said:

    Использование просто регистров в коде без сопутствующих констрейнов/атрибутов тоже возможно так как современные тулзы умеют распознавать эти ситуации.
    Но IMHO все же спокойние самому контролировать все эти скользкие моменты.     

    ИМХО лучше понимать что делаешь и почему делаешь именно так, а то форум послушать так и на 1МГц надо ставить обязательно 2-3 регистра, а иначе работать нибудет аяяяй.

  13. 30 minutes ago, RobFPGA said:

    Тогда как понять это:

    Так и понимать, что линейки из 3 и более триггеров (Как советовали выше, можно и 4 и 8 поставить, но ТС это не поможет с вероятностью 99.9%) на гражданских частотах и современных плис уже не актуальны.

    30 minutes ago, RobFPGA said:

    Подавление метастабильности зависит не только от времени выхода из метастабильности первого триггера.  А и от того  когда эта метастабильность уйдет на входе следующего! 

    Вы же лучше меня знаете, что метастабильность возникает не сама по себе, а именно при нахождении сигнала на входе триггера в промежуточном состоянии в узком окне th-tsu, в момент действия фронта тактовой частоты. Если нет фронта тактовой частоты она не возникнет никогда.  Без триггера метастабильности нет. Время выхода из этого состояния определеляется технологическими параметрами и чем скоростнее и тоньше плис тем это время меньше. Справочные таблицы можно найти на сайте вендоров, там указано это время. И для современных плис порядок этого времени я указал.

    30 minutes ago, RobFPGA said:

    Вот и получается  -  чрез  100-200пс первый триггер вышел из X (метастабильности) и это состояние 0/1 пошло  распространятся по роутингу  до получателей. А так как обычным констрейном время роутинга  может быть  почти равным периоду клока то на входе  следующего регистра X может уйти аккурат в момент или после следующего фронта клока. Finita la commedia ... 

    А может и не быть равным, если логика стоит тут рядом, а не тянется через всю плис. У ТС детектор фронта на входе КА, который делается на соседних логических блоках, с задержками до пары нс, при его тактовой порядка 100-150МГц. Времени для устаканивания сигналов вагон. 

    ЗЫ. Роутер по умолчанию минимизирует задержку, может конечно в ваших проектах он и тянет сигнал в случае детектора фронта кольцами вокруг ультраскейла сотки, но вот я ни разу не видел что бы он был настолько туп. В таких схемах он делает по максимально короткому пути в соседний логический блок.

  14. 13 minutes ago, RobFPGA said:

    Странно это читать. 
    Уменьшение времени восстановления триггера не влияет на необходимость с этой метастабильностью боротся. 

    я ни говорил что не надо с ней бороться, вы не внимательно читаете. наверное потому вам и странно.

    13 minutes ago, RobFPGA said:

    Метастабильность как раз и возникает на выходе s_spi_ready_1 и использование его (без второго триггера) в качестве источника данных и для логических операций грубейшая ошибка CDC.  

    возникла, после этого через 100-200пс ушла, для тактовой 200МГц есть еще целых 4.8нс на то что бы все устаканилось на входе следующего (щих) триггеров до следующего фронта тактовой частоты.

  15. 13 hours ago, kirill70674 said:

    Пытаюсь удостовериться в правильности ответа данного поста: https://stackoverflow.com/questions/17327680/what-is-the-difference-between-single-and-double-ampersand-binary-opera

    да простейший код скидать и покрутить

    module pipa_popa ;
    
      int pipa;
      int popa;
    
      initial begin
        popa = 4;
        pipa = 2;
        //
        if (popa) begin
          $display("popa if pass");
        end
        if (pipa) begin
          $display("pipa if pass");
        end
        //
        if (popa & pipa) begin
          $display("pipa & popa if pass");
        end
        if (popa && pipa) begin
          $display("pipa && popa if pass");
        end
        $stop;
      end
    endmodule

     

  16. 1 hour ago, Plain said:

    Так автор и жалуется, что КА в них торчит.

    он не так жалуется, в том то и дело что не торчит, он раком встал) классика типов перечислений с хитрой кодировкой, без safe-mode и асинхрой. но ТС 146% уверен что у него асинхры нигде нет.

  17. 21 hours ago, Burenkov said:

    Попробуйте SPI_READY через два триггера пропустить перед использованием. Может быть s_spi_ready_1 оказывается в метастабильном состоянии 

    на современных плис не актуально, там время выхода из этого состояния меньше 1нс, все советы про 2-3 триггера, в плис, относятся к плис времен царя гороха. Даже статьи такие есть с времянками. ЕМНП у тогоже 7 Series время выхода триггера из метастабильного состония порядка 100-200пс.

    18 hours ago, Flip-fl0p said:

    Добавлю, что этого мало. Еще бы правильно констрейнами, или атрибутами подсказать синтезатору, что тут цепочка CDC триггеров.

    это делается для предотвращения упаковки в SRL примитив(чего уже не будет судя по описанной логике) и ограничения времени передачи, но для типовых тактовых 200МГц = 5нс, с учетом того что роутер минимизирует длинну трасс по умолчанию, эти 5нс это порядка четверти плис уровня 200ки артикса/300ки кинтекса. Судя по постам ТС, у него частота порядка 100-150МГц и мелкая ПЛИС. Резюмирую, по красоте вы абсолютно правы, но 99.9% что у ТС проблема не в этом.

    14 hours ago, jenya7 said:

    самое интересное что когда ломается он уже не возвращается в нормальное состояние. по идее на следующем обращении должен востановиться.

    либо вы все таки видите не то, и ваша фраза " я не попадаю в условие if (s_spi_ready_3 = '1') then. хотя Сигнал Тап показывает все правильные сигналы - s_spi_ready_3 = '1', INSTR = COM_SET_ADR. " не соответствует действительности, либо какая то асинхра (не обязательно на указаном вами сигнале s_spi_ready_3) заходит на автомат, либо есть срыв тактовой, либо всеж вам повезло поймать очень редкий баг плис с недостатком питания/земли (ловил лично лет 15 назад).

    18 hours ago, vsrb said:

    Я бы еще s_spi_ready_3 из списка чувствительностей убрал, т.к. этой конструкцией триггер описывается, а не асинхронная логика.

    это VHDL, там такое допускается. Но соглашусь, глаз режет)

    48 minutes ago, Plain said:

    Т.е. сами не знаете, однако пишете

    when others

    потому что это VHDL и тип перечисление. И эта фраза означает все другие, не описанные выше состояния)

  18. 1 minute ago, jenya7 said:

    я всегда так делаю чтоб отловить фронт.

    тогда вы тот самый 0.01% счастливчик, у которого глючит плис. Если времянки все сходятся, то возможно что есть непропай шаров питания/земли и при высокой загрузке плис, глючит часть логики в ней.

  19. 1 hour ago, dxp said:

    Почему нет? Читабельность там дно, но код вполне синтезируемый и рабочий.

    как я понял подразумевается продажа IP в читаемых сорцах

  20. 2 minutes ago, makc said:

    Очень очень сомневаюсь, особенно глядя на многолетние похороны C/C++. Wishful thinking...

    ну это же холиваров не отменяет) в плисочатиках народ рубится на эту тему периодически

  21. 7 hours ago, makc said:

    Идеальных средств нет, везде свои минусы и плюсы. И поэтому грамотный специалист должен понимать и отдавать себе отчёт в том, что он применяет, для чего и в каких случаях, чтобы компромиссы были разумными/обоснованными, а не спекулятивно-эмоциональными (типа Windows mustdie, a Linux rules 😉).

    да и вообще вот вот должно прийти время что весь ваш RTL фуфел, Chisel/SpinalHDL рулят)

  22. 4 minutes ago, andrew_b said:

    Смотря что вы имеете в виду. Вот из моего старого проекта:
     

    -- length of statistical header in bytes
    constant SH_Length  : positive := 14;  -- 112 bits
    -- statistical header
    subtype tStatHeader is std_logic_vector(0 to SH_Length * 8 - 1);
    
    constant SHBurstStartBit             : natural := 96;
    constant SHBurstEndBit               : natural := 97;
    
    signal StatHeader : tStatHeader;
    alias BurstStart : std_logic is StatHeader(SHBurstStartBit);
    alias BurstEnd   : std_logic is StatHeader(SHBurstEndBit);
    

     

    Если правильно помню синтаксис VHDL, у вас альасы к битам вектора, а ТС нужны альясы к битами элемента массива. И вот тут вроде оно не работает. Но могу ошибаться)

    PS. Ну и в такой концепции, если у ТС 8 регистров, по 32 бита, одно описание альясов будет ещё та портянка) 

  23. Да много вариантов можно придумать, например константы адреса/бита в package, отдельный модуль регистров с портами-зеркалами с назначенными структурами и т.д.. В VHDL есть еще alias но ЕМНП на массивы он не распространяется, только на отдельные регистры.

×
×
  • Создать...