Найти в Дзене
IT. Как это работает?

Аппаратный стек на языке Verilog

Оглавление

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

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

Постановка задачи

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

Общая схема устройства
Общая схема устройства

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

Общие размышления

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

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

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

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

Проектирование

В ранее разработанном модуле антидребезга сделаем парочку изменений. А именно уменьшим паузу между считыванием уровня сигнала со входной линии путем счета до 10 (строка 18).

Приступаем к главному модулю проекта. Для работы ему пригодятся пользовательские кнопки сдвига в количестве двух штук. Обязательно нужен тактовый сигнал сlk с кварцевого генератора. На выходе модуля 8 светодиодов content.

Светодиоды связаны с битами регистра shift, так что необходимо его описать. В нем 8 бит. Добавим немного проводов для передачи сигналов внутри модуля (ten_ms, levelPush, levelPop, stackCLK). С двух блоков антидребезга нужны проводники сигнала на схему приоритета. Схема приоритета, кроме того, еще и выработает тактовый сигнал для сдвигового регистра.

Опишем начальное состояние внутреннего регистра внутри главного модуля. В сдвиговый регистр для наглядности поместим в самый центр одну единицу.

Теперь включаем в состав главного модуля два блока антидребезга. На входы пойдут линии с кнопок. Такты со входа главного модуля. Выходы итоговых уровней попадают в levelPush и levelPop.

Два модуля антидребезга направляют свои выходные сигналы в проводники levelPush и levelPop. Так как кнопки притянуты к питанию и нажатие это ноль, то проинвертируем (~) эти сигналы. Как мы ранее обсуждали, отправляем два сигнала на дизъюнкцию (|) чтобы получить тактовый сигнал для сдвигового регистра.

По переднему фронту этого тактового сигнала проверяем состояние нажатых кнопок (конечно же, состояния после блоков антидребезга). В зависимости от их состояния описываем как должен себя вести сдвиговый регистр. В случае нажатия кнопки push содержимое регистра смещается вправо. При этом слева в него попадает ноль. Иначе если нажата кнопка pop, то содержимое регистра смещается влево. С правой стороны в регистр заходит ноль. На самом деле необходимость второй проверки сомнительна. Передний фронт тактового импульса это передний фронт любого из сигналов, так что если не первый, то точно второй.

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

Синтезатор сгенерировал вот такую схему:

-3

Выделяются два модуля антидребезга (debounce1, debounce2). К ним подходит тактовый сигнал clk с кварцевого генератора отладочного комплекта и линии от кнопок (push, pop). Эти модули определяют конечное состояние level на кнопках и отправляют их на управляющие входы мультиплексоров. Кроме того, дизъюнкция из этих сигналов stackCLK формирует тактовый сигнал для сдвигового регистра. Следующее состояние зависит от того, как работают мультиплексоры. Будущие возможные состояния уже сформированы, осталось их выбрать. Это не совсем тот сдвиговый регистр, о котором рассказывают при изучении цифровой схемотехники, но задачу свою это устройство выполняет на все 100%.

Исходный код:

Видео-обзор с канала YouTube

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