Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Измерение фазы двух меандров
Форум разработчиков электроники ELECTRONIX.ru > Программируемая логика ПЛИС (FPGA,CPLD, PLD) > Работаем с ПЛИС, области применения, выбор
sergey sva
Как реализовать измерение фазы двух меандров,может есть готовые модули?, искал на опенкоре подходящего не нашел или не по тем словам искал.
Два сигнала меандр частота 10кгц поступают на плис. Нужно как можно точнее измерять их фазу. Сделал счетчик, по фронту первого сигнала запускал счетчик по фронту другого останавливал, такой алгоритм работает, но сигналы поступают из аналоговой схемы не очень стабильной.
Вообщем иногда в импульсах меандра появляются провалы в середине импульса или дребезг по фронтам, часта стабильная 10кгц.
Такой алгоритм работает но ловит много мусора. Сейчас думаю как сделать, но наверно изобретаю велосипед скорее всего есть что то готовое. Может кому что встречалось на эту тему.
des00
Цитата(sergey sva @ May 19 2015, 16:13) *
Нужно как можно точнее измерять их фазу. Сделал счетчик, по фронту первого сигнала запускал счетчик по фронту другого останавливал, такой алгоритм работает, но сигналы поступают из аналоговой схемы не очень стабильной.
Вообщем иногда в импульсах меандра появляются провалы в середине импульса или дребезг по фронтам, часта стабильная 10кгц.
Такой алгоритм работает но ловит много мусора.

если можно работать больше чем по одному периоду, то проксорить, перевести в домен максимальной частоты и проинтегрировать на интервале измерения.
sergey sva
проксорить два поступающих меандра, а как это уберет провалы или дребезг? , только когда два сигнала будут совпадать по фазе но тогда фаза = 0?
Fat Robot
В качестве фазового детектора можно использовать
- xor
- выделение фронтов + RS-триггер

Далее интегратор, например с помощью пропорционально-интегрирующего звена. Или канитель со счетчиками.

Если сигналы зашумлены, то их надо фильтровать либо в аналоговом, либо в цифровом домене. см. например peaking filter (он же "колебательный контур", "резонансный усилитель" и т.п. )

Или же использовать xor и смириться с шумом в измерениях фазы.
des00
Цитата(sergey sva @ May 19 2015, 15:38) *
проксорить два поступающих меандра, а как это уберет провалы или дребезг? , только когда два сигнала будут совпадать по фазе но тогда фаза = 0?

Не даром сказал про интегрирование. Нарисуйте на бумажке ваши сигналы с дребезгом. Потом их ксор. Потому пропустите (на бумажке) через банальнейший RC фильтр. Это и будет аналоговым прототипом схемы. Посмотрите что это дает.

