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

 

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

Автор: Mike(admin) от 31-01-2014, 18:16

В первой части мы создали простой проект на Verilog типа «Hello World» и рассмотрели некоторые базовые моменты. В этой части мы углубимся в дело изучения этого языка и в сам процесс проектирования на ПЛИС.


Подготовка к программированию платы


В данном случае воспользуемся платой Digilent Basys 2 с ПЛИС Xilinx Spartan 3-E FPGA.


Digilent Basys 2

Итак, о чем же нам нужно в первую очередь позаботиться? Правильно, о UCF-файле. Следует помнить, что в зависимости от модели платы выводы могут иметь различное функциональное значение, то есть могут быть «привязаны» к светодиодам, кнопкам и т.п. Перед использованием платы стоит внимательно изучить схему.


Для данной платы назначение вывода будет следующим:


NET "led" LOC = "M5" ;


NET предшествует каждому объявлению вывода, после чего в кавычках идет переменная, затем LOC определяет физический вывод, который также приводится в кавычках.


Способ оформления комментариев в UCF отличается от способа, применяемого в модулях Verilog. В данном случае используется символ «#».


После того, как вы создадите UCF-файл, ваша среда разработки сможет создать битовый поток для FPGA, куда входит и информация из Verilog-файла. Следует заметить, что Verilog-файлы имеют расширение .v, а UCF-файлы – .ucf. Оба файла можно редактировать в блокноте или любом другом редакторе.


В зависимости от платы процесс программирования может отличаться, поэтому внимательно читайте инструкции производителя.


Порты, провода и регистры


Итак, в нашем примере мы имеем следующее объявление модуля:


module hello_world(
input switch[0],
input switch[1],
output led
);


Что же, по сути, такое input и output? Это идентификаторы, которые сообщают компилятору, порт какого типа вы создаете. В Verilog мы имеем дело со следующими типами:


input : назначение порта на вход, предполагается тип «wire», то есть провод.


output : назначение порта на выход, предполагается тип «wire». Выходной порт может быть привязан к какому-либо значению с помощью assign, или его значение может быть изменено в зависимости от поведения другого модуля.


output reg : назначение порта на выход, предполагается тип «reg», то есть регистр. Этому типу порта можно задать значение независимо от других частей схемы (например, назначить ему логическую «1»), и это значение будет оставаться тем же, пока не будет при необходимости изменено.


В общем, wire служит только для соединения одной точки схемы с другой, а reg может сам представлять собой источник, который можно привязать к другой точке.


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


wire my_wire;
reg my_reg;


Обратите внимание, что мы не указываем проводу и регистру тип (input или output), потому что в ходе проектирования мы присвоим им источник и точку назначения. В Verilog мы можем присвоить выходному проводу значение внутреннего регистра или провода. Это позволит нам изменять значение на выходе, меняя значение регистра.


Порты, провода и регистры мы можем объединять в шины или векторы (массивы). Мы можем группировать похожие сигналы, используя шину. Так, вместо объявления двух входов мы могли бы объявить шину, состоящую из двух элементов. То есть вместо «input switch0, input switch1» мы могли бы написать «input [1:0] switch». Этим мы создали двухбитовую шину под названием «switch». Обращаться к конкретному элементу шины мы будем с помощью квадратных скобок «[]», например, «switch[0]». Шины в Verilog очень полезны, они позволяют существенно сократить размеры кода.


Объявление шин выполняется в соответствии со следующим синтаксисом (здесь <тип> может быть input, output, wire или reg):


<тип> [<максимальный индекс> : <минимальный индекс>] <имя шины>


Если вы объявляете шину внутри модуля, то убедитесь, что в конце стоит точка с запятой, а если в разделе объявления модуля, то убедитесь, что все ваши объявления разделены запятыми.


Как существование шины скажется на UCF-файле? Всем компонентам шины будет дано имя, которое начинается наименованием шины и заканчивается конкретным индексом этой шины. Например, «[1:0] switch» в UCF-файле будет представлено двумя записями: «switch<0>» и «switch<1>». В UCF-файле не забывайте использовать операторы <>.




Часть I


Часть III


Часть IV


Часть V


Часть VI




Перевод © digitrode.ru


<Источник>


Теги: Verilog, ПЛИС



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

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

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