Jump to content

    

переход из одного клокового домайна в друго

господа,

 

есть два синхронных процесса которые работают от разных тактовых частот. Cигнал из первого процесса идет во второй (старт) и сигнал из второго идет в первый (финиш), тактовые частоты не кратные.

 

хотелось бы узнать кто и как решает эту задачу чтобы соблюдать тайминг

 

заранее благодарен

Share this post


Link to post
Share on other sites
есть два синхронных процесса которые работают от разных тактовых частот. Cигнал из первого процесса идет во второй (старт) и сигнал из второго идет в первый (финиш), тактовые частоты не кратные.

 

хотелось бы узнать кто и как решает эту задачу чтобы соблюдать тайминг

 

Оба сигнала пропустить через линию задержки из хотя бы двух триггеров, работающих от того клокового домена, в котором они будут чем-то управлять, чтобы метастабильность не пакостила, и констрейны объявить (в виде синопсис SDC, их же понимает квартусовский TimeQuest)

 

set_false_path -from [get_clocks clock_A] -to [get_clocks clock_B]

set_false_path -from [get_clocks clock_B] -to [get_clocks clock_A]

 

чтобы тайминг-аналайзер забыл о том, что меж доменов надо что-то проверять вообще.

Share this post


Link to post
Share on other sites

уважаемый SM

 

раскажите по подробнее как это обявить

констрейны объявить (в виде синопсис SDC, их же понимает квартусовский TimeQuest)

 

set_false_path -from [get_clocks clock_A] -to [get_clocks clock_B]

set_false_path -from [get_clocks clock_B] -to [get_clocks clock_A]

в квартусе (использую 6.1)

 

спасибо

Share this post


Link to post
Share on other sites
уважаемый SM

 

раскажите по подробнее как это обявить

констрейны объявить (в виде синопсис SDC, их же понимает квартусовский TimeQuest)

 

set_false_path -from [get_clocks clock_A] -to [get_clocks clock_B]

set_false_path -from [get_clocks clock_B] -to [get_clocks clock_A]

в квартусе (использую 6.1)

 

В опциях включить TimeQuest (в settings->compilation process settings->timing analysis processing) , тогда из Ваших старых квартусных констрейнов после перекомпиляции оно сгенерит .sdc файл, с новыми, стандартными констрейнами. Дальше файл править текстовым редактором - там теперь все констрейны будут. В констрейнах "по-старинке" это было тоже реализуемо, кажется называлось

"cut timing path" - но с появлением таймквеста от него лучше уйти

Share this post


Link to post
Share on other sites

Имеет смысл ознакомиться с соответствующей литературой, где данные вопросы освещены достаточно полно, например "Real Chip Design and Verification Using Verilog and VHDL". Рекомендую топик "Flancter" (публикация была и у Xilinx - xcell37_54) - решение простое, и надежное (если представлять некоторые его ограничения и особенности). Я, кстати, был очень удивлен, что поиск по данному ключевому слову в конференции ничего не выдал.

 

Более продвинутая публикация, например, "Fourteen Ways to Fool Your Synchronizer" - найти ее несложно.

Share this post


Link to post
Share on other sites

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

Статьи по clock domain ищите на http://www.sunburst-design.com/papers/ например http://www.sunburst-design.com/papers/Cumm...SJ_AsyncClk.pdf

Share this post


Link to post
Share on other sites

Есть хорошая книжка - "Advanced ASIC chip synthesis using synopsys design compiler, physical compiler and primetime" - она есть и в электронном виде, по крайней мере в осле. Там очень хорошо описано, как констрейнить многоклоковые дизайны, и это все применимо в квартусе с версии 6.0.

 

И, самое главное, это собственно альтерские описания:

 

http://www.altera.com/literature/hb/qts/ug_tq_tutorial.pdf

http://www.altera.com/literature/hb/qts/qts_qii53018.pdf (раздел Clock Specification - там рассказано, как обконстрейнить клоки, зависящие друг от друга, а также независимые)

Share this post


Link to post
Share on other sites
господа,

 

есть два синхронных процесса которые работают от разных тактовых частот. Cигнал из первого процесса идет во второй (старт) и сигнал из второго идет в первый (финиш), тактовые частоты не кратные.

 

хотелось бы узнать кто и как решает эту задачу чтобы соблюдать тайминг

 

заранее благодарен

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

Share this post


Link to post
Share on other sites
всем огромное спасибо сижу разбираюсь

 

А не лучше сделать нормальный переход между доменами, чем обходить его в настройках Quartus'а, чтобы тот не ругался ? Вы же потом получите неустойчивые состояния у триггеров, глитчи и так далее. Лучше один раз сделайте одновибратор с сигналом запуска из другого клокового домена, и проверьте его на железе.

 

Например, классический одновибратор:

one = DFF( DFF(VCC, CLK1, !one, ), clk2, , ); -- дает пропуски сигнала из-за глитчей на сигнале асинхронного сброса

 

Синхронные системы не всегда работают, если частоты CLK1 и CLK2 близки по значению...

 

Поэтому систему нужно усложнять. И как это сделать наиболее просто и эффективно - вот интересная тема для обсуждения :)

Share this post


Link to post
Share on other sites
А не лучше сделать нормальный переход между доменами, чем обходить его в настройках Quartus'а, чтобы тот не ругался ?

 

Никто и никогда не говорил, что не надо делать нормального перехода между доменами. НО (!) обходить его в настройках синтезатора надо обязательно, если, конечно, синтезатор сам по себе его не обойдет.

Share this post


Link to post
Share on other sites

Я использую для переноса сигнала с одной частоты на другую вот такой модуль, в принципе нормально работаетpost-6536-1171889059_thumb.jpg

Share this post


Link to post
Share on other sites
Я использую для переноса сигнала с одной частоты на другую вот такой модуль, в принципе нормально работаетpost-6536-1171889059_thumb.jpg

А как такой модуль на VHDL выглядит?

Share this post


Link to post
Share on other sites

Я использую для переноса сигнала с одной частоты на другую вот такой модуль, в принципе нормально работаетpost-6536-1171889059_thumb.jpg

А как такой модуль на VHDL выглядит?

 

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

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
Sign in to follow this