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

Измерение интервалов. Один счётчик с Fт vs два счётчика с Fт/2.

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

8 minutes ago, MrGalaxy said:

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

Это  одно и тоже  - только в этом случае вы "задерживаете" клок на  половину такта :)  И при этом вы должны асинхронный входной сигнал  перевести в два клоковых домена для управления счетчиками. 

А  счет разными счетчиками по разным фронтам особенностей не имеет. 

Удачи! Rob.

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


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

28 минут назад, blackfin сказал:

 можно предположить, что суммарное время "setup"+"hold" для каждого триггера больше времени периода клока.

Время установления выходных данных, судя по симуляции, около 14 ns, период 50 MHz такта 20 ns. 

32 минуты назад, blackfin сказал:

 со сдвинутым на 90 град. 

на 180 :)

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


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

1 minute ago, MrGalaxy said:

на 180 :)

Да, виноват.. Поправил.. В голове уже крутились XAPP523 и XAPP585.. :)

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


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

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

Кстати,  если считать только по двум фронтам одного клока то достаточно 1 счетчика и несколько триггеров которые еще и как CDC работать будут,  типа

...
always_ff @(negedge clk) begin
  din_f  <= pulse_in;
end

always_ff @(posedge clk) begin
  din_r  <= pulse_in;
  din_fr <= din_f;  // negedge -> posedge timing!

  din_fq <= din_fr;
  din_rq <= din_r;

  din_en <= din_rq | din_fq;

  case ({din_en, din_rq, din_fq})
    3'b001: cnt <= 1;
    3'b010: cnt <= 1;
    3'b011: cnt <= 2;
    3'b111: cnt <= cnt+2;
    3'b101: cnt <= cnt+1;
    3'b100: out <= cnt;
  endcase
end

Удачи! Rob.

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


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

Доброе утро!

RobFPGA, так делать нельзя, код ПЛИС - это не программирование. Операции присвоения сигналам выполняются параллельно.

Цитата

  reg_r <= pulse_in;
  din_fr <= din_f;  // negedge -> posedge timing!

  din_fq <= din_fr;
  din_rq <= din_r;

  din_en <= din_rq | din_fq;

 

Встречаю такие ошибки не только на форуме, на работе тоже бывает вижу. Поначалу спорят, говорю: запустите симулятор и посмотрите фронты. Запускают, убеждаются.

Изменено пользователем MrGalaxy

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


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

15 minutes ago, MrGalaxy said:

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

А где тут ошибки? Я что-то не вижу.. ;)

 

15 minutes ago, MrGalaxy said:

Поначалу спорят, говорю: запустите симулятор и посмотрите фронты. Запускают, убеждаются.

Аналогичный вопрос: вы уже запускали этот код в симуляторе? Видели ошибки фронтов?

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


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

6 минут назад, blackfin сказал:

А где тут ошибки? Я что-то не вижу.. ;)

1. Сигналу din_fq присваивается присваивается значение сигнала din_fr, которое присваивается в этом же процессе.

2. Сигнал din_en зависит от сигналов din_fq и din_rq, значения которым также присваивается в этом процессе.

13 минут назад, blackfin сказал:

Аналогичный вопрос: вы уже запускали этот код в симуляторе? Видели ошибки фронтов?

И не собираюсь. Потому что уже видел и знаю.

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


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

2 hours ago, MrGalaxy said:

1. Сигналу din_fq присваивается значение сигнала din_fr, которое присваивается в этом же процессе.

2. Сигнал din_en зависит от сигналов din_fq и din_rq, значения которым также присваивается в этом процессе.

И что с того? Там везде используются неблокирующие присваивания.

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

Так что все в порядке.. :)

 

2 hours ago, MrGalaxy said:

 И не собираюсь. Потому что уже видел и знаю.

Ну и зря.. Полагаю, вас бы ждал сюрприз.. ;)

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


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

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

3 hours ago, MrGalaxy said:

RobFPGA, так делать нельзя, код ПЛИС - это не программирование. Операции присвоения сигналам выполняются параллельно.

Не знал этого, не знал :scratch_one-s_head:  Давно уже не знал :biggrin: 

3 hours ago, MrGalaxy said:

И не собираюсь. Потому что уже видел и знаю.

"Не смотрел, но осуждаю!

Удачи! Rob.

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


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

вообще в вашем случае, лучше 4 счетчика на 4-х фазах частоты, потом комбайнер, который их обьединит)

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


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

1 час назад, des00 сказал:

вообще в вашем случае, лучше 4 счетчика на 4-х фазах частоты, потом комбайнер, который их обьединит)

Т.е. проблемы, о которой писал Lmx2315, не существует?

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

Изменено пользователем MrGalaxy

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


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

