R2R 0 28 сентября, 2017 Опубликовано 28 сентября, 2017 (изменено) · Жалоба Приветствую! Написал на верилоге модуль, осуществляющий задержку входного сигнала. Для его проверки в той же ПЛИС (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 Изменено 28 сентября, 2017 пользователем R2R Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 28 сентября, 2017 Опубликовано 28 сентября, 2017 · Жалоба . Потом взял сигнал от внешнего генератора - появились баги. Два вопроса. 1. У внешнего генератора может быть дребезг на фронтах? Скажем внешний сигнал 1 Мгц, а клок - 100 Мгц. Тогда пологий фронт внешнего сигнала для внутреннего будет как "пила".. 2. Внешний сигнал подается синхронно с внутренним или возможна метастабильность? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
R2R 0 28 сентября, 2017 Опубликовано 28 сентября, 2017 (изменено) · Жалоба 1. Сигнал достаточно чистый - фронты около 5 нс с минимальным звоном. 2. Внешний сигнал не сихронен с тактовым генератором ПЛИС. Действительно, проблема была в метастабильности и оказалась решена двумя триггерами на входе. Благодарю. Изменено 28 сентября, 2017 пользователем R2R Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
R2R 0 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба Поспешил с выводами - дребезг сигнала уменьшился, но не исчез (логический анализатор не позволяет это оценить в полной мере в отличие от осциллографа). Выходной сигнал без синхронизатора С одним триггером С двумя триггерами Как видно, между синхронизаторами с одним и двумя триггерами нет разницы - дребезг ощутимо большой и составляет около 60 нс (3 такта клока). Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
Maverick_ 15 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба Поспешил с выводами - дребезг сигнала уменьшился, но не исчез (логический анализатор не позволяет это оценить в полной мере в отличие от осциллографа). Выходной сигнал без синхронизатора С одним триггером С двумя триггерами Как видно, между синхронизаторами с одним и двумя триггерами нет разницы - дребезг ощутимо большой и составляет около 60 нс (3 такта клока). Какой фронт нарастания внешнего сигнала? Можно осциллограмму этого сигнала на осциллографе? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
R2R 0 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба Осциллограмма внешнего сигнала в сообщении #3. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба Написал на верилоге модуль, осуществляющий задержку входного сигнала. Для его проверки в той же ПЛИС (EPM240T100C5) сделал модуль генератора меандра, И что будет если neg_cnt == phase и pos_cnt == phase А вот чисто по жизни... Зачем Вам в модуле два счетчика? Для меандра вполне и одного хватит... загружаем счетчик, потом его декрементируем. При 0 переключаем выходной триггер... Все... А если промежутки требуются неравные, то в зависимости от состояния выходного триггера загружаем в таймер требуемую константу... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
R2R 0 29 сентября, 2017 Опубликовано 29 сентября, 2017 (изменено) · Жалоба Вариант с == проверял - то же самое. Насчет логики работы модуля - он измеряет полупериод и по фронту сигнала загружает измеренное значение, уменьшенное на phase, в счетчик нового полупериода. Увеличивая phase, можно сдвигать сигнал влево, т.е. модуль формирует сдвиг T - phi. Как мне казалось, это самая очевидная реализация такой функции. Изменено 29 сентября, 2017 пользователем R2R Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
ViKo 1 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба Подайте входной сигнал после триггеров сразу на выход, минуя схему задержки. Для проверки. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
R2R 0 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба Сигнал с выхода синхронизатора имеет дребезг 20 нс вне зависимости от количества триггеров. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба Сигнал с выхода синхронизатора имеет дребезг 20 нс вне зависимости от количества триггеров. И это говорит о том, что у Вас тактовая имеет период в 20 нс... И входной сигнал плавает относительно тактовой... А если нужна подстройка без "дребезга", то нужно делать PLL... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
R2R 0 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба А откуда берется еще 40 нс дребезга, когда сигнал проходит основную часть схемы? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 29 сентября, 2017 Опубликовано 29 сентября, 2017 · Жалоба А откуда берется еще 40 нс дребезга, когда сигнал проходит основную часть схемы? Пришлите мне тестбенч, я если успею, то может завтра попробую... мне кажется, что не хватает фильтра длительности полупериода, потому как при асинхронных входных сигналах выход все равно будет дергаться... Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
x736C 0 30 сентября, 2017 Опубликовано 30 сентября, 2017 · Жалоба Представьте, что полупериод меандра sgn равен примерно 100 тактов системной частоты. Реальное же количество тактов будет колебаться, например, между 100 и 101. Теперь, если изобразить циклограмму работы ваших счетчиков, то видно следующее. Когда количество тактов в полупериоде составит 101 такт, то счетчик добавит 2 такта до сброса или установки сигнала out. Потому как ему предстоит досчитать «вверх» до 101, добавив 1 лишний такт, а потом еще 1 лишний такт при счете «вниз». Далее, если вы рассмотрите все комбинации полупериодов (100 и 101), то обнаружите разброс значений полупериодов между 99, 100 и 101. Отсюда ваши 60 нс плясок при периоде тактовой 20 нс. Тут не нужен тестбенч, карандашом это выясняется за 5 минут. P.S. Отличная задачка для собеседований. Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться
iosifk 3 30 сентября, 2017 Опубликовано 30 сентября, 2017 · Жалоба Тут не нужен тестбенч, карандашом это выясняется за 5 минут. Отвык я от карандаша... Скриншот удобнее был бы. К ТС. А вообще, если не секрет, то зачем такой модуль вообще нужен? Цитата Поделиться сообщением Ссылка на сообщение Поделиться на другие сайты Поделиться