Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Делитель двух клоков с синхронизацией
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
sergey sva
Есть несколько тактовых сигналов приходят в модуль делителя. Задержка(фаза) этих сигналов изменяется произвольно. Их нужно поделить на два без потери фазы. Сейчас сделал деление по переднему фронту, проблема когда задержка около 180 или 360 градусов при синхронизации делителя происходит перескок. Как засинхронизировать делитель что бы не было перескоков, может нужно использовать специальный делитель ?
Golikov A.
что такое синхронизация делителя?
sergey sva
Опять не понятно написал ( ссори. Два сигнала нужно поделить на два. После будет измеряться задержка между этими сигналами. В момент захвата нужно что бы после делителя сигнал сохранял фазу от 0 до 360. Иногда происходит перескок.
Golikov A.
заведите эти 2 сигнала на клок д триггера, замкнутого на себя через инвертер, и будет вам делитель на 2, какая тут фаза может перескочить?
sergey sva
В момент захвата иногда перескакивает. Измерять нужно задержку между этими клоками их нужно правильно синхронизировать что бы измерить 0 до 360 градусов. Сейчас еще раз проверю может что то не так сделал. Примерно так сделано. Каждый сигнал проходит через такой делитель.
Код
reg chanclock;
reg clockout;
always@(posedge clck)
begin
   if(SINCHR)
   begin
       clockout = CLOCKFORDIV;
       chanclock = CLOCKFORDIV;

   end
   else begin  
    
   if(chanclock != CLOCKFORDIV)
   begin
      chanclock = CLOCKFORDIV;
       if(CLOCKFORDIV) clockout = ~clockout;
   end

end
end
likeasm
для xilinx

module clk_div(clk,clk_div2,rst);
input clk,rst;
output clk_div2;

FDCE FDCE_inst (
.Q(clk_div2), // 1-bit Data output
.C(clk), // 1-bit Clock input
.CE(1'b1), // 1-bit Clock enable input
.CLR(rst), // 1-bit Asynchronous clear input
.D(~clk_div2) // 1-bit Data input
);

endmodule
Maverick
Цитата(sergey sva @ Sep 21 2015, 15:05) *


Т триггер всегда описывал так

Код
module tff_async_reset (
data  , // Data Input
clk   , // Clock Input
reset , // Reset input
q       // Q output
);
//-----------Input Ports---------------
input data, clk, reset;
//-----------Output Ports---------------
output q;
//------------Internal Variables--------
reg q;
//-------------Code Starts Here---------
always @ ( posedge clk or negedge reset)
if (~reset) begin
  q <= 1'b0;
end else if (data) begin
  q <= !q;
end

endmodule //End Of Module tff_async_reset


никогда с этим не было проблем ...
может у Вас есть пересечение клоковых доменов?
Golikov A.
а пути сигналов по кристаллу учитываются?
sergey sva
Цитата
может у Вас есть пересечение клоковых доменов?

Все от одного клока тактируется по переднему фронту.
Цитата
а пути сигналов по кристаллу учитываются?

Нет не учитывал, частота не высокая Кгц, не думал что это может влиять.
Один момент на вход модуля делителя поступают два клока из другого устройства фаза этих сигналов гуляет произвольно. Убирается сигнал сброса в делителе, он должен захватить входные клоки и на входе выдать два клока /2 фаза которых должна быть такая же как у поступающих на вход. Если тригер использовать иногда происходит перескок.
Golikov A.
погодите у вас такая схема

always @(posedge clk)
begin
clock1 <= clock1_in;
clock2 <= clock2_in;
end

то есть вы по фронту какого-то высокочастотного клока захватываете внешние произвольные сигналы?
sergey sva
Цитата
то есть вы по фронту какого-то высокочастотного клока захватываете внешние произвольные сигналы?

Да. Сигналы не высокочастотные Кгц, а основной клок 120Мгц.
Maverick
Цитата(sergey sva @ Sep 22 2015, 07:29) *
Да. Сигналы не высокочастотные Кгц, а основной клок 120Мгц.

Вот Вам и пересечение клоковых доменов

Цитата(Golikov A. @ Sep 21 2015, 20:51) *
always @(posedge clk)
begin
clock1 <= clock1_in;
clock2 <= clock2_in;
end

т.е. здесь должно быть по 2 регистра
sergey sva
Цитата
т.е. здесь должно быть по 2 регистра

Не совсем понял как сделать, последовательно два регистра ?
Maverick
Цитата(sergey sva @ Sep 22 2015, 08:15) *
Не совсем понял как сделать, последовательно два регистра ?

смотреть здесь
рисунок 3

И тогда делить на 2 (либо Ваша схема Т триггера) - на частоте кГц, а заводить на 120 Мгц уже деленную на 2.
Это если я правильно понял Вас
Golikov A.
только надо понимать что разрешение по разности фаз упадет до синхронизирующей частоты. И не очень понятно зачем делить на 2 перед определением разности фаз, когда можно это сделать сразу для полной частоты?

sergey sva
Попробую но думаю что это не поможет. например на входе 1 0 после делителя может быть 1 0 или 0 1 что бы измерять от 0 до 360.
Golikov A.
Цитата
Попробую но думаю что это не поможет

думаете не поможет стандартное решение которое помогает миллионам разработчиков в такой ситуации? Не думайте - верьтеsm.gif)))
sergey sva
Верю )). Если измерять в пределах 0-180 то все нормально, но если измерить 360. то перескок.
Импульсы на вход поступают постоянно а захват 100 раз в секунду получается то так то так.
Golikov A.
что-то я не очень понимаю что вы делаете... ну вам виднее
sergey sva
Исправил как порекомендовали здесь, так правильнее будет.
Но иногда перескакивает. Вот пример: в какой то момент времени нужно прицепиться к двум проводам по которым идут импульсы. Импульсы произвольно меняют задержку относительно друг друга.
Подключаемся к проводам. Модуль начинает делить по переднему фронту входные импульсы. На выходах может получиться два варианта : выход первый = 1 , выход второй = 0 или второй вариант выход первый = 0 , выход второй = 1 .
Задержка меняется произвольно поэтому так получается.
Krys
Вы бы нарисовали, может так понятнее будет.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.