|
Измерение фазы двух меандров |
|
|
|
May 19 2015, 13:04
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 17-04-15
Пользователь №: 86 261

|
Для работы в системах с высоким уровнем помех(ВЧ/импульсные ВВ генераторы) неплохо зарекомендовал себя следующий фильтр - см. картинку. На каждый фронт входного сигнала ставим сдвиговый регистр, ёмкость и тактовая частота выбираются согласно параметрам ожидаемого сигнала/вероятным помехам/имеющимся ресурсам. Изменение логического уровня(GATE ON//GATE OFF) происходит только если входной сигнал(GATE) не меняется во время заполнения регистра. Плюсы: - не надо усреднения/интегрирования; - не вносит фазовых искажений(с точностью до периода тактирования регистра), конечно, если фильтры на входах одинаковые
Эскизы прикрепленных изображений
|
|
|
|
|
May 22 2015, 12:24
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Благодарю вроде де бы есть положительный результат )) от 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 //----------------------------------------------------------------------// Можно еще вопрос) в квартусе есть возможность настройки оптимизации что бы оптимизировал цепи в первую очередь по времени ?
|
|
|
|
|
May 22 2015, 16:26
|
Участник

Группа: Участник
Сообщений: 42
Регистрация: 17-04-15
Пользователь №: 86 261

|
Цитата(sergey sva @ May 22 2015, 15:24)  Попробую фильтрами поиграться может какие рекомендации дадите буду очень благодарен. Чтобы дать рекомендации, надо бы взглянуть на Ваш дребезг/провалы, покажите картинки, а лучше осциллограммы.
|
|
|
|
|
May 24 2015, 07:08
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Немного почитал про 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 сложнее еще не разобрался.(
|
|
|
|
|
May 24 2015, 07:47
|
Гуру
     
Группа: Модераторы
Сообщений: 4 011
Регистрация: 8-09-05
Из: спб
Пользователь №: 8 369

|
Цитата(sergey sva @ May 22 2015, 15:24)  Сделал так, самому не очень нравиться и по времени не проходит, но работает. Может как то это можно упростить? Когда phasedetect ==1 счетчик считает когда 0 ждет. У Вас "RESET" - синхронный или все же асинхронный? И совершенно отсутствует понятие о "блокирующих" и "не блокирующих"... Плохо!
--------------------
www.iosifk.narod.ru
|
|
|
|
|
May 24 2015, 08:08
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Синхронный сброс, по переднему фронту тактового сигнала. Переделал на неблокирующие все равно задержка -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? Откуда берутся такие большие задержки ?
|
|
|
|
|
May 24 2015, 12:09
|
Профессионал
    
Группа: Свой
Сообщений: 1 700
Регистрация: 2-07-12
Из: дефолт-сити
Пользователь №: 72 596

|
есть "золотое правило" в верилоге: никогда не мешать в одном always - begin - end блоке блокирующие и неблокирующие присваивания. это, во-первых, затрудняет чтение кода, во-вторых, вводит в заблуждение при симуляции, в-третьих, после синтеза и сброки проекта - слишком часто работает не так как выглядело во время симуляции. и ещё, я вам советую отказаться от некоего непонятного клока, который вы генерируете при помощи Цитата clckdive = ~clckdive; зачем он? если он нужен только для того чтобы выполнять действия по его переднему фронту - то сформируйте некий сигнал-строб "разрешение выполнения", назовите его допустим enable_act (напомню: он будет работать по клоку pll1clck3), после чего используйте конструкцию Цитата if (enable_act) begin end плюс этого подхода в том что нет необходимости вылизывать constraints для этого непонятным образом сформированного "недо-клока", который как клок вообще говоря никому и не нужен. вообще, в плис не принято формированить тактовые частоты, кроме как про помощи встроенных PLL. Способы конечно есть, но они требуют досканального понимания того что ты делаешь и как потом будешь использовать.
--------------------
провоцируем неудовлетворенных провокаторов с удовольствием.
|
|
|
|
|
May 24 2015, 13:23
|
Гуру
     
Группа: Свой
Сообщений: 2 546
Регистрация: 23-05-07
Из: Самарская область Сызрань
Пользователь №: 27 923

|
Благодарю за замечания, буду учиться. Никак не могу найти причину задержки в 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
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|