Положим что амплитуда сигналов равна 1, после фильтрации(аккумулирования) положим что есть нормировка к 1. Тогда в случае если сигналы сдвинуты на 180 градусов вы получите 1, если они синфазны вы получите 0, если сдвиг по фазе 90 градусов получите 0.5. А ваши пики и наводки дадут шум в младших разрядах, играя временем усреднения можно получить приемлемые результаты .
GSV0
Для работы в системах с высоким уровнем помех(ВЧ/импульсные ВВ генераторы) неплохо зарекомендовал себя следующий фильтр - см. картинку. На каждый фронт входного сигнала ставим сдвиговый регистр, ёмкость и тактовая частота выбираются согласно параметрам ожидаемого сигнала/вероятным помехам/имеющимся ресурсам. Изменение логического уровня(GATE ON//GATE OFF) происходит только если входной сигнал(GATE) не меняется во время заполнения регистра.
Плюсы:
- не надо усреднения/интегрирования;
- не вносит фазовых искажений(с точностью до периода тактирования регистра), конечно, если фильтры на входах одинаковые rolleyes.gif
sergey sva
Благодарю вроде де бы есть положительный результат )) от 10000 отсчетов, максимум 40 шум это примерно 20мм хотел получить +-2мм. Попробую фильтрами поиграться может какие рекомендации дадите буду очень благодарен. Вначале сделал счетчик через phasedetect= sigA ^ sigB. Код простой и по времени цепи хорошо проходят. Но измерение происходит от 0 до 180 градусов а это 2,5м (
Сделал так, самому не очень нравиться и по времени не проходит, но работает. Может как то это можно упростить? Когда phasedetect ==1 счетчик считает когда 0 ждет.
Код
//----------------------------------------------------------------------//
always @(negedge CLCK) begin
    if (RESET) begin
        phasedetect = 1'b0;
          casetrig    = 3'd0;  
    end else  begin
        
          case(casetrig)
          3'd0: begin
              if(in1)begin
                  phasedetect = 1'b1;
                if(in2)begin
                    casetrig    = 3'd1;
                end else begin                    
                         casetrig    = 3'd2;
                     end                    
              end           
          end
          3'd1: begin
              if(in2==0)begin                  
                     casetrig    = 3'd2;
              end           
          end          
          3'd2: begin
              if(in2)begin
                  phasedetect = 1'b0;
                     casetrig    = 3'd3;
              end           
          end
          3'd3: begin
              if(in1==0)begin                  
                     casetrig    = 3'd0;
              end           
          end          
          default: begin
              phasedetect = 1'b0;
              casetrig    = 3'd0;
          end
          endcase               
    end//reset    
end//always
//----------------------------------------------------------------------//

Можно еще вопрос) в квартусе есть возможность настройки оптимизации что бы оптимизировал цепи в первую очередь по времени ?
GSV0
Цитата(sergey sva @ May 22 2015, 15:24) *
Попробую фильтрами поиграться может какие рекомендации дадите буду очень благодарен.


Чтобы дать рекомендации, надо бы взглянуть на Ваш дребезг/провалы, покажите картинки, а лучше осциллограммы.
sergey sva
Сейчас пока нет возможности снять осциллограмму. Значения полученные микроконтроллером из плис по spi, вывожу по rs232 в терминалку.
Сигналы имеют небольшое дрожание максимальное измеряемое значение 0-360гр =0- 10000, а дрожание макс 40 =1,5гр, это шум возможно от плл встроенного в плис, у него не очень хорошие характеристики джиттер.
Насколько реальные значения получаются в таймквесте, смотрю отчеты несколько сигналов не проходит по времени(-0,5ns -0.8ns), а в плис конфигурация работает нормально?
sergey sva
Немного почитал про TimeQuest и понял что ничего не понял (.
Добавил код clock из pll 360 mhz нужно поделить и получить 60mhz.
Код
//--------------------------------------------------------------------------//
always@(posedge pll1clck3)
begin
if(divpllclck < 2)begin
    divpllclck = divpllclck +2'd1;
end else begin
    divpllclck = 2'd0;
     clckdive = ~clckdive;
end
end
//--------------------------------------------------------------------------//

Скомпилировалось все без ошибок. Запустил timequest вообщем все в слаках.
В 13,1 версии timequest сложнее еще не разобрался.(
Нажмите для просмотра прикрепленного файла
iosifk
Цитата(sergey sva @ May 22 2015, 15:24) *
Сделал так, самому не очень нравиться и по времени не проходит, но работает. Может как то это можно упростить? Когда phasedetect ==1 счетчик считает когда 0 ждет.

У Вас "RESET" - синхронный или все же асинхронный?

И совершенно отсутствует понятие о "блокирующих" и "не блокирующих"...
Плохо!
sergey sva
Синхронный сброс, по переднему фронту тактового сигнала. Переделал на неблокирующие все равно задержка -75ns.
Код
always@(posedge pll1clck3)
begin
if(divpllclck < 2)begin
    divpllclck <= divpllclck +2'd1;
end else begin
    divpllclck <= 2'd0;
     clckdive = ~clckdive;
end
end
//--------------------------------------------------------------------------//

TimeQuest сгенерировал файл sdc там этот сигнал указан как
Цитата
create_clock -name {clckdive} -period 1.000 -waveform { 0.000 0.500 } [get_registers {clckdive}]

Он происходит от клока который выходит из pll
Цитата
create_generated_clock -name {SystemPll1|altpll_component|auto_generated|pll1|clk[3]} -source [get_pins {SystemPll1|altpll_component|auto_generated|pll1|inclk[0]}] -duty_cycle 50.000 -multiply_by 36 -divide_by 5 -phase 135.000 -master_clock {CLCKIN50Mhz} [get_pins {SystemPll1|altpll_component|auto_generated|pll1|clk[3]}]

Это правильно, он не должен быть create_generated_clock?
Откуда берутся такие большие задержки ?
Нажмите для просмотра прикрепленного файла
krux
есть "золотое правило" в верилоге: никогда не мешать в одном always - begin - end блоке блокирующие и неблокирующие присваивания.
это, во-первых, затрудняет чтение кода, во-вторых, вводит в заблуждение при симуляции, в-третьих, после синтеза и сброки проекта - слишком часто работает не так как выглядело во время симуляции.

и ещё, я вам советую отказаться от некоего непонятного клока, который вы генерируете при помощи
Цитата
clckdive = ~clckdive;

зачем он?

если он нужен только для того чтобы выполнять действия по его переднему фронту - то сформируйте некий сигнал-строб "разрешение выполнения", назовите его допустим enable_act (напомню: он будет работать по клоку pll1clck3), после чего используйте конструкцию
Цитата
if (enable_act) begin
end

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

вообще, в плис не принято формированить тактовые частоты, кроме как про помощи встроенных PLL.
Способы конечно есть, но они требуют досканального понимания того что ты делаешь и как потом будешь использовать.
sergey sva
Благодарю за замечания, буду учиться.
Никак не могу найти причину задержки в 2,5нс. Пробовал разбивать присвоение на два такта по 6бит. задержка не изменилась.
В каком порядке искать ? В верхней строчке написано from node res. res это сигнал сброса он в самом начале появляется и все.
Код
always@(posedge CLCKIN50Mhz)
begin
    if(timereset < 16'd65530)
    begin
        timereset = timereset + 16'h1;
        res = 1'b1;    
    end
    else begin
        res = 1'b0;
    end
end

Нажмите для просмотра прикрепленного файла
sergey sva
Разобрался теперь все нормально. Проблемы с пересинхронизации разных сигналов от разных клоков, сбросы неправильно сделал синхронные асинхронные. все операции деления убрал а где возможно сделал через сдвиг.
Осталось придумать как объединить 3 сигнала от двух модулей о положении объекта в один. один модуль измеряет 5м, другой 100м, третий сигнал разница между двумя. Думал сложением фигня вышла.
Подбросте мыслей ))
Нажмите для просмотра прикрепленного файла
sergey sva
Ссори на картинке опечатка,сигнал разницы межу 5 метровым и 100 метровым а не 10м.
Krys
А из какой книжки это взято? И как это работает? Можете плиз на пальцах объяснить?
Krys
Я про вот это в смысле:
Цитата(GSV0 @ May 19 2015, 20:04) *
Для работы в системах с высоким уровнем помех(ВЧ/импульсные ВВ генераторы) неплохо зарекомендовал себя следующий фильтр - см. картинку

GSV0
Цитата(Krys @ May 28 2015, 08:21) *
А из какой книжки это взято? И как это работает? Можете плиз на пальцах объяснить?

Это не из книжки, придумано, пока не запатентовано rolleyes.gif
Как работает - пытался объяснить в посте #6, попробую с другого боку:
При изменении логического уровня на входе GATE, снимается CLR с соответствующей цепочки триггеров - сдвиговых регистров - по приходе тактовых импульсов регистр начинает заполняться, если в процессе заполнения логический уровень на входе изменится, регистр обнуляется и так пока не получится его заполнить, тогда устанавливается GATE_ON для 1 и GATE_OFF для 0 соответственно.
Триггеров чем больше тем лучше, тактирование выбирается так, чтобы не потерять возможные короткие импульсы. Эффективно подавляет дребезг механических контактов, импульсные помехи, генерацию на фронтах. Вносит задержку - известную, контролируемую, про плюсы уже говорил. Ну, как-то так ...
Krys
спасибо, бегу патентовать! ))))
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.