Найти тему

Теоретическая часть пособия. Глава 9.4. Создание цифровой схемы на ПЛИС с помощью языка описание Verilog

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

В пособии будет представлена необходимая базовая теория и практические задачи для её закрепления.

Ссылки на полное оглавление пособия, на предыдущую на следующую главы.

Приятного чтения!

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

Разработчики Verilog сделали его синтаксис очень похожим на синтаксис языка C, что упрощает его освоение. Verilog имеет препроцессор, очень похожий на препроцессор языка C, и основные управляющие конструкции «if», «while» также подобны одноимённым конструкциям языка C.

Следует отметить, что описание аппаратуры, написанное на языке Verilog (как и на других HDL-языках) принято называть программами, но в отличие от общепринятого понятия программы как последовательности инструкций, здесь программа задает структуру системы. Так же для языка Verilog не применим термин «выполнение программы».

Verilog-код, который разделяется на модули, описывает, что должно произойти в схеме, а UCF-файл (User Constraint File) сообщает микросхеме, какую функцию несет каждый вывод. ПЛИС имеет немалое число выводов, которые могут служить входами или выходами, и, чтобы наша задача по проектированию считалась завершенной, мы должны определить те выводы, которые будем использовать. Например, вывод G12 подключен на плате к светодиоду, поэтому будет логично назначить его выходом. Если для работы с этим светодиодом вы создадите переменную LED, то в UCF-файле нужно будет сделать так, что упоминание LED в коде должно сразу отсылать к выводу G12. К придумыванию имен переменных нужно подходить сознательно.

Далее разберем пример описания простейшей схемы на языке Verilog. Полученная схема будет управлять значением на выходе на основе двух значений на входе.

`timescale 1ns / ps

//это комментарий на Verilog

module hello_world(

input switch[0],

input switch[1],

output led

);

assign led = switch[0] & ~switch[1];

endmodule

Timescale

`timescale 1ns / ps

Это директива, которая определяет единицу модельного времени (первый параметр, 1 нс) и точность модельного времени (второй параметр, 1 пс).

Комментарии

//это комментарий на Verilog

Как и на C++ (потом вы увидите, что синтаксис очень схож с синтаксисом C/C++) комментарий в одну строку начинается с «//». Все после этих двух слешей на текущей строке игнорируется компилятором. Для того, чтобы закомментировать блок, состоящий из нескольких строк, используются «/*» и «*/». Все, что попадет между этими символами, будет закомментировано. Не скупитесь на комментарии, но и не злоупотребляйте ими. Грамотно составленные комментарии облегчат жизнь при отладке.

Объявление модуля

module hello_world(

input switch[0],

input switch[1],

output led

);

В языке Verilog module является ключевым словом. Это как в C++ объявление типа, void hello_world(параметры) – находите сходство?

Впрочем, модуль Verilog не возвращает никакого значения (также, как и при void в C/C++) и он не является, по сути, функцией, но синтаксис очень похож, и мы можем думать о модуле как об объявлении типов, у него даже есть свое имя – hello_world. Хороший Verilog-код – модульный, то есть каждый функциональный блок должен представлять собой модуль.

В скобках у нас имеется что-то вроде списка параметров. Модуль содержит вход switch[0], еще один вход switch[1] и один выход под названием led. input и output по сути являются типами переменных.

После объявления всех входов и выходов список параметров закрывается скобкой, и ставится точка с запятой. В Verilog, как и в C/C++, можно писать длинные выражения в несколько строк, и только точка с запятой будет означать его окончание.

Логика в Verilog

assign led = switch[0] & ~switch[1];

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

Следует помнить, что Verilog – это язык описания аппаратуры, а значит, вы описываете только поведение схемы. На входах switch[0] и switch[1] в разное время могут присутствовать логический «0» и «1», но состояние выхода led всегда будет определяться выражением «switch[0] & ~switch[1];».

Что же значит это выражение? При описании обычной цифровой схемы мы используем знак «•» для логического умножения «И» (AND), «+» для логического сложения «ИЛИ» (OR) и «⊕» для исключающего ИЛИ (XOR). Чтобы показать инверсию, мы рисуем черточку над переменной или выражением. В Verilog всему этому есть эквивалентные обозначения:

Мы можем группировать вместе выражения, используя скобки. Это особенно полезно для создания вентилей NAND, NOR и XNOR. Для этого можно составить выражение для неивертированной версии, а затем перед ним добавить символ «~». Например, чтобы составить выражение типа «F = A xnor B» следует написать «assign F = ~(A ^ B);».

Возвращаясь к «assign led = switch[0] & ~switch[1];», можно сказать, что выход led будет равен единице только, когда switch[0] будет равно единице, и switch[1] будет равно нулю.

Окончание модуля Verilog

endmodule

Это ключевое слово обозначает конец модуля и позволяет компилятору понять, что все что выше этой строки – полезная информация. Хотя среды разработки не особо следят за оформлением, но если у вас будет пустая строка до и пустая строка после строки с endmodule, а сама она не будет иметь отступов, то вы, возможно, сможете избежать некоторых проблем, в первую очередь связанных с пониманием.