http://portal-ed.ru/index.php/uchebnik-verilog Sun, 30 Sep 2018 15:52:00 +0000 Joomla! - Open Source Content Management ru-ru Часть 1 Введение в Verilog http://portal-ed.ru/index.php/uchebnik-verilog/116-chast-1-vvedenie-v-verilog http://portal-ed.ru/index.php/uchebnik-verilog/116-chast-1-vvedenie-v-verilog

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


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


   Следует отметить одну из самых важных отличительных особенностей программирования логики (Verilog, VHDL и т.д.) освоив которую, сразу же все возвращается на круги свои. Всё дело в том, что в ПЛИС все процессы выполняются одновременно! В то время как привычная и понятная нам процессорная техника работает иначе – последовательно. Уяснив эту важную отличительную особенность можно смело пытаться программировать.


   Все плюсы и минусы СБИС ПЛИС освещаются в других разделах. Тут же хотелось бы продолжить уже конкретнее о языке описания аппаратуры Verilog.


   Автор является приверженцем FPGA Xilinx, поэтому большинство примеров будет именно в пакете ISE 14.4, а времяночки из симулятора ModelSim 6.5b.


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


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


   Для серьёзного обучения было бы правильно ознакомиться с международным стандартом - IEEE Std 1364-2001(стандарт на Verilog 2001).

]]> [email protected] (EngineerDeveloper®) Учебник Verilog Fri, 13 Sep 2013 01:59:25 +0000 Часть 2. Синтаксис http://portal-ed.ru/index.php/uchebnik-verilog/117-chast-2-sintaksis http://portal-ed.ru/index.php/uchebnik-verilog/117-chast-2-sintaksis

   Комментарии делятся на:


- Однострочные  (//);
- Блочные  (/* текст комментария или часть программы */).

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

Пример 1

 

   Из примера видно, что строка №34 закомментирована полностью. В то время как в строке №36 закомментировали часть строки «Rc3 & Rc4» и заменили на выражение «Rc3 | Rc4». А к строке №35 написали комментарий.


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

Пример 2

   Хотелось бы отметить, что именно комментарии дают возможность написать заголовок к листингу. То есть отразить непосредственно в коде программы автора программы, назначение блока и т.п.
   В Verilog имя (идентификатор) - последовательность букв и цифр, знаков «$» и «_», причем начинаться оно обязано не с цифры. Регистр имеет значение. Если начальный символ – «\», то следом за ним может идти любая последовательность символов. Все, что до пробела, будет считаться корректным именем. Например: «Character», «cHaracter», «$Character», «\c+Ha^racter».

Правило объявления постоянных (констант) в Verilog имеет следующий вид


[размер]['система счисления] значение константы


   При объявлении размера указывается число бит в слове константы, а в системе счисления указывается соответствующий код (d = десятичный, b = двоичный, o = восьмеричный, h = шестнадцатеричный). По умолчанию система счисления воспринимается как десятичная.


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

  Значения сигналов - сигналы в Verilog могут принимать одно из четырех значений:

- 0 (логический 0);
- 1 (логическая 1);
- X (не задан или не определен);
- Z (состояние высокого импеданса; для применения тристабильных состояний).


   Параметры - параметр в Verilog может быть любая постоянная величина. Параметры используются для унификации блоков (макросов). Например, 4-разрядный сумматор становится полезнее если его описать как n-разрядный сумматор, где n – параметр разрядности, задаваемый пользователем перед компиляцией. Ниже приведены некоторые типичные примеры применения параметров:


   Память - Verilog позволяет использовать двумерные массивы, которые обычно используют как память (ОЗУ).

   Из примера видно, что объявляем регистр «m», как двумерный массив, состоящий из 64-х восьми-битных слов. Вы можете получить доступ к любому из 64-х слов указав, например m [2].


   Verilog 2001 поддерживает 2-уровневый операции по чтению объявленного массива, такие как m [2], [3]. Таким образом получаете доступ к отдельным битам считываемого байта.

]]> [email protected] (EngineerDeveloper®) Учебник Verilog Fri, 13 Sep 2013 02:03:41 +0000 Часть 3. Структура – модули, порты и цепи http://portal-ed.ru/index.php/uchebnik-verilog/119-chast-3-struktura-moduli-porty-i-tsepi http://portal-ed.ru/index.php/uchebnik-verilog/119-chast-3-struktura-moduli-porty-i-tsepi

   Модуль - основной объект иерархии проекта в языке Verilog. Из модулей различного уровня собирается устройство проекта, это происходит в модуле самого верхнего уровня. В принципе, проект может состоять из одного модуля, но большие проекты целесообразно разбить на отдельные модули, т.е. создать структуру проектируемого устройства (иерархия). Простая структура показана на рисунке 1. Здесь в модуле верхнего уровня (модуль 1) соединяются модули нижнего уровня (модули 2 и 3).

 

Общий синтаксис описаниями модуля:


 

Рассмотрим структуру и принцип написания модуля на примере логического элемента «NAND2».

 

Создадим на базе модуля «MY_NAND» более сложное устройство:

   В приведенном выше примере №6, мы собрали устройство из трех модулей типа MY_NAND - D1, D2, D3. Структура устройства MY_MODULE показана на рисунке 2. Здесь мы использовали позиционное назначение портов, т.е. порты назначаются в соответствии с их положением в листе портов модуля MY_NAND. Теперь перепишем Verilog - код и посмотрим, как можно непосредственно назначать порты, не используя листа портов:

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

 

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

 

А теперь давайте рассмотрим два оператора присваивания в примерах на Verilog. Сначала рассмотрим блочное присваивание:

 

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

 

Рисунок 3. Результат блочного присвоения


А теперь пример внеблочного присваивания:

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

Рисунок 4. Результат внеблочного присвоения



   Порт – порты в Verilog  бывают трёх типов:

      - ‘Input’ - входной;

      - ‘Output’ - выходной;

      - ‘Inout’ - двунаправленный.

   Список портов описывается в начале модуля см. пример 12.

   Имена входных и выходных портов по умолчанию типа ‘wire’.

 

   Цепи.  Цепи на схеме соответствуют физическим проводам, которые подключаются ко всем компонентам схемы. Разрядность цепей по умолчанию — один бит. Цепи не хранят значения сигнала, и для того чтобы состояние сигнала в цепи было определено, какой-либо источник сигнала должен непрерывно управлять ею. Если цепь имеет несколько источников сигнала — драйверов (например, два выхода вентилей подключены к одной цепи), то значение результирующего сигнала в цепи имеет значение, согласно тому, какой тип цепи используется. Названия цепей и выполняемые ими функции приведены в таблице 1.

 

Таблица 1.

Название

Функция

Описание

wire

 

Для этой цепи, если все драйверы имеют одно и то же значение, тогда wire принимает это же значение. Если все драйверы, кроме одного, имеют значение Z, тогда wire принимает значение того драйвера, который имеет значение выходного сигнала, не равное Z. Если два или больше не5Z драйвера имеют различную мощность выходного каскада, то wire принимает значение более сильного драйвера. Если два драйвера равной силы имеют различные значения, то wire принимает значение x.

wand

AND

Проводное «И»

wand/triand

0

1

x

z

0

0

0

0

0

1

0

1

x

1

x

0

x

x

x

z

0

1

x

z

 

wor

OR

Проводное «ИЛИ»

wand/triand

0

1

x

z

0

0

1

x

0

1

1

1

1

1

x

x

1

x

x

z

0

1

x

z

 

tri

Tri

Цепь с третьим состоянием

triand

Tri + AND

Цепь с третьим состоянием, выполняющая проводное «И»

wand/triand

0

1

x

z

0

0

0

0

0

1

0

1

х

1

x

0

х

x

x

z

0

1

x

z

 

trior

Tri + OR

Цепь с третьим состоянием, выполняющая проводное «ИЛИ»

wand/triand

0

1

x

z

0

0

1

х

0

1

1

1

1

1

x

х

1

x

x

z

0

1

x

z

 

tri0

Tri + pulldown

Когда эта цепь не управляется, тогда ее значение — 0. Моделируется функция pulldown

tri1

Tri + pullup

Когда эта цепь не управляется, тогда ее значение — 1. Моделируется функция pullup

trireg

 

Цепь ведет себя как wire, за исключением того, что, когда все драйверы сети находятся в высоком импедансе — Z5состоянии, тогда цепь сохраняет свое последнее значение, которое было, когда эта цепь управлялась. trireg используются для того, чтобы моделировать емкость в данной цепи

supply0

 

Моделируют цепи, которые связаны с «землей»

supply1

 

Моделируют сети, которые связаны с питанием


 

Цепь объявляется следующим образом:

 тип[разрядность] имя цепи ;

       Разрядность целесообразно указывать для векторов, а для одноразрядного провода указывается только тип и имя.

          Цепи типа trireg объявляются по следующим синтаксическим правилам:

 

charge_strength - емкость источника (для моделирования).

Емкость источника может принимать следующие значения: small, medium, large. По умолчанию используется medium.

Ниже приведены примеры объявления цепей:

 

   Далее рассмотрим типы из группы переменных.

Таблица 2

Тип

Описание

reg

переменная без знака

integer

переменная со знаком, размерность в 32 разряда

time

переменная в 64 разряда без знака

real

переменная с плавающей точкой

realtime

переменная с плавающей точкой

   Регистры в языке Verilog определяются по следующим синтаксическим правилам:

   Примеры объявления переменных на языке Verilog:

   Для структуризации данных используется константа - parametr (параметр). Параметры не принадлежат к какому-либо регистру или группе цепей. Параметры не переменные, они — константы. Параметры могут быть как местные, локальные, так и глобальные. Синтаксис для объявлений параметров :

 

::= parameter

;

 

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

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



]]> [email protected] (EngineerDeveloper®) Учебник Verilog Wed, 18 Sep 2013 01:49:23 +0000 Часть 4 Выражения в языке Verilog http://portal-ed.ru/index.php/uchebnik-verilog/123-chast-4-vyrazheniya-v-yazyke-verilog http://portal-ed.ru/index.php/uchebnik-verilog/123-chast-4-vyrazheniya-v-yazyke-verilog

4.1 Операнды в выражениях языка Verilog

   Этот раздел описывает операторы и операнды, доступные в Verilog HDL, а также как использовать их в формальных выражениях. Выражения представляют собой конструкции, которые комбинируют операнды с операторами для получения результата, который представляет собой функцию от значений операндов и семантического смысла операторов. Кроме того, выражением может быть любой разрешенный операнд – допустим, группа битов регистра. Существуют некоторые ограничения при написании константных выражений – константные выражения могут содержать только константы или предварительно определенные параметры, но могут содержать любые операторы, приведенные в табл. 4-1. При использовании в выражениях переменных типа integer и time, они воспринимаются, так же как и переменные типа reg.

В языке Verilog можно использовать операнды следующих типов:

-  числа (включающие и вещественные);

-  цепи;

-  регистры, integer и time-переменные;

-  одиночные биты цепи;

-  одиночные биты регистров;

-  группу битов цепи;

-  группу битов регистра;

-  элементы памяти (массива);

-  результат конкатенации;

-  вызовы пользовательских или системных функций, возвращающих любое из

перечисленных выше значений.

 

4.2 Операторы языка Verilog

Символы операторов Verilog HDL похожи на те, что используются в языке С.

Список операторов приведен в табл. 3.

 

Табл. 3 Список операторов Verilog HDL

Символ

Назначение

Использование с типом real

{}

Конкатенация (concatenation)

Не допустимо

+ - * /

Арифметические (arithmetic)

Допустимо

%

Модуль (modulus)

Не допустимо

> >= < <=

Отношения (relational)

Допустимо

!

Логическое отрицание (logical negation)

Допустимо

&&

Логическое И (logical and)

Допустимо

||

Логическое ИЛИ (logical or)

Допустимо

==

Логическое равенство (logical equality)

Допустимо

!=

Логическое неравенство (logical inequality)

Допустимо

===

Идентичность (case equality)

Не допустимо

!===

Не идентичность (case inecuality)

Не допустимо

~

Побитовая инверсия (bit-wise negation)

Не допустимо

&

Побитовое И (bit-wise and)

Не допустимо

|

Побитовое ИЛИ (bit-wise or)

Не допустимо

^

Побитовое исключающее ИЛИ(bit-wise exclusive or, xor)

Не допустимо

^~ ~^

Побитовая эквивалентность (bit-wise equivalence, xnor)

Не допустимо

&

Редукционное И (reduction and)

Не допустимо

~&

Редукционное НЕ-И (reduction nand)

Не допустимо

|

Редукционное ИЛИ (reduction or)

Не допустимо

~|

Редукционное НЕ-ИЛИ (reduction nor)

Не допустимо

^

Редукционное исключающее ИЛИ (reduction xor)

Не допустимо

~^ ^~

Редукционное НЕ исключающее ИЛИ (reduction xnor)

Не допустимо

<< 

Сдвиг влево (left shift)

Не допустимо

>> 

Сдвиг вправо (right shift)

Не допустимо

<<<2

Циклический сдвиг влево (arithmetic left shift)

Не допустимо

>>> 

Циклический сдвиг вправо (arithmetic right shift)

Не допустимо

?:

Условный оператор (conditional)

Допустимо

 

4.2.1. Приоритет бинарных операций

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

 

Наивысший приоритет

+ - ! ~ (унарные)

* / %

+ - (бинарные)

<< >> <<< >>>

< <= > >=

== != === !===

& ~&

^ ^~ ~^

| ~|

&&

||

?:

Нижайший приоритет

 

   Операторы, находящиеся в одной строке имеют равный приоритет, строки упорядочены от наивысшего приоритета к наименьшему. Все операторы с равным приоритетом выполняются в порядке слева-направо, исключение составляет операторы «?:» которые выполняются справа-налево.

   В этом примере значение «В» прибавляется к «А», затем «С» вычитается из результата. Когда операторы имеют различный приоритет, сначала выполняются операторы с наивысшим приоритетом, а затем с меньшим.

 

   В этом примере значение «В» будет поделено на значение «С» и результат будет добавлен к «А». Приоритет выполнения операций может быть изменен с помощью круглых скобок.

   Результат будет совершенно другой в отличие от предыдущего примера. Сначала будет вычислена сумма «А» и «В» и лишь затем результат будет поделен на значение «С».

 

 

4.2.2 Знаковые и беззнаковые числа в выражениях.

 

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

 

   В выражениях Verilog интерпретирует числа в виде sss’f nnn (размерные числа, sss – размер числа в битах) как без знаковые. Запись в такую переменную числа со знаком приведет к тому, что в выражении будет использовано не отрицательное число, а дополнительный код, представленный уже как целое положительное число (см. пример в п. 3.5). Еще один пример приведен ниже, он показывает, что аналогичная ситуация может возникнуть и в случае использования переменной типа integer.

   Не будем забывать, что по умолчанию целое число имеет 32 разряда.

 

4.2.3 Арифметические операции

   К бинарным арифметическим операциям относятся: «+», «-», «*», «/», «%». Операция деления отсекает от целого числа дробную часть. Для получения остатка используется операция %. Эта операция воспринимает знак первого операнда. В следующих примерах представлены различные результаты этой операции.

 

   Унарные арифметические операции (+, -) имеют приоритет перед бинарными. Если один из операндов в арифметических операциях имеет неопределенное значение, то и результат операции будет не определён (х).

4.2.4 Операции отношения

   Следующие примеры иллюстрируют операторы отношения:

   Все эти выражения возвращают лог.0 если приведенное отношение ложно (false) или лог.1 если отношение истинно (true). Если один из операндов имеет неопределенное значение, то и результат будет не определен. Все операторы отношения имеют одинаковый приоритет и более низкий, чем приоритет арифметических операторов. Следующий пример иллюстрирует смысл этого правила:

   Заметим, что в конструкции size – (1 < a) операция отношения вычисляется первой, а затем результат (0 или 1) вычитается из переменной size. В следующем же выражении сначала size уменьшается на 1, а затем результат сравнивается с а.

 

4.2.5 Операторы сравнения

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

   Все четыре оператора имеют одинаковый приоритет. Они сравнивают операнды бит в бит, заполнением нулями, в случае если операнды имеют различную разрядность. Так же как и операторы отношения, они возвращают 0 если false и 1 если true. Если хотя бы один операнд содержит «x» или «z», то операции «==» и «!=» возвращают неопределенное значение. Операции «===» и «!==» сравнивают операнды с учетом x и z, поэтому всегда возвращают либо 0, либо 1.

________________________________________________________________________

Замечание:

Некоторые системы синтеза могут выдавать ошибку на операции «===» и «!==».

________________________________________________________________________

 

4.2.6 Логические операции

            Операторы логического «И» (&&) и логического «ИЛИ» (||) тесно связаны между собой. Результат логического сравнения может принимать значение «истинно» (true, 1) или «ложно» (false, 0), или если один из операндов имеет неопределенное значение, то и результат будет не определён. Допустим, один из операндов имеет значение равное 10, а второй равен нулю. Результат логического «И» будет равен 0, так как второй операнд равен нулю. Результат логического «ИЛИ», однако будет равен 1, так как первый операнд отличен от нуля. Verilog HDL воспринимает операнд равный 0 как «ложный», в то же время если операнд не равен нулю (не обязательно равен 1, например 10), то он воспринимается как «истинный». Именно это и произошло в приведенном примере: операция (true && false) привела к результату false, а операция (true || false) привела к результату true.

   Приоритет операции «&&» больше чем приоритет «||», но оба они меньше, чем приоритет операций отношения и сравнения. Рассмотрим следующий пример:

 

24 a < size – 1 && b != c && index != lastone.

 

   Три субвыражения объединены по логическому «И» без использования круглых скобок. Хотя такая конструкция вполне допустима, применять ее не следует из-за ухудшения читабельности кода. Следующий пример читается гораздо легче:

 

(a < size – 1) && (b != c) && (index != lastone)

 

   Третьим логическим оператором является унарный оператор логического отрицания! Оператор логического отрицания преобразует ненулевое («истинное») значение в 0 («ложно»), а нулевое («ложное») в 1(«истинно»). Неопределенное значение приведет к неопределенному результату. Наиболее часто этот оператор используется в следующей конструкции: if (!inword) эта запись эквивалентна записи if (inword == 0).

 

4.2.7 Побитовые логические операции

             Побитовые операции выполняют манипуляции с операндами бит в бит, т.е. например 0-й бит первого операнда взаимодействует с 0-м битом второго; 1-й бит с 1-м и т.д. Если один из операндов имеет меньшую разрядность, то недостающие биты заполняются нулями. В следующих таблицах представлены результаты побитовых операций – значения результирующих битов в зависимости от битов операндов.

 

Таблица 4. Побитовое отрицание (~ - унарная операция)

0

1

1

0

X

 x

Табл. 5. Побитовое И (&)

 

0

1

x

0

0

0

0

1

0

1

x

x

0

x

x

Табл. 6. Побитовое ИЛИ (|)

 

0

 1

 x

0

0

 1

 x

1

1

 1

 1

x

x

 1

 x

Табл. 7. Побитовое исключающее ИЛИ (^)

 

0

 1

 x

0

0

 1

 x

1

1

 0

 x

x

x

 x

 x

Табл. 8. Побитовое исключающее НЕ ИЛИ (~^ ^~)

 

0

 1

 x

0

1

 0

 x

1

0

 1

 x

x

x

 x

 x

   Следует обратить внимание, что операторы & и &&; | и || различаются принципиально. Операторы && и || обычно используются в конструкциях с условиями (if, например), а & и | для маскирования отдельных битов переменной.

 

4.2.8 Операторы редукции

    Все операторы редукции являются унарными, и результатом всех операций является одноразрядное значение – 0, 1 или х. Алгоритм работы всех операторов следующий: на первом шаге вычисляется значение результата операции между 0-м и 1-м битом операнда, на следующем шаге вычисляется результат между предыдущим результатом и 2-м битом операнда и т.д. пока не будет вычислен результат по всем битам. На каждом шаге результат определяется по таблицам истинности 4 – 8. Необходимо заметить, что унарные операторы редукции NAND и NOR вычисляются точно также как операторы AND и OR, а полученный результат инвертируется. В таблице 9 приведены результаты унарных операций &, |, ~& и ~| различных комбинаций битов операнда. В таблице 10 приведены результаты операций ^ и ~^.

 

Таблица 9. Результаты унарных операций &, |, ~& и ~|

 

Разряды операнда

&

|

~&

~|

Все в лог.0

0

0

1

1

Все в лог.1

1

1

0

0

Часть в лог.0, часть в

лог.1

0

1

1

0

 

Таблица 10. Результаты унарных операций ^ и ~^

                                              

Разряды операнда

^

~^

Нечетное число бит в

лог.1

1

0

Четное число бит в

лог.1 (или ни одного)

0

1

 

4.2.9 Синтаксические ограничения

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

 

1. a & &b; a | |b;

2. a && b; a || b;

 

   В первой строке введен дополнительный символ пробела между символами & и |. Это может быть замысел разработчика, а может ошибочный ввод пробела. Для того, чтобы предотвратить подобную неоднозначность Verilog требует разделить бинарную и унарную операцию круглыми скобками. В силу этого требования первая строка примера является ошибочной. Поэтому правильно надо записывать так:

 

a & (&b); a | (|b);

 

4.2.10 Операторы сдвига

            К операторам сдвига относятся операторы <<, >>, <<< и >>>. Первые два оператора выполняют простой сдвиг влево или вправо на количество позиций указанных операндом в правой части выражения, два других выполняют циклический или иначе арифметический сдвиг. В следующем примере иллюстрируется механизм действия этих операторов.

                                                                                   Выражение             Результат

     8’b01001111 << 3   8’b01111000

     8’b01001111 <<< 3 8’b01111010

     8’b01001111 >> 3   8’b00001001

     8’b01001111 >>> 3 8’b11101001

            Простые операторы сдвига заполняют освободившиеся позиции нулевыми значениями, циклические операторы сдвига выполняют сдвиг «по кольцу».

 

4.2.11 Условный оператор

            Условный оператор имеет три операнда, разделенные двумя операторами в следующем формате:

 

cond_expr ? true_expr : false_expr;

 

            Если условие (cond_expr) вычисляется как «ложное» (false), то в качестве результата будет использовано выражение false_expr. Если условие «истинно» (true), то будет использовано выражение true_expr. В случае если условие неопределенно, то оба выражения false_expr и true_expr сравниваются бит в бит, по правилам указанным в табл. 11, для того, чтобы вычислить окончательный результат. Если разрядность операндов различна, то наименьший из двух приводится к разрядности большего, при этом недостающие биты добавляются слева и заполняются нулями.

 

Таблице 11. Результат неопределенного условия

?:

 0

 1

 x

 z

0

 0

x

 x

 x

1

 x

1

 x

 x

x

x

x

 x

 x

z

x

x

 x

 x

 

            Следующий пример иллюстрирует типичное применение условного оператора для реализации шины с тремя состояниями:

 

wire [15:0] busa = drive_busa ? data : 16’bz;

 

            Если drive_busa равен лог.1 то на шине busa устанавливается значение data. Если drive_busa неизвестен, то неизвестное значение устанавливается и на шине busa. В случае если drive_busa находится в состоянии лог.0, то шина busa находится в состоянии высокого импеданса.

 

4.2.12 Конкатенация

             Операция конкатенации является одной из наиболее удобных и мощных операций в языке Verilog. Суть ее заключается в слиянии нескольких переменных в единое целое, единую переменную, с которой можно производить любые другие операции. Необходимо отметить два момента: операция конкатенации обладает наивысшим приоритетом по сравнению с любой другой операцией вне символов конкатенации ({}), но операции заключенные внутри фигурных скобок имеют еще больший приоритет (Операции внутри фигурных скобок это недокументированное свойство языка, главное в этом случае, чтобы в результате внутренней операции результат получил определенную разрядность). Вторым моментом является тот факт, что операция конкатенации недопустима с вещественными числами.

            Синтаксис операции приведен ниже:

 

{, , … };

 

            Операция может содержать несколько повторяющихся элементов, для сокращения записи используется множитель, который указывает сколько раз повторяется данный элемент:

 

{4{w}} эквивалентно {w, w, w, w}

 

            Множитель может быть целой, неотрицательной константой или константным выражением.

            Также в операции могут использоваться внутренние объединения:

 

{{a, b, c}, {3{d, e}}} эквивалентно {a, b, c, d, e, d, e, d, e}

 

            Результат операции слияния может использоваться в любом случае в качестве операндов или в качестве вектора (переменной) которой присваивается значение. Это широко используется для случаев, когда функция должна вернуть несколько значений.

 

 

]]> [email protected] ( EngineerDeveloper®) Учебник Verilog Tue, 01 Oct 2013 01:08:03 +0000