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

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот кстати мой вариант для передачи стробов меж доменами. Данные - просто подрегистрить на задержку строба, если это надо. Выход 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

вот кстати мой вариант для передачи стробов меж доменами. Данные - просто подрегистрить на задержку строба, если это надо. Выход 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;" где первые два триггера просто пропускают сигнал и только перед третьим ставим логику.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

 

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

 

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

 

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

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

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

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