цифровая электроника
вычислительная техника
встраиваемые системы

 

Verilog. Базовый курс. Часть I

Автор: Mike(admin) от 30-01-2014, 07:20

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


Перед началом изучения Verilog читатель должен иметь базовые представления о булевой логике и уметь решать хотя бы простейшие логические выражения. Например, чему будет равна функция F в выражении F = (A • B), если A в лог. «1», а B в лог. «0»? Если читатель знаком с языком C/C++, то ему будет легче понимать некоторые вещи, поскольку Verilog имеет схожий синтаксис. В целом, Verilog достаточно прост в изучении, поэтому поехали…


Основы Verilog


Итак, что же такое Verilog? Если кратко, то это язык описания аппаратуры (hardware description language или HDL). Но без пояснения этого термина вряд ли новичку будет что-либо понятно. Языки описания аппаратуры используются для формального описания функционирования схемы. Существует несколько языков описания аппаратуры, но популярны лишь два – VHDL и Verilog.


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


FPGA и UCF-файлы


ПЛИС FPGA

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


FPGA представляет собой чистый лист для вашей цифровой схемы. Интегрированные среды разработки вроде Xilinx ISE Design Suite преобразуют ваш «высокоуровневый» код на Verilog в поток битов, который и определит поведение FPGA. Поэтому вместо покупки мультиплексоров и прочих элементов мы напишем код и определим, какие выводы FPGA будут входами, а какие выходами.


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


Ваш первый проект на Verilog


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


В отношении Verilog нужно сделать несколько замечаний. Этот язык чувствителен к регистру. То есть большие буквы и маленькие буквы – разные вещи. Также следует обращать внимание на отступы, хотя нижеприведенный пример и не демонстрирует этого, но в объемном коде это заметно. Компилятор и среда разработки «проглотят» плохо форматированный код, но плохой стиль будет источником непонимания и возможных ошибок.


Итак, вот «Hello, World» на Verilog:



----------------------------------------------------

`timescale 1ns / ps
//this is a comment in 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 пс). Для своего проекта, конечно, вы можете установить другие значения, впрочем для FPGA эта директива не так важна, поскольку в ней нельзя задавать задержки вентилей или таким способом манипулировать с временными параметрами, но при симуляции схемы эта директива важна.


Комментарии


//это комментарий на 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];».


А что вообще значит это выражение? Что такое switch[0] и switch[1] – понятно. А «&» и «~» для чего?


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


логические команды 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, а сама она не будет иметь отступов, то вы, возможно, сможете избежать некоторых проблем, в первую очередь связанных с пониманием.




Часть II


Часть III


Часть IV


Часть V


Часть VI




Перевод © digitrode.ru


<Источник>


Теги: Verilog, ПЛИС



Уважаемый посетитель, Вы зашли на сайт как незарегистрированный пользователь.
Мы рекомендуем Вам зарегистрироваться либо войти на сайт под своим именем.

Комментарии:

Оставить комментарий
Цитата
  • Romeo

  • 25 апреля 2014 02:14
  • Группа: Гости
  • ICQ:
  • Регистрация: --
  • Статус:
  • Комментариев: 0
  • Публикаций: 0
^
Дополнительная информация по операторам и синтаксису Verilog: http://fpga.in.ua/fpga/cad-pld/verilog-basics-laboratory-works/lr2-issledovanie-
kombinacionnyx-ustrojstv-osobennosti-yazyka-verilog.html