sergey sva
Sep 21 2015, 09:52
Есть несколько тактовых сигналов приходят в модуль делителя. Задержка(фаза) этих сигналов изменяется произвольно. Их нужно поделить на два без потери фазы. Сейчас сделал деление по переднему фронту, проблема когда задержка около 180 или 360 градусов при синхронизации делителя происходит перескок. Как засинхронизировать делитель что бы не было перескоков, может нужно использовать специальный делитель ?
Golikov A.
Sep 21 2015, 10:41
что такое синхронизация делителя?
sergey sva
Sep 21 2015, 11:15
Опять не понятно написал ( ссори. Два сигнала нужно поделить на два. После будет измеряться задержка между этими сигналами. В момент захвата нужно что бы после делителя сигнал сохранял фазу от 0 до 360. Иногда происходит перескок.
Golikov A.
Sep 21 2015, 11:45
заведите эти 2 сигнала на клок д триггера, замкнутого на себя через инвертер, и будет вам делитель на 2, какая тут фаза может перескочить?
sergey sva
Sep 21 2015, 12:05
В момент захвата иногда перескакивает. Измерять нужно задержку между этими клоками их нужно правильно синхронизировать что бы измерить 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
Sep 21 2015, 13:37
для 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
Sep 21 2015, 13:44
Цитата(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.
Sep 21 2015, 13:57
а пути сигналов по кристаллу учитываются?
sergey sva
Sep 21 2015, 15:02
Цитата
может у Вас есть пересечение клоковых доменов?
Все от одного клока тактируется по переднему фронту.
Цитата
а пути сигналов по кристаллу учитываются?
Нет не учитывал, частота не высокая Кгц, не думал что это может влиять.
Один момент на вход модуля делителя поступают два клока из другого устройства фаза этих сигналов гуляет произвольно. Убирается сигнал сброса в делителе, он должен захватить входные клоки и на входе выдать два клока /2 фаза которых должна быть такая же как у поступающих на вход. Если тригер использовать иногда происходит перескок.
Golikov A.
Sep 21 2015, 17:51
погодите у вас такая схема
always @(posedge clk)
begin
clock1 <= clock1_in;
clock2 <= clock2_in;
end
то есть вы по фронту какого-то высокочастотного клока захватываете внешние произвольные сигналы?
sergey sva
Sep 22 2015, 04:29
Цитата
то есть вы по фронту какого-то высокочастотного клока захватываете внешние произвольные сигналы?
Да. Сигналы не высокочастотные Кгц, а основной клок 120Мгц.
Maverick
Sep 22 2015, 05:05
Цитата(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
Sep 22 2015, 05:15
Цитата
т.е. здесь должно быть по 2 регистра
Не совсем понял как сделать, последовательно два регистра ?
Maverick
Sep 22 2015, 05:45
Цитата(sergey sva @ Sep 22 2015, 08:15)

Не совсем понял как сделать, последовательно два регистра ?
смотреть здесьрисунок 3
И тогда делить на 2 (либо Ваша схема Т триггера) - на частоте кГц, а заводить на 120 Мгц уже деленную на 2.
Это если я правильно понял Вас
Golikov A.
Sep 22 2015, 07:23
только надо понимать что разрешение по разности фаз упадет до синхронизирующей частоты. И не очень понятно зачем делить на 2 перед определением разности фаз, когда можно это сделать сразу для полной частоты?
sergey sva
Sep 22 2015, 07:40
Попробую но думаю что это не поможет. например на входе 1 0 после делителя может быть 1 0 или 0 1 что бы измерять от 0 до 360.
Golikov A.
Sep 22 2015, 07:43
Цитата
Попробую но думаю что это не поможет
думаете не поможет стандартное решение которое помогает миллионам разработчиков в такой ситуации? Не думайте - верьте

)))
sergey sva
Sep 22 2015, 16:41
Верю )). Если измерять в пределах 0-180 то все нормально, но если измерить 360. то перескок.
Импульсы на вход поступают постоянно а захват 100 раз в секунду получается то так то так.
Golikov A.
Sep 23 2015, 06:38
что-то я не очень понимаю что вы делаете... ну вам виднее
sergey sva
Sep 23 2015, 06:54
Исправил как порекомендовали здесь, так правильнее будет.
Но иногда перескакивает. Вот пример: в какой то момент времени нужно прицепиться к двум проводам по которым идут импульсы. Импульсы произвольно меняют задержку относительно друг друга.
Подключаемся к проводам. Модуль начинает делить по переднему фронту входные импульсы. На выходах может получиться два варианта : выход первый = 1 , выход второй = 0 или второй вариант выход первый = 0 , выход второй = 1 .
Задержка меняется произвольно поэтому так получается.
Вы бы нарисовали, может так понятнее будет.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.