Найти тему
IT. Как это работает?

Создаем секундомер на Verilog

Видео в конце...

К этому моменту мы освоили неплохой пласт синтаксических конструкций языка Verilog. Настало время размять пальцы и создать что-то полезное или чуть менее бесполезное. На ум приходят часы с двоичным индикатором.

Часы с двоичным индикатором
Часы с двоичным индикатором

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

Общая концепция проекта
Общая концепция проекта

Проходя через блоки ввода вывода ПЛИС, синусоида превращается в прямоугольные импульсы с четко обозначенным передним и задним фронтом. Как мы помним, счетчики имеют одно очень полезное свойство. Это деление частоты тактовых импульсов в определенное количество раз. Количество раз это степени двойки. К сожалению, тактовая частота 50 мегагерц никаким образом не поделится до одного герца при помощи разрядов двоичного счетчика. Тут требуется помощь еще нескольких узлов.

Более сложный делитель частоты

Поскольку за одну секунду приходит 50 миллионов импульсов, то просто досчитав до этого числа мы сможем отмерить одну секунду. Все оказалось до смешного просто. Осталось при помощи компаратора выяснить когда насчитано 50 миллионов и сбросить счетчик в ноль. При этом нужно выработать импульс для другого счетчика, который уже займется подсчетом секунд. В это время первый счетчик продолжит считать новую секунду.

Счетчик секунд не должен считать до своего максимума. В минуте 60 секунд и после пятьдесят девятой секунды счетчик должен начать с нуля. По сложившейся традиции компаратором определяем когда в счетчике 60 и в это самое время сбрасываем содержимое в ноль. В учебных целях ограничимся пока этим.

Итак, в разрабатываемом устройстве должны быть по крайней мере два процедурных блока, один из которых должен делить тактовую частоту до величины 1 герц и вырабатывать импульс для другого процедурного блока. Второй блок должен отслеживать секундные импульсы и подсчитывать их количество. Приступаем к реализации.

Имя модуля clock. На входе тактовый сигнал clk, на выходе шина seconds, ведущая к светодиодам. При этом забираем все светодиоды, чтоб погасить ненужные и зажечь те, которые необходимы.

Входы и выходы модуля
Входы и выходы модуля

Объявляем внутренний регистр delay для хранения количества импульсов. За ним описываем регистр sec для хранения секунд. Далее нам пригодится провод sec_tick для переноса сигнала о том, что прошла секунда к счетчику секунд.

-5

Обнулим начальные значения обоих счетчиков.

-6

В первом процедурном блоке по переднему фронту тактового сигнала производим счет импульсов. И если их количество достигает пятидесяти миллионов, то производим сброс счетчика. Это будет означать прошедшую секунду.

-7

Во втором процедурном блоке по переднему фронту сигнала секунды занимаемся их подсчетом. На текущий момент мы еще никак не описали каким образом будет формироваться сигнал секунды. Если их количество достигает шестьдесят, то немедленно сбрасываем счетчик.

-8

А теперь добавим несколько важных штрихов. Непрерывным назначением assign или простым проводом связываем сигнал секунды sec_tick с некоторой схемой дизъюнкция с отрицанием. В дизъюнкцию приходят все провода со счетчика тактовых импульсов. При любом единичном бите дизъюнкция равна единице. При всех нулевых битах дизъюнкция нулевая. После отрицания единица появится только тогда когда все биты счетчика нулевые. А это бывает только когда происходит его сброс. То есть раз в секунду. Таким образом, у нас появился сигнал секунды.

-9

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

Поддержите статью лайком если понравилось и подпишитесь чтобы ничего не пропускать.