15 minutes ago, MrGalaxy said:

Т.е. проблемы, о которой писал Lmx2315, не существует?

если про метастабильность, то конечно существует. ЕМНИП при стандартном измерении длительности интервалов асинхронных сигналов, методом выделения фронта и запуска счетчика, максимальная погрешность измерения будет 2*T, ее можно снизить до T, где то видел эту информацию в книгах, но надо искать.

Ну и чем меньше вы сделате T, тем вам будет лучше.

ЗЫ. Там по сути ставится 4.8 счетчиков, на 4-х тактовых со сдвигом 90/45 градусов + по обоим фронтам. Они все работают классически, потом стоит логика пересчета результатов в конечный результат.

ЗЗЫ. Если ваша ПЛИС позволяет, лучше поднять частот до 200-300МГц.  Пересчитывать 2 счетчика, проще чем 4-8 ;)

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


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

2 hours ago, des00 said:

ЗЫ. Там по сути ставится 4.8 счетчиков, на 4-х тактовых со сдвигом 90/45 градусов + по обоим фронтам. Они все работают классически, потом стоит логика пересчета результатов в конечный результат.

ЗЗЫ. Если ваша ПЛИС позволяет, лучше поднять частот до 200-300МГц.  Пересчитывать 2 счетчика, проще чем 4-8 ;)

Реально сложный вариант, проще организовать линию задержки и захватить одним клоком (или несколькими фазами одного клока) фронт входного сигнала. Затем перевести линейный код в число дискрет которого будет равен времени задержки одного элемента лз. Соотв для того чтобы это сделать есть несколько вариантов, самый простой это то что я описал, есть нониус , когда клоковый сигнал тоже проходит через лз и задержаные фазы клока используются для захвата данных лз входного сигнала. Еще есть вариант на ring oscilator , который разновидность нониуса, поскольку два генератора с близкой частотой стартуют в моменты прихода фронта входного сигнала и фронта клока плис . Момент совпадения фазы соотв зависит от временного расположения этих событий.  К первому варианту возможно пригородить встроеные mgt или serdes тогда эффективное разрешение будет равно периоду частоты тактирования сериализатора, но она обычно ограничена 1-5ггц.

Из этих вариантов по моим изысканиям наиболее хорошо на плис ложится самый первый. Тк кольцевые генераторы внутри плис (сайлинкс в моем случае), очень шумные и не позволяют получить разрешение лучше чем 100пс без усложнения схемы. Делать линию задержки клока и затем распределять это по ячейкам плис вообще нереально тк клоки в плис имеют собственные ресурсы которых мало (либо реализация на латчах что само по себе забавно). Кроме того линии тактирования проще забить несколькими фазами с плл. Эффект тот же что и от лз только предсказуемость выше. 

ЗЫ Вообще много информации доступно в гугле по ключевым словам TDC FPGA  благодаря физикам, которые регистрируют частицы. Я прикрепил несколько статей

 

 

high resolution tdc in fpga.pdf

low resource fpga based tdc.pdf

TimingWorkshopClermont-girerd.pdf

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


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

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

3 hours ago, Neekeetos said:

Реально сложный вариант, проще организовать линию задержки и захватить одним клоком

Ну так о чем я и писал еще в самом начале. Самый простой и проверенный вариант. 

Удачи! Rob.

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


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

2 hours ago, RobFPGA said:

Самый простой и проверенный вариант. 

Ну да, только реальных примеров реализации мало. Научные статьи немного зажимают нюансы :).

Вот сваял сейчас линию задержки длиной 2.45нс судя по расчетам. Схема эксперимента такова,

есть плис с клоком на 150мгц, есть входной сигнал на 50мгц, который поступает на лз из 128 тапов (7бит), где и оцифровывается(два 128битных регистра друг за другом). Затем декодируется из линейного кода в номер отсчета где обнаружился фронт. Поскольку линия задержки короче периода (2,45нс против 6,(6)нс ) то события регистрируются не всегда а только когда фронт проходит. График поэтому выглядит так, примерно 2/3 времени дедтайм. По горизонтали такты плис, по вертикали номер отвода лз где был зарегистрирован фронт:

721518491_2.2.thumb.png.4fe9f5880c51ad071c6c86f3712ea9d7.png

Увеличение, видно что особо метастабильности не наблюдается, как и шума. Один тап в среднем получается 19пикосекунд как можно посчитать,

понятно что есть нелинейность, но это такой плис.

1728699612_2.2.thumb.png.51aba1e915e0b91ab0c28ba56916641d.png

ЗЫ плис спартан6 - xc6slx16-2 , думаю на более крутых плис  будет веселее.

 

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


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

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

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

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

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

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

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

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

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

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