SergeyVas 0 19 мая, 2015 Опубликовано 19 мая, 2015 · Жалоба Как реализовать измерение фазы двух меандров,может есть готовые модули?, искал на опенкоре подходящего не нашел или не по тем словам искал. Два сигнала меандр частота 10кгц поступают на плис. Нужно как можно точнее измерять их фазу. Сделал счетчик, по фронту первого сигнала запускал счетчик по фронту другого останавливал, такой алгоритм работает, но сигналы поступают из аналоговой схемы не очень стабильной. Вообщем иногда в импульсах меандра появляются провалы в середине импульса или дребезг по фронтам, часта стабильная 10кгц. Такой алгоритм работает но ловит много мусора. Сейчас думаю как сделать, но наверно изобретаю велосипед скорее всего есть что то готовое. Может кому что встречалось на эту тему. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 мая, 2015 Опубликовано 19 мая, 2015 · Жалоба Нужно как можно точнее измерять их фазу. Сделал счетчик, по фронту первого сигнала запускал счетчик по фронту другого останавливал, такой алгоритм работает, но сигналы поступают из аналоговой схемы не очень стабильной. Вообщем иногда в импульсах меандра появляются провалы в середине импульса или дребезг по фронтам, часта стабильная 10кгц. Такой алгоритм работает но ловит много мусора. если можно работать больше чем по одному периоду, то проксорить, перевести в домен максимальной частоты и проинтегрировать на интервале измерения. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 19 мая, 2015 Опубликовано 19 мая, 2015 · Жалоба проксорить два поступающих меандра, а как это уберет провалы или дребезг? , только когда два сигнала будут совпадать по фазе но тогда фаза = 0? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
FatRobot 1 19 мая, 2015 Опубликовано 19 мая, 2015 · Жалоба В качестве фазового детектора можно использовать - xor - выделение фронтов + RS-триггер Далее интегратор, например с помощью пропорционально-интегрирующего звена. Или канитель со счетчиками. Если сигналы зашумлены, то их надо фильтровать либо в аналоговом, либо в цифровом домене. см. например peaking filter (он же "колебательный контур", "резонансный усилитель" и т.п. ) Или же использовать xor и смириться с шумом в измерениях фазы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
des00 25 19 мая, 2015 Опубликовано 19 мая, 2015 · Жалоба проксорить два поступающих меандра, а как это уберет провалы или дребезг? , только когда два сигнала будут совпадать по фазе но тогда фаза = 0? Не даром сказал про интегрирование. Нарисуйте на бумажке ваши сигналы с дребезгом. Потом их ксор. Потому пропустите (на бумажке) через банальнейший RC фильтр. Это и будет аналоговым прототипом схемы. Посмотрите что это дает. Положим что амплитуда сигналов равна 1, после фильтрации(аккумулирования) положим что есть нормировка к 1. Тогда в случае если сигналы сдвинуты на 180 градусов вы получите 1, если они синфазны вы получите 0, если сдвиг по фазе 90 градусов получите 0.5. А ваши пики и наводки дадут шум в младших разрядах, играя временем усреднения можно получить приемлемые результаты . Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
GSV0 0 19 мая, 2015 Опубликовано 19 мая, 2015 · Жалоба Для работы в системах с высоким уровнем помех(ВЧ/импульсные ВВ генераторы) неплохо зарекомендовал себя следующий фильтр - см. картинку. На каждый фронт входного сигнала ставим сдвиговый регистр, ёмкость и тактовая частота выбираются согласно параметрам ожидаемого сигнала/вероятным помехам/имеющимся ресурсам. Изменение логического уровня(GATE ON//GATE OFF) происходит только если входной сигнал(GATE) не меняется во время заполнения регистра. Плюсы: - не надо усреднения/интегрирования; - не вносит фазовых искажений(с точностью до периода тактирования регистра), конечно, если фильтры на входах одинаковые :rolleyes: Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 22 мая, 2015 Опубликовано 22 мая, 2015 · Жалоба Благодарю вроде де бы есть положительный результат )) от 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 0 22 мая, 2015 Опубликовано 22 мая, 2015 · Жалоба Попробую фильтрами поиграться может какие рекомендации дадите буду очень благодарен. Чтобы дать рекомендации, надо бы взглянуть на Ваш дребезг/провалы, покажите картинки, а лучше осциллограммы. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 23 мая, 2015 Опубликовано 23 мая, 2015 · Жалоба Сейчас пока нет возможности снять осциллограмму. Значения полученные микроконтроллером из плис по spi, вывожу по rs232 в терминалку. Сигналы имеют небольшое дрожание максимальное измеряемое значение 0-360гр =0- 10000, а дрожание макс 40 =1,5гр, это шум возможно от плл встроенного в плис, у него не очень хорошие характеристики джиттер. Насколько реальные значения получаются в таймквесте, смотрю отчеты несколько сигналов не проходит по времени(-0,5ns -0.8ns), а в плис конфигурация работает нормально? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Немного почитал про 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 3 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Сделал так, самому не очень нравиться и по времени не проходит, но работает. Может как то это можно упростить? Когда phasedetect ==1 счетчик считает когда 0 ждет. У Вас "RESET" - синхронный или все же асинхронный? И совершенно отсутствует понятие о "блокирующих" и "не блокирующих"... Плохо! Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Синхронный сброс, по переднему фронту тактового сигнала. Переделал на неблокирующие все равно задержка -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 8 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба есть "золотое правило" в верилоге: никогда не мешать в одном always - begin - end блоке блокирующие и неблокирующие присваивания. это, во-первых, затрудняет чтение кода, во-вторых, вводит в заблуждение при симуляции, в-третьих, после синтеза и сброки проекта - слишком часто работает не так как выглядело во время симуляции. и ещё, я вам советую отказаться от некоего непонятного клока, который вы генерируете при помощи clckdive = ~clckdive; зачем он? если он нужен только для того чтобы выполнять действия по его переднему фронту - то сформируйте некий сигнал-строб "разрешение выполнения", назовите его допустим enable_act (напомню: он будет работать по клоку pll1clck3), после чего используйте конструкцию if (enable_act) begin end плюс этого подхода в том что нет необходимости вылизывать constraints для этого непонятным образом сформированного "недо-клока", который как клок вообще говоря никому и не нужен. вообще, в плис не принято формированить тактовые частоты, кроме как про помощи встроенных PLL. Способы конечно есть, но они требуют досканального понимания того что ты делаешь и как потом будешь использовать. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 24 мая, 2015 Опубликовано 24 мая, 2015 · Жалоба Благодарю за замечания, буду учиться. Никак не могу найти причину задержки в 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 Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
SergeyVas 0 25 мая, 2015 Опубликовано 25 мая, 2015 · Жалоба Разобрался теперь все нормально. Проблемы с пересинхронизации разных сигналов от разных клоков, сбросы неправильно сделал синхронные асинхронные. все операции деления убрал а где возможно сделал через сдвиг. Осталось придумать как объединить 3 сигнала от двух модулей о положении объекта в один. один модуль измеряет 5м, другой 100м, третий сигнал разница между двумя. Думал сложением фигня вышла. Подбросте мыслей )) Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться