Перейти к содержанию

    

Некорректная работа схемы после смены источника входного сигнала

Приветствую!

Написал на верилоге модуль, осуществляющий задержку входного сигнала. Для его проверки в той же ПЛИС (EPM240T100C5) сделал модуль генератора меандра, посмотрел сигналы - все работало правильно и стабильно. Потом взял сигнал от внешнего генератора - появились баги. После нескольких попыток оптимизации кода добиться корректной работы схемы так и не удалось.

 

module delay
  (
  input wire clk,
  input wire sgn,

  output reg out
  );

localparam       phase = 10;

reg[7:0]         pos_cnt = 0,
                neg_cnt = 0;

always @ (posedge clk)
  begin
     if (sgn)
        begin
           pos_cnt <= pos_cnt + 1;
           if (neg_cnt > phase) neg_cnt <= neg_cnt - 1;
           else
              begin
                 neg_cnt <= 0;
                 out <= 1;
              end
        end
     else
        begin
           neg_cnt <= neg_cnt + 1;
           if (pos_cnt > phase) pos_cnt <= pos_cnt - 1;
           else
              begin
                 pos_cnt <= 0;
                 out <= 0;
              end
        end
  end

endmodule

 

post-92913-1506627274_thumb.png

Изменено пользователем R2R

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
. Потом взял сигнал от внешнего генератора - появились баги.

 

Два вопроса.

1. У внешнего генератора может быть дребезг на фронтах? Скажем внешний сигнал 1 Мгц, а клок - 100 Мгц. Тогда пологий фронт внешнего сигнала для внутреннего будет как "пила"..

2. Внешний сигнал подается синхронно с внутренним или возможна метастабильность?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

1. Сигнал достаточно чистый - фронты около 5 нс с минимальным звоном.

post-92913-1506631619.png

2. Внешний сигнал не сихронен с тактовым генератором ПЛИС.

 

Действительно, проблема была в метастабильности и оказалась решена двумя триггерами на входе. Благодарю.

Изменено пользователем R2R

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поспешил с выводами - дребезг сигнала уменьшился, но не исчез (логический анализатор не позволяет это оценить в полной мере в отличие от осциллографа).

 

Выходной сигнал без синхронизатора

post-92913-1506709568.png

С одним триггером

post-92913-1506709580.png

С двумя триггерами

post-92913-1506709645.png

 

Как видно, между синхронизаторами с одним и двумя триггерами нет разницы - дребезг ощутимо большой и составляет около 60 нс (3 такта клока).

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Поспешил с выводами - дребезг сигнала уменьшился, но не исчез (логический анализатор не позволяет это оценить в полной мере в отличие от осциллографа).

 

Выходной сигнал без синхронизатора

post-92913-1506709568.png

С одним триггером

post-92913-1506709580.png

С двумя триггерами

post-92913-1506709645.png

 

Как видно, между синхронизаторами с одним и двумя триггерами нет разницы - дребезг ощутимо большой и составляет около 60 нс (3 такта клока).

Какой фронт нарастания внешнего сигнала?

Можно осциллограмму этого сигнала на осциллографе?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Осциллограмма внешнего сигнала в сообщении #3.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Написал на верилоге модуль, осуществляющий задержку входного сигнала. Для его проверки в той же ПЛИС (EPM240T100C5) сделал модуль генератора меандра,

И что будет если

neg_cnt == phase и pos_cnt == phase

 

А вот чисто по жизни...

Зачем Вам в модуле два счетчика? Для меандра вполне и одного хватит... загружаем счетчик, потом его декрементируем. При 0 переключаем выходной триггер... Все...

А если промежутки требуются неравные, то в зависимости от состояния выходного триггера загружаем в таймер требуемую константу...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Вариант с == проверял - то же самое. Насчет логики работы модуля - он измеряет полупериод и по фронту сигнала загружает измеренное значение, уменьшенное на phase, в счетчик нового полупериода. Увеличивая phase, можно сдвигать сигнал влево, т.е. модуль формирует сдвиг T - phi. Как мне казалось, это самая очевидная реализация такой функции.

Изменено пользователем R2R

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Подайте входной сигнал после триггеров сразу на выход, минуя схему задержки. Для проверки.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сигнал с выхода синхронизатора имеет дребезг 20 нс вне зависимости от количества триггеров.

post-92913-1506715191.png

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Сигнал с выхода синхронизатора имеет дребезг 20 нс вне зависимости от количества триггеров.

И это говорит о том, что у Вас тактовая имеет период в 20 нс... И входной сигнал плавает относительно тактовой...

А если нужна подстройка без "дребезга", то нужно делать PLL...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

А откуда берется еще 40 нс дребезга, когда сигнал проходит основную часть схемы?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
А откуда берется еще 40 нс дребезга, когда сигнал проходит основную часть схемы?

Пришлите мне тестбенч, я если успею, то может завтра попробую...

мне кажется, что не хватает фильтра длительности полупериода, потому как при асинхронных входных сигналах выход все равно будет дергаться...

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Представьте, что полупериод меандра sgn равен примерно 100 тактов системной частоты.

Реальное же количество тактов будет колебаться, например, между 100 и 101.

Теперь, если изобразить циклограмму работы ваших счетчиков, то видно следующее.

Когда количество тактов в полупериоде составит 101 такт, то счетчик добавит 2 такта до сброса или установки сигнала out. Потому как ему предстоит досчитать «вверх» до 101, добавив 1 лишний такт, а потом еще 1 лишний такт при счете «вниз».

Далее, если вы рассмотрите все комбинации полупериодов (100 и 101), то обнаружите разброс значений полупериодов между 99, 100 и 101. Отсюда ваши 60 нс плясок при периоде тактовой 20 нс. Тут не нужен тестбенч, карандашом это выясняется за 5 минут.

 

post-14942-1506731492_thumb.jpg

P.S. Отличная задачка для собеседований.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты
Тут не нужен тестбенч, карандашом это выясняется за 5 минут.

Отвык я от карандаша... Скриншот удобнее был бы.

 

К ТС. А вообще, если не секрет, то зачем такой модуль вообще нужен?

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Для публикации сообщений создайте учётную запись или авторизуйтесь

Вы должны быть пользователем, чтобы оставить комментарий

Создать учетную запись

Зарегистрируйте новую учётную запись в нашем сообществе. Это очень просто!

Регистрация нового пользователя

Войти

Уже есть аккаунт? Войти в систему.

Войти
Авторизация