Jump to content

    

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

Почитал руководство, посмотрел близкие темы (Quartus TimeQuest, кто-нибудь пользуется? , констрейны в Квартусе, как использовать?????, Quartus TimeQuest), точного ответа пока не нашёл. Я выполняю переход между тактовыми доменами, синхронизатором на 2 триггерах (схему изображение тоже видел, как работает понял, но пользуюсь обычными синхронизаторами, обрабатывая длительности импульсов самостоятельно).

ВОПРОС как правильно "обконстрейнить" их в TimeQuest?

Вариант0: задать false_path - вроде бы, логично.

Вариант1: задать входную и выходную частоту в разных группах с параметром -asyncronous - проверено, тогда анализатор вообще не формирует междоменных путей на setup / hold - и, соответственно,, разводит как ему удобно.

А как вообще выполняется анализ, если частоты "плохо кратные" - я пробовал 100 МГц и 100 МГц*18/11 - и выполнялась какая-то разводка без предупреждений, и строились временные диаграммы на setup и hold - но ведь всё это, по идее, плавает от такта к такту? Более того, между частотами брался ещё и некий фазовый сдвиг (setup / hold relationship, на диаграмме не относящаяся ко времени распространения ни одной из частот) - откуда они брались? А как он поступает при переходе к кратным частотам, например к половинной? В документации сказано, что по умолчанию все они считаются взаимосвязанными - а как это на самом деле? А каковы вообще фазовые сдвиги между частотами, если они берутся с одной и той же PLL? И изменяются ли они при каждом включении / выключении устройства?

Share this post


Link to post
Share on other sites

вот кстати мой вариант для передачи стробов меж доменами. Данные - просто подрегистрить на задержку строба, если это надо. Выход completed - так, на всякий случай. Стробы обязаны быть на входе длиной в один период клока. На выходах тоже будут в один период. Какой клок быстрее - пофигу. Опробован уже и в асиках-кремнии, и на ФПГА, работает надежно. Что касается констрейнов - в разные клокогруппы их, в асинхронные, клоки эти, и забыть и забить. Если уж очень хочется обконстрейнить - то можно через set_max_delay внаглую от регистра-выхода одного клокодомена до входа другого.

 

ЗЫ

разные асинхронные клокогруппы и false_path это синонимы. Первое автоматически объявляет междоменные цепи false_path-ами, так что ваши варианты 0 и 1 это синонимы.

 

module interck2 ( in, out, clka, clkb, reset, completed);
input in, clka,clkb,reset;
output out, completed;

reg in_at_clka;
reg [1:0] out_at_clkb;

wire clra = reset | out_at_clkb[1];

always @(posedge clka or posedge clra)
  if (clra) in_at_clka <= 1'b0;
  else if (in) in_at_clka <= 1'b1;

always @(posedge clkb or posedge reset)
  if (reset) out_at_clkb <= 2'b00;
  else out_at_clkb <= {out_at_clkb[0] & !out_at_clkb[1], in_at_clka};

assign out = out_at_clkb[1];

reg [1:0] cmpl_at_clka;
reg cmpl_at_clkb;
wire clrb = reset | cmpl_at_clka[1];

always @(posedge clkb or posedge clrb)
  if (clrb) cmpl_at_clkb <= 1'b0;
  else if (out_at_clkb[1]) cmpl_at_clkb <= 1'b1;

always @(posedge clka or posedge reset)
  if (reset) cmpl_at_clka <= 2'h0; else
  cmpl_at_clka <= {cmpl_at_clka[0] & !cmpl_at_clka[1], cmpl_at_clkb};

assign completed = cmpl_at_clka[1];

endmodule

Share this post


Link to post
Share on other sites

Про эквивалентность вариантов - спасибо, понял; предпочту указание как асинхронных, наверное - чтоб не возиться с каждым путём.

Вопрос про выход completed Вашей схемы - это, фактически, выход, задержанный на ещё один такт b и 2 такта a - где и как удобно его использовать? А обычные синхронизаторы из 2 триггеров домена-приёмника - что можете сказать об опыте их использования?

И остались теоретические вопросы про PLL - каков взаимный сдвиг снимаемых с неё кратных частот, меняется ли он для устройства от включения к включению?

Share this post


Link to post
Share on other sites
Вопрос про выход completed Вашей схемы - это, фактически, выход, задержанный на ещё один такт b и 2 такта a - где и как удобно его использовать?

completed - это строб out, пропущенный обратно из домена clkb в clka точно также, как и in пробрасывался на out. Импульс на completed, синхронный с clka, говорит о том, что импульс прошел с in на out. По нему например можно подавать следующее данное...

А обычные синхронизаторы из 2 триггеров домена-приёмника - что можете сказать об опыте их использования?

Ну работают, вполне надежно работают. Только вопрос цели и задачи. Если просто пропустить сигнал с одного домена в другой, убив метастабильность - то это оно. А если нужен обмен с подтверждением, и при этом нет гарантий, что один клок быстрее второго, и клоки могут отличаться на порядки, например 32 кГц и 150 МГц, то это другое.

И остались теоретические вопросы про PLL - каков взаимный сдвиг снимаемых с неё кратных частот, меняется ли он для устройства от включения к включению?

Ну это доки читайте, часто это программируется параметрами PLL.

Share this post


Link to post
Share on other sites

Спасибо, по вопросам всё стало ясно, про PLL, когда возникнет задача, почитаю доки.

Share this post


Link to post
Share on other sites

Советую прочитать классику, начиная со стр. 874 :) Проектирование цифровых устройств, Дк. Ф. Уэйкерли.

Share this post


Link to post
Share on other sites
вот кстати мой вариант для передачи стробов меж доменами. Данные - просто подрегистрить на задержку строба, если это надо. Выход completed - так, на всякий случай. Стробы обязаны быть на входе длиной в один период клока. На выходах тоже будут в один период. Какой клок быстрее - пофигу. Опробован уже и в асиках-кремнии, и на ФПГА, работает надежно. Что касается констрейнов - в разные клокогруппы их, в асинхронные, клоки эти, и забыть и забить. Если уж очень хочется обконстрейнить - то можно через set_max_delay внаглую от регистра-выхода одного клокодомена до входа другого.

 

ЗЫ

разные асинхронные клокогруппы и false_path это синонимы. Первое автоматически объявляет междоменные цепи false_path-ами, так что ваши варианты 0 и 1 это синонимы.

 

module interck2 ( in, out, clka, clkb, reset, completed);
input in, clka,clkb,reset;
output out, completed;

reg in_at_clka;
reg [1:0] out_at_clkb;

wire clra = reset | out_at_clkb[1];

always @(posedge clka or posedge clra)
  if (clra) in_at_clka <= 1'b0;
  else if (in) in_at_clka <= 1'b1;

always @(posedge clkb or posedge reset)
  if (reset) out_at_clkb <= 2'b00;
  else out_at_clkb <= {out_at_clkb[0] & !out_at_clkb[1], in_at_clka};

assign out = out_at_clkb[1];

reg [1:0] cmpl_at_clka;
reg cmpl_at_clkb;
wire clrb = reset | cmpl_at_clka[1];

always @(posedge clkb or posedge clrb)
  if (clrb) cmpl_at_clkb <= 1'b0;
  else if (out_at_clkb[1]) cmpl_at_clkb <= 1'b1;

always @(posedge clka or posedge reset)
  if (reset) cmpl_at_clka <= 2'h0; else
  cmpl_at_clka <= {cmpl_at_clka[0] & !cmpl_at_clka[1], cmpl_at_clkb};

assign completed = cmpl_at_clka[1];

endmodule

Тема старая, так получилось, случайно нарвался, копаясь в архивах по теме.

Не совсем понял, по модулю SM: почему при пере-синхронизации в новый домен сигнал до анализа пропускается только один триггер, а не как обычно по классике в перессинхронизаторах - через два, и сделано в модуле из сообщения #15 ?

По идее строка "reg [1:0] out_at_clkb;", должны быть "reg [2:0] out_at_clkb;" где первые два триггера просто пропускают сигнал и только перед третьим ставим логику.

Разве так можно, с одним чистым триггером? Считаем что простейшая логика с сигналом от своего триггера работает так-же как и чистый триггер?

Share this post


Link to post
Share on other sites

Почему? Предположу что один 2И особой роли не сыграет. В принципе так и есть: не знаю как у Xilinx, а у Altera два рядом стоящих триггера трассируются через локальные ресурсы и LUT. А луту все равно какую функцию выполнять - буфер или 2И.

Share this post


Link to post
Share on other sites
Почему? Предположу что один 2И особой роли не сыграет. В принципе так и есть: не знаю как у Xilinx, а у Altera два рядом стоящих триггера трассируются через локальные ресурсы и LUT. А луту все равно какую функцию выполнять - буфер или 2И.
Вы не знаете, будут они рядом стоящие, или не рядом. Только если обконстренить, что хлопотно очень. Если встречали в рекомендации по метастабильности такой вариант - покажите где.

Share this post


Link to post
Share on other sites

надо всего 2 триггера.

 

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

 

Если бы был один начальный триггер, то в неустойчивых состояниях часть схемы могла считать его 1, а другая часть 0, и все бы развалилось, добавление второго триггера решает эту неоднозначность и поставляет всей схеме принятое вторым триггером решение.

 

Так что для пересинхрона надо всего 2 триггера, выход второго триггера используется в схеме и считается наверняка достоверным.

Share this post


Link to post
Share on other sites
Так что для пересинхрона надо всего 2 триггера, выход второго триггера используется в схеме и считается наверняка достоверным.

Это все же зависит от частотности и тиражности. В большинстве случаев 2, действительно, достаточно.

Share this post


Link to post
Share on other sites

Имеете ввиду что все же вероятность провала остается и чем чаще мы ее испытываем тем больше шансов все же ее поймать?

Share this post


Link to post
Share on other sites

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

И чем больше частота схемы - тем больше этот шанс.

Share this post


Link to post
Share on other sites
Насколько я понял - шанс получить метастабильность на выходе синхронизатора есть всегда, даже если он состоит из большего, чем два, количества триггеров.

И чем больше частота схемы - тем больше этот шанс.

Да, вероятность этого события не равна нулю. Но при двух и более синхронизаторов эта вероятность очень близка к нулю.

Share this post


Link to post
Share on other sites

С частотой понятно, я больше интересуют участием "тиражности" и тем правильно ли я понял смысл слова:)?

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