Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Схема совпадений
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
//Nikson
что-то форум слегка глючит и сообщение куда-то пропало. пробую ещё раз

доброго всем времени суток.

по учёбе возникла необходимость промоделировать парочку схем, методом научного тыка вроде бы немного разобрался, но не могу придумать, как реализовать вот что:

у меня есть 2 тактовых сигнала с близкими частотами, например, 125 и 130 МГц. они стартуют в разные моменты времени и по идее, рано или поздно их передние фронты должны совпасть. вот этот момент и нужно определить - то есть сделать схему совпадений для тактовых сигналов.

есть какой-нибудь _простой_ метод, позволяющий это сделать? может, какая-нить хитрая мегафункция имеется...

ЗЫ. пользуюсь Quartus, если это имеет значение.
Magnum
NXOR попробуй smile.gif
Kazap
Сначала объедините по И оба сигнала, затем этот объединенный и сигнал более высокой частоты
подайте на xor.
Осталось отловить тот тактовый период, на котором не будет импульса на вых. xor smile.gif
sazh
Странная задача. А смысл в чем?
По идее Вы можете работать только в дискретах. Берете например частоту много выше например 500 мГц. Стробируете ею эти клоки. И анализируете по обоим каналам, когда совпадут состояния 01 (xor не подходит, если надо анализировать какой то один перепад). И зачем это надо. Ведь не определить количество этих совпадений в дискретах этой 500 мГц частоты.
Верилог:

module comp_clk
(
input clk_500,
input clk_125,
input clk_130,
output out
);

reg [1:0] shift_left_rga;
reg [1:0] shift_left_rgb;

always @(posedge clk_500)
begin
shift_left_rga <= {shift_left_rga[0], clk_125};
shift_left_rgb <= {shift_left_rgb[0], clk_130};
end
assign out = (shift_left_rga == 2'b01) & (shift_left_rgb == 2'b01);


endmodule
Gate
Я бы сделал так:
1. Рассматривать один сигнал как клок, другой - как данные.
2. Приготовить из клока задержаный на небольшое время. Этоя время будет задавать точность, с которой определится время совпадения фронтов.
3. Данные щелкать в регистры (возможно, в 2 для убирания метастабильности) по клоку и задержаному клоку.
4. Если защелкнуто по клоку 0, а по задержанному 1, то был фронт в промежутке между.
Эта система определит совпадение фронтов, если фронт по данным пройдет позже фронта клока. Чтобы не потарять ситуацию, когда фронт данных ранише фронта клока - либо меняете местами клок и данные, либо задерживаете данные и дважды клок - сообразите сами, писать лень.
sazh
А Вы все не пишите.
Вы только приготовьте из клока задержаный на небольшое время. А дальше мы уж сами.
Magnum
Ну например если использовать PLL то можно там вывести смещенную по фазе частоту клока.
Gate
Цитата(sazh @ May 24 2006, 14:16) *
А Вы все не пишите.
Вы только приготовьте из клока задержаный на небольшое время. А дальше мы уж сами.

Чувствуется ехидная ирония smile.gif
Зависит от задачи: если только моделирование - то assign clk1=#0.5 clk
Если в железе - использовать pll, или цинично пропустить через несколько лог. элементов (умоляю, не надо мне объяснять, что в парадигме синхронного дизайна это моветон, я знаю и мне стыдно wub.gif ) .
К сожалению, задача поставлена некорректно, т.к. не задана точность (и вообще похоже на учебную задачу). В симуляторе, например, ждать совпадения 2-х произвольных фронтов можно очееееень долго.
KykyryzzZ
Цитата(Kazap @ May 24 2006, 11:17) *
Сначала объедините по И оба сигнала, затем этот объединенный и сигнал более высокой частоты
подайте на xor.
Осталось отловить тот тактовый период, на котором не будет импульса на вых. xor smile.gif

А чем такой подход не нравится?
Только здесь еще будут выделяться совпадения по спаду, надо придумать как их отбрасывать
sazh
// Эта система определит совпадение фронтов, если фронт по данным пройдет позже фронта клока. Чтобы не потарять ситуацию, когда фронт данных раньше фронта клока - либо меняете местами клок и данные, либо задерживаете данные и дважды клок.
И что в результате. Получим два отклика по одному фронту? А длительность этих откликов уже никому не нужна?.На какой частоте приемника можно уверено зафиксировать такой импульс? Да еще соблюсти времена установки данных для корректной работы в программируемой логике.
Все что Вы предлагаете, это по сути эквивалент решения, приведенного мною Выше. И ничего другого быть не может.
Gate
Цитата(sazh @ May 24 2006, 15:26) *
// Эта система определит совпадение фронтов, если фронт по данным пройдет позже фронта клока. Чтобы не потарять ситуацию, когда фронт данных раньше фронта клока - либо меняете местами клок и данные, либо задерживаете данные и дважды клок.
И что в результате. Получим два отклика по одному фронту? А длительность этих откликов уже никому не нужна?.На какой частоте приемника можно уверено зафиксировать такой импульс? Да еще соблюсти времена установки данных для корректной работы в программируемой логике.

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

Все в мире эквивалентно, ибо имеет одного создателя. А дьявол кроется в деталях. Если в задаче поставить точность 1 нс, то моим способом можно сделать, а как сделать внутреннюю частоту fpga 1 ГГЦ? Тогда надо вводить фазовые сдвиго Вашего базового клока на 90, 180 и 270 градусов и работать в их доменах, тогда частоту можно уронить в 4 раза.
Gate
Цитата(KykyryzzZ @ May 24 2006, 15:04) *
Цитата(Kazap @ May 24 2006, 11:17) *

Сначала объедините по И оба сигнала, затем этот объединенный и сигнал более высокой частоты
подайте на xor.
Осталось отловить тот тактовый период, на котором не будет импульса на вых. xor smile.gif

А чем такой подход не нравится?
Только здесь еще будут выделяться совпадения по спаду, надо придумать как их отбрасывать

1. У Вас на выходе асинхронная игла с неопределенной сколь угодно малой длительностью. Что потом с ней делать дальше?
2. Причем при точном совпадении фронтов ее длительность =0 (если пренебречь задержками в И), т.е. возможна потеря.
3. Выходной сигнал будет всегда, если на И исказится положительный полупериод быстрейшего клока, т.е. время совпадения жестко определено и равно половине периода быстрейшего клока.
sazh
///Вы невнимательно прочитали мой пост, или не подумали, а ведь собирались дальше сами. Замечу, что у меня выходной сигнал находится в тактовом домене - или обычного или задержанного, как сделаете.
Вы оперируете одним периодом этого клокового домена.
Во втором Вы действительно подхватите этот пичок. И получите импульс в период. А если фронт удасться зафиксировать и в следующем периоде, зафиксируете длительность в два периода. так и будете вобулировать. Хоть и не царское это дело, может напишите модуль?
Gate
Цитата(sazh @ May 24 2006, 16:01) *
///Вы невнимательно прочитали мой пост, или не подумали, а ведь собирались дальше сами. Замечу, что у меня выходной сигнал находится в тактовом домене - или обычного или задержанного, как сделаете.
Вы оперируете одним периодом этого клокового домена.
Во втором Вы действительно подхватите этот пичок. И получите импульс в период. А если фронт удасться зафиксировать и в следующем периоде, зафиксируете длительность в два периода. так и будете вобулировать.

Вы имеете в виду ситуацию, когда частоты близки и фронты будут совпадать с заданной точностью в течение не одного, а N периодов? Да, такое возможно, на выходе будет не однотактный строб, а длинный - ну выделите из него фронт стандартной цепочкой из 2 триггеров и xor, если задача это требует. У Вашего кода будет такой же недостаток.

A propos а что такое "вобулировать"?
Цитата
Хоть и не царское это дело, может напишите модуль?

Вам должно быть стыдно:
Код
assign d=#0.5 clk1;
assign c1= clk2;
assign c2=#1.0 clk2;
always @(posedge c1) d1<=d;
always @(posedge c2) d2<=d;
assign out=(d2 & ~d1);

Без сброса, убирания метастаб. и пр.
KykyryzzZ
Цитата(Gate @ May 24 2006, 15:58) *
1. У Вас на выходе асинхронная игла с неопределенной сколь угодно малой длительностью. Что потом с ней делать дальше?
2. Причем при точном совпадении фронтов ее длительность =0 (если пренебречь задержками в И), т.е. возможна потеря.
3. Выходной сигнал будет всегда, если на И исказится положительный полупериод быстрейшего клока, т.е. время совпадения жестко определено и равно половине периода быстрейшего клока.

Согласен
sazh
Вы имеете в виду ситуацию, когда частоты близки и фронты будут совпадать с заданной точностью в течение не одного, а N периодов? Да, такое возможно, на выходе будет не однотактный строб, а длинный - ну выделите из него фронт стандартной цепочкой из 2 триггеров и xor, если задача это требует. У Вашего кода будет такой же недостаток.

Стыдиться мне нечего. Дальше фронта не пошлют. Меньше взвода не дадут. У моего кода нет такого недостатка.
Gate
Цитата(sazh @ May 24 2006, 17:12) *
У моего кода нет такого недостатка.

Есть. При соотношении частот 500/130/125 Мгц Ваш код на каждое совпадение выдаст банч из примерно 6 импульсов. Между импульсами будут пробелы по 3-4 такта. А при другом соотношении частот число импульсов изменится.
EvgenyNik
Решал однажды такую задачу. Не всё так просто, как кажется :-)
Было две основных проблемы:
1. При обозначенных частотах сравнение фронтов будет довольно сложным из-за разных и, к сожалению, изменяющихся при перекомпиляциях, временных задержек внутри кристалла.
2. В моём случае надо было не просто просигнализировать постфактум о том, что совпадение было, а предсказать - что на следующем фронте оно будет или что на следующем его уже не будет. Подразумевалось, что за совпадение фронтов принималось время +/- 12% от длительности единички наибольшей частоты.
ЗЫ: Использование PLL может помочь только если хотя бы одна из частот достаточно стабильна.
//Nikson
уххх, граждане.. ну и дискуссию устроили smile.gif только драться не надо, ОК wink.gif

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

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

а надо было это вот зачем - есть такой алгоритм измерения временных интервалов - по приходу "старт" запускется один генератор, тактирует счётчик, по приходу "стоп" второй генератор тактирует второй счётчик, а при совпадении тактовых сигналов счётчики отключаются и по их показаниям можно определить длительность измеряемого интервала. есть конечно и другие методы, а этот хотел просто попробовать. чёрт с ним, пойду в соседнюю тему народ по поводу линий задержек спрашивать smile.gif

спасибо, всё написанное пригодится. :!:
DmitryR
Посмотрите у Xilinx XAPP250 - там есть схема на двух триггерах и одной логике, IMHO то, что Вам надо.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.