-
Постов
9 579 -
Зарегистрирован
-
Победитель дней
4
Сообщения, опубликованные des00
-
-
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нм триггер.
ЗЫ. А топик стартер, поставив дополнительный триггер, так и мучается)
-
3 hours ago, Jackov said:
Ваш вопрос меня, немного, вводит в замешательство. Как минимум для того чтобы определить где заканчивается кадр, чтобы знать где контрольная сумма.
Сейчас сдвинул сигнал и объединил по ИЛИ. Вроде работает.
а блин, извините запарился, увидел Carrier Sense и не про то подумал. Тогда что-то очень странное если валид так колбасится. Он на каждом кадре так делает?
-
20 minutes ago, makc said:
Присоединяюсь к вопросу. Когда в давние времена интересовался этим вопросом, то находил информацию об обратной зависимости времени метастабильности и мощности триггера, поэтому для триггеров ячеек ввода-вывода приводились величины порядка 1 нс, а для внутренних триггеров всё было заметно хуже и ни о каких пикосекундах там речь даже близко не шла.
не было там никакого заметно хуже, тот самый Питер Алфке писал http://www.pldworld.com/_xilinx/html/tip/metastability.htm еще в 2002 году
- 1
-
27 minutes ago, Beby said:
Если не сложно, найдите, пожалуйста, этот документ, было бы крайне интересно с ним ознакомится.
Поищу на досуге, постараюсь найти
-
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], вы как раз и получите то что можно делить одним вычитанием. Но это надо полностью переписывать этот декодер и тогда он потеряет свою универсальность, выродившись в собственную кастомную разработку.
-
28 minutes ago, repstosw said:
Хорош тем, что общий блок уже 65536 элементов, и процедура взятия остатка от деления на 65536 - это простейшее обнуление бит, старше 15-го, что намного быстрее, чем взятие остатка от деления на 65535. А взятие остатка - очень рутинная функция - она во всех циклах кодека присутствует - особенно во внутренних.
так а там же оно аппроксимируется через одноранговое вычитание. ЕМНП все случаи этого остатка связаны с тем что делимое меньше двух делителей.
-
On 10/25/2023 at 8:55 PM, another_one said:
Подскажите пожалуйста, кто знает, на каком математическом аппарате в основном строяться методики восстановления исходной информации(1 бита из двух) такие как Хемминг и ему подобные
до кучи марелос-сарагоса, есть хорошие переводы, но в них есть ошибки в примерах)
-
ну косяк какой то, а вам зачем вообще этот сигнал, наследие времен царя гороха? если вы все равно будете принимать кадр, искать SFD и прочее?
-
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 ?
Какой то документ от хилых был, либо дока с иеее, на предмет оценки этого времени в современных плис. Надо поискать, но так под рукой сейчас нет.
-
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 -
22 minutes ago, RobFPGA said:
Имено так, поэтому я считаю правильно использовать решения гарантирующие результат, а не зависящий от удачного расположения
звёздрегистров, заполнения кристалла, прихоти алгоритмов P&R, ...дадада, а потом начинается нечто подобное: подсобите люди добрые, не могу SPI slave на 100МГц сделать, где взять частоту 300/400МГц (с)
Это к вопросу понимания, а именно о том что надо помнить, что за любой синхронизатор надо платить, в частности латентностью. Это тоже надо держать в уме любителям гарантированных результатов которые суют их во все места по умолчанию не отдавая себе отчет в том что они делают
UPD. Накину докучи, даже зайлинкс уже отказывается в собственных корках от многотриггерных синхронизаторв, заменя их на "полуасинхронные" (название мое), но нет, мы все же будем ставить по 3 и более триггера ибо это гарантия еще от дидов)
-
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 регистра, а иначе работать нибудет аяяяй.
-
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МГц. Времени для устаканивания сигналов вагон.
ЗЫ. Роутер по умолчанию минимизирует задержку, может конечно в ваших проектах он и тянет сигнал в случае детектора фронта кольцами вокруг ультраскейла сотки, но вот я ни разу не видел что бы он был настолько туп. В таких схемах он делает по максимально короткому пути в соседний логический блок.
-
13 minutes ago, RobFPGA said:
Странно это читать.
Уменьшение времени восстановления триггера не влияет на необходимость с этой метастабильностью боротся.я ни говорил что не надо с ней бороться, вы не внимательно читаете. наверное потому вам и странно.
13 minutes ago, RobFPGA said:Метастабильность как раз и возникает на выходе s_spi_ready_1 и использование его (без второго триггера) в качестве источника данных и для логических операций грубейшая ошибка CDC.
возникла, после этого через 100-200пс ушла, для тактовой 200МГц есть еще целых 4.8нс на то что бы все устаканилось на входе следующего (щих) триггеров до следующего фронта тактовой частоты.
-
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
-
1 hour ago, Plain said:
Так автор и жалуется, что КА в них торчит.
он не так жалуется, в том то и дело что не торчит, он раком встал) классика типов перечислений с хитрой кодировкой, без safe-mode и асинхрой. но ТС 146% уверен что у него асинхры нигде нет.
-
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 и тип перечисление. И эта фраза означает все другие, не описанные выше состояния)
-
1 minute ago, jenya7 said:
я всегда так делаю чтоб отловить фронт.
тогда вы тот самый 0.01% счастливчик, у которого глючит плис. Если времянки все сходятся, то возможно что есть непропай шаров питания/земли и при высокой загрузке плис, глючит часть логики в ней.
-
1 minute ago, jenya7 said:
В чём может быть проблема?
сигнал s_spi_ready_3 асинхронен REG_CLK, 99.99%
-
1 hour ago, dxp said:
Почему нет? Читабельность там дно, но код вполне синтезируемый и рабочий.
как я понял подразумевается продажа IP в читаемых сорцах
-
2 minutes ago, makc said:
Очень очень сомневаюсь, особенно глядя на многолетние похороны C/C++. Wishful thinking...
ну это же холиваров не отменяет) в плисочатиках народ рубится на эту тему периодически
-
7 hours ago, makc said:
Идеальных средств нет, везде свои минусы и плюсы. И поэтому грамотный специалист должен понимать и отдавать себе отчёт в том, что он применяет, для чего и в каких случаях, чтобы компромиссы были разумными/обоснованными, а не спекулятивно-эмоциональными (типа Windows mustdie, a Linux rules 😉).
да и вообще вот вот должно прийти время что весь ваш RTL фуфел, Chisel/SpinalHDL рулят)
-
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 бита, одно описание альясов будет ещё та портянка)
-
Да много вариантов можно придумать, например константы адреса/бита в package, отдельный модуль регистров с портами-зеркалами с назначенными структурами и т.д.. В VHDL есть еще alias но ЕМНП на массивы он не распространяется, только на отдельные регистры.
Обсуждение проблемы метастабильности в ПЛИС
в Работаем с ПЛИС, области применения, выбор
Опубликовано · Пожаловаться
Чуть позже гляну, спасибо)
Про чудеса не знаю, не уверен) но повторюсь, у ТС какая то мелкая ПЛИС с гражданской тактовой порядка 50-100МГц. Однотриггерный синхронизатор, даже при наличии комбинационной логики детектора фронта (уже намек что входные сигналы порядка 25-50МГц как максимум), идущей на мелкий КА и в отсутствии констрейнов и всех прочих свистоперделок без которых "CDC точно не заработает", будет с вероятностью 99.9% работать. Проблема у него где-то в другом месте. В этом контексте я и писал) Но полный код и результаты применения советов форума он не выкладывает.