Полная версия этой страницы:
Делитель частоты
Есть учебная задача: реализовать сумматор, суммирующий 2 числа из двух очередей, находящихся на их вершине (последние добавленные в очереди числа).
Данная программа тестировалась на DE2 Board. Успешное ее выполнение было достигнуто путем создания делителя частоты, иначе возникали случаи, когда, например, по нажатии кнопки добавления в очередь, число добавлялось, но счетчик очереди не увеличивался. Вопрос в следующем: почему нельзя обойтись без делителя? Это как-то связано с кодом, ПЛИС, платой или еще чем-то?
Victor®
Oct 24 2009, 18:40
давайте "программу"
По первому взгляду - отсуствует подавление дребезга кнопок.
Цитата
По первому взгляду - отсуствует подавление дребезга кнопок.
Как тогда частота влияет дребезг? По-мойму, что частота опроса 27 МГц, что 100 кГц - для дребезга одинаковы.
des333
Oct 26 2009, 19:29
Проверьте функциональную часть. Напишите простенький тестбенч, если все будет работать хорошо, перейдите к временному анализу. Если по временным показателем все тоже в норме, то тогда эта внешнее окружение (типа дребезга).
Все сигналы, асинхронные с клоком (а с кнопок в особенности), должны подаваться сначала на синхронизирующие триггеры, а уже потом подаваться на какую-либо логику и триггеры. В противном случае будут "гонки" и метастабильные состояния. Симптомы как раз, как Вы описываете.
Делитель частоты (в отсутствие синхронизир. триггеров) сильно меняет вероятность сбоя. Кроме этого Place & Route может измениться, по счастливому стечению обстоятельств, в лучшую сторону с точки зрения "гонок".
Когда описываете железо, то лучше забыть, что есть "initial" - железу нужен Reset в явном виде. "initial" - это для того кода, который в железо не синтезируется.
Спасибо за развернутый ответ. Возник вопрос:
Цитата
Все сигналы, асинхронные с клоком (а с кнопок в особенности), должны подаваться сначала на синхронизирующие триггеры
Как эти триггеры реализовать с точки зрения кода синтезируемого Verilog? Если возможно - приведите пример.
Цитата(Veg@ @ Oct 28 2009, 18:23)

Как эти триггеры реализовать с точки зрения кода синтезируемого Verilog? Если возможно - приведите пример.
Да собственно говоря, это самый простейший триггер:
Код
reg [3:0] KEY_r;
...
always @(posedge CLOCK_27)
KEY_r <= KEY;
Ну и в коде не забудьте поменять KEY на KEY_r.
Выполните поиск по сайту по ключевому слову "метастабильность" и почитайте обсуждения.
Для просмотра полной версии этой страницы, пожалуйста,
пройдите по ссылке.