Jump to content

    
Sign in to follow this  
MegaVolt

Как узнать у кратных частот номер такта относительно медленной частоты?

Recommended Posts

Есть две кратные частоты сформированные от одной тактовой. Делители например на BUFR. Например соотношение частот 2. F2=2*F1. Как определить номер такта быстрой частоты относительно медленной?

 

F1=0011223344556677

F2=0101010101010101

 

Простейшее решениее подать медленную частоту на вход данных триггера и протактировать второй не прокатывает потому что фронты каждый второй такт совпадут и будет бардак.

 

Вариант 1: ставим Т триггер на быструю частоту и полученную последовательность тактируем медленной частотой.

Вариант 2: ставим T триггер на медленную частоту и выделение фронтов на быстрой.

 

Это велосипеды изобретённые на коленке за пару минут. А как правильно это называется (для гугла) и как принято подобное делать?

Share this post


Link to post
Share on other sites

а можно чуть поподробнее, в чем задача, или зачем всё это?

 

а то мне всё больше приходилось принимать на clock-capable 622 MHz 16 бит, при помощи BUFR /4 делать из них 155 MHz, и при помощи DC FIFO вынимать 64 бит, чтобы потом как-то с ними на приемлемых и сходящихся времянках работать.

 

а так вообще - переводим через CDC медленную частоту вверх, получаем, в зависимости от делителя 1100110011001100, или 111100001111000011110000 на быстрой, а дальше дело техники.

проблема здесь в том, что даже с кратными частотами нельзя исключать влияния нестабильностей (температурные, техпроцесса и прочие) и делать вид, что метастабильности возникнуть не может в принципе и у вас всегда будет монотонная последовательность 0-1-2-3-4-5-6-7.

Share this post


Link to post
Share on other sites

Если вам нужно знать фазовые соотношения - то они же и так известны. Частоты отличаются ровно в два раза )

Считайте такты быстрой и сможете пересчитать в медленную делением на два. Медленную умножайте.

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

Edited by Кoнстантин

Share this post


Link to post
Share on other sites
Считайте такты быстрой и сможете пересчитать в медленную делением на два.
Вот тут и проблема. Потому что возможны два варианта. Просто остаток по модулю 2 и то же самое но плюс один.

 

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

Share this post


Link to post
Share on other sites
Вот тут и проблема. Потому что возможны два варианта. Просто остаток по модулю 2 и то же самое но плюс один.

 

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

А хендшейки задействовать на входе не пробовали, тогда у вас гарантированно будут данные защёлкиваться на входах.

Share this post


Link to post
Share on other sites
мы можем начать считать быструю частоту в два разных момента времени

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

Еще раз поясните, откуда берется исходный тактовый сигнал и каким образом вы его делите.

Даже если, допустим, медленная появляется из PLL и есть непредсказуемое время на ее раскачку, тогда сигнал locked можно использовать как enable для счетчиков, чтобы начать считать от одного момента во времени

Очень полезно воспользоваться симулятором

Share this post


Link to post
Share on other sites
А хендшейки задействовать на входе не пробовали, тогда у вас гарантированно будут данные защёлкиваться на входах.
Откуда взялись данные? Пока речь шла только про клоки.

 

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

Еще раз поясните, откуда берется исходный тактовый сигнал и каким образом вы его делите.

Xilinx BUFR две штуки делят одну шуструю входную частоту. Сброс их не делается. Ибо частота входная большая синхронизировать с ней сброс не охота. Значит начальное состояние считаем неизвестным. Я конечно догадываюсь что оно буддет постоянным. Но очень не хочется нарваться на какой нибудь нюанс когда на на температуре вдруг оно измениться.
Даже если, допустим, медленная появляется из PLL и есть непредсказуемое время на ее раскачку, тогда сигнал locked можно использовать как enable для счетчиков, чтобы начать считать от одного момента во времени
Вот про это поподробнее. Как обеспечить начало счёта по совпадению фронтов двух частот? Потому что Locked может прийти в любой момент времени и как следствие неопределённость остаётся.
Очень полезно воспользоваться симулятором
Боюсь это не то место которое нужно делать глядя на симулятор.

Share this post


Link to post
Share on other sites

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

 

...

Простейшее решениее подать медленную частоту на вход данных триггера и протактировать второй не прокатывает потому что фронты каждый второй такт совпадут и будет бардак.

...

Почему столь категоричное утверждение?

Вполне рабочая схема для синхронных клоков. Естественно при этом надо учитывать задержку между буфером F1 и D входом триггера.

 

...

Боюсь это не то место которое нужно делать глядя на симулятор.

...

Вобще все как раз и нужно проверять сначала в симе! Сначала functional а затем и post-place&route с учетом реальных задержек по SDF annotation . Простенький тестовый модуль с парой буферов и парой тригеров не займет много времени на P&R и прогон сима.

 

Успехлв! Rob.

Share this post


Link to post
Share on other sites
Вполне рабочая схема для синхронных клоков. Естественно при этом надо учитывать задержку между буфером F1 и D входом триггера.
Чисто теоретически должно работать. А практически кто проконтролирует время сетап-холд? Или раскладчик поймёт всё правильно и я зря парюсь?
Вобще все как раз и нужно проверять сначала в симе! Сначала functional а затем и post-place&route с учетом реальных задержек по SDF annotation . Простенький тестовый модуль с парой буферов и парой тригеров не займет много времени на P&R и прогон сима.
Симуляция не может являться гарантией работоспособности изделия. Т.е. аргумент про то что у меня всё в симуляторе работает совершенно не аргумент.

 

Аргументом может являться только верное схемотехническое решение подкреплённое цифрами из даташита. Особенно если речь идёт про начальные условия. Иначе есть шанс поиметь схему которая будет от разводки к разводке работать по разному.

 

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

 

Share this post


Link to post
Share on other sites
Напрмер банальное. Глобальный ресет приходит на триггеры не одновременно. И соответственно есть шанс что часть триггеров уже сработают а вторая половина ещё в ресете. Если схемотехнически не обеспечить правильный ресет то схема будет с особенностями. Причём конкретную раскладку можно отсимулить и увидеть эти особенности. Но со следующей всё придётся делать заново.

То, что происходит в схеме между фронтами тактовой частоты - вас волновать по идее не должно. Вы же цифровым дизайном занимаетесь, а не аналоговым. Роутер постарается развести так, чтобы К СЛЕДУЮЩЕМУ фронту клока на выходе всех регистров был годный результат. Именно для этого пишутся констрейнты, в которых явно прописываются частоты и нестабильности клоков. Если времянка сошлась, схема БУДЕТ работать на этой частоте.

 

Чисто теоретически должно работать. А практически кто проконтролирует время сетап-холд? Или раскладчик поймёт всё правильно и я зря парюсь?

Вот, это правильные слова! Нужно написать XDC constraints - и сетапы-холды будут проверены автоматически, и даже репорт будет генериться на каждую реинкарнацию дизайна.

Edited by Кoнстантин

Share this post


Link to post
Share on other sites
То, что происходит в схеме между фронтами тактовой частоты - вас волновать по идее не должно. Вы же цифровым дизайном занимаетесь, а не аналоговым. Роутер постарается развести так, чтобы К СЛЕДУЮЩЕМУ фронту клока на выходе всех регистров был годный результат. Именно для этого пишутся констрейнты, в которых явно прописываются частоты и нестабильности клоков. Если времянка сошлась, схема БУДЕТ работать на этой частоте.
Я говорил про начальные условия. Когда внутренний глобальный ресет плисины привязан совершенно не к той частоте на которой работает сама схема. В результате имеем асинхронный сброс который ещё и skew имеет. В результате если не сделать правильную схему сброса мы получим любопытный фокус. Часть триггеров уже выйдут из реста и увидят клок. А часть ещё будет в ресете.

 

Например мы имеем регистр защёлку который имеет два бита. Предположем что он сбрасывается в ноль и на входе у него единицы. Чисто по цифровому дизайну у него по включению должно быть 00 а через 1 такт на выходе должно быть 11. Но если у нас не сделана схема корректного сброса то мы имеем шанс получить на выходах вот такую последовательность: 00 -> 01 -> 11. Более того скажу что это эффект отлично симулиться при симуляции уже разложенной схемы.

 

 

Вот, это правильные слова! Нужно написать XDC constraints - и сетапы-холды будут проверены автоматически, и даже репорт будет генериться на каждую реинкарнацию дизайна.
А вот тут поподробнее. Какие дополнительные констрейны нужно прописать? Ведь формально если мы указали тактовую на выходе до делителей всё остальное вычисляется. Хватит ли раскладчику одного таймспека на частоту или нужно ещё что-то?

Share this post


Link to post
Share on other sites
А вот тут поподробнее. Какие дополнительные констрейны нужно прописать? Ведь формально если мы указали тактовую на выходе до делителей всё остальное вычисляется. Хватит ли раскладчику одного таймспека на частоту или нужно ещё что-то?

Достаточно обконстрейнить быстрый клок. В общем-то и все.

У вас нет асинхронных проблем. Clock domain - всего один. Да, в нем есть еще сигнал, который меняет состояние каждый второй такт (вы его зовете медленным клоком) - ну и ОК. А еще есть внешний ресет. Да, это внешний асинхронный сигнал, его нужно синхронизировать - записать в регистр по клоку. А на выходе регистра будет он уже синхронным в этом клок домейне. ОСтальные расчеты оставьте технике.

Share this post


Link to post
Share on other sites
Достаточно обконстрейнить быстрый клок. В общем-то и все.

У вас нет асинхронных проблем. Clock domain - всего один. Да, в нем есть еще сигнал, который меняет состояние каждый второй такт (вы его зовете медленным клоком) - ну и ОК.

Ну я бы всё же не называл его сигналом. Сигнал был бы если бы у меня стоял T триггер. Тогда и проблем не было бы. А тут всё же обе частоты совпадают регулярно фронтами. Хотя формально можно считать сигналом.
А еще есть внешний ресет. Да, это внешний асинхронный сигнал, его нужно синхронизировать - записать в регистр по клоку. А на выходе регистра будет он уже синхронным в этом клок домейне.
По хорошему 2 триггера надо бы :)
ОСтальные расчеты оставьте технике.
Просто хотелось убедиться что техника поймёт этот изврат правильно. :)

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this