http://portal-ed.ru/index.php/uchebnik-verilog 2018-09-30T15:51:55+00:00 Joomla! - Open Source Content Management
Часть 1 Введение в Verilog
2013-09-13T01:59:25+00:00 2013-09-13T01:59:25+00:00 http://portal-ed.ru/index.php/uchebnik-verilog/116-chast-1-vvedenie-v-verilog EngineerDeveloper® [email protected]
<div class="feed-description"><p style="text-align: justify;"><span style="font-size: medium;"> <span style="font-family: arial,helvetica,sans-serif;"><strong><em> Verilog, Verilog HDL</em></strong> (англ. Verilog Hardware Description Language) — это язык описания аппаратуры, используемый для описания и моделирования электронных систем. Verilog HDL, не следует путать с VHDL (конкурирующий язык), наиболее часто используется в проектировании, верификации и реализации (например, в виде СБИС) аналоговых, цифровых и смешанных электронных систем на различных уровнях абстракции.</span></span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Разработчики Verilog сделали его синтаксис очень похожим на синтаксис языка C, что упрощает его освоение. Verilog имеет препроцессор, очень похожий на препроцессор языка C, и основные управляющие конструкции «if», «while» также подобны одноимённым конструкциям языка «C».</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Следует отметить одну из самых важных отличительных особенностей программирования логики (Verilog, VHDL и т.д.) освоив которую, сразу же все возвращается на круги свои. Всё дело в том, что в ПЛИС все процессы выполняются одновременно! В то время как привычная и понятная нам процессорная техника работает иначе – последовательно. Уяснив эту важную отличительную особенность можно смело пытаться программировать.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Все плюсы и минусы СБИС ПЛИС освещаются в других разделах. Тут же хотелось бы продолжить уже конкретнее о языке описания аппаратуры Verilog.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Автор является приверженцем FPGA Xilinx, поэтому большинство примеров будет именно в пакете ISE 14.4, а времяночки из симулятора ModelSim 6.5b.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Теоретический материал был найден на просторах интернета, а так же в книгах с полки. С литературой и интернет ресурсами по теме Verilog можно ознакомиться в соответствующих разделах сайта.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Статья ни в коем случае не претендует на полноту описания языка Verilog. И, конечно, она не может заменить множества книг, которые Вам придется прочитать, если Вы всерьез займетесь проектированием цифровых микросхем. Тем не менее, эти уроки послужат практическим навыком начинающим разработчикам.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Для серьёзного обучения было бы правильно ознакомиться с международным стандартом - <span style="background-color: #ffffff; color: #0000ff;">IEEE Std 1364-2001</span>(стандарт на Verilog 2001).</span><br /><br /></p></div>
<div class="feed-description"><p style="text-align: justify;"><span style="font-size: medium;"> <span style="font-family: arial,helvetica,sans-serif;"><strong><em> Verilog, Verilog HDL</em></strong> (англ. Verilog Hardware Description Language) — это язык описания аппаратуры, используемый для описания и моделирования электронных систем. Verilog HDL, не следует путать с VHDL (конкурирующий язык), наиболее часто используется в проектировании, верификации и реализации (например, в виде СБИС) аналоговых, цифровых и смешанных электронных систем на различных уровнях абстракции.</span></span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Разработчики Verilog сделали его синтаксис очень похожим на синтаксис языка C, что упрощает его освоение. Verilog имеет препроцессор, очень похожий на препроцессор языка C, и основные управляющие конструкции «if», «while» также подобны одноимённым конструкциям языка «C».</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Следует отметить одну из самых важных отличительных особенностей программирования логики (Verilog, VHDL и т.д.) освоив которую, сразу же все возвращается на круги свои. Всё дело в том, что в ПЛИС все процессы выполняются одновременно! В то время как привычная и понятная нам процессорная техника работает иначе – последовательно. Уяснив эту важную отличительную особенность можно смело пытаться программировать.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Все плюсы и минусы СБИС ПЛИС освещаются в других разделах. Тут же хотелось бы продолжить уже конкретнее о языке описания аппаратуры Verilog.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Автор является приверженцем FPGA Xilinx, поэтому большинство примеров будет именно в пакете ISE 14.4, а времяночки из симулятора ModelSim 6.5b.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Теоретический материал был найден на просторах интернета, а так же в книгах с полки. С литературой и интернет ресурсами по теме Verilog можно ознакомиться в соответствующих разделах сайта.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Статья ни в коем случае не претендует на полноту описания языка Verilog. И, конечно, она не может заменить множества книг, которые Вам придется прочитать, если Вы всерьез займетесь проектированием цифровых микросхем. Тем не менее, эти уроки послужат практическим навыком начинающим разработчикам.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium; font-family: arial,helvetica,sans-serif;"> Для серьёзного обучения было бы правильно ознакомиться с международным стандартом - <span style="background-color: #ffffff; color: #0000ff;">IEEE Std 1364-2001</span>(стандарт на Verilog 2001).</span><br /><br /></p></div>
Часть 2. Синтаксис
2013-09-13T02:03:41+00:00 2013-09-13T02:03:41+00:00 http://portal-ed.ru/index.php/uchebnik-verilog/117-chast-2-sintaksis EngineerDeveloper® [email protected]
<div class="feed-description"><p><span style="font-size: medium;"> Комментарии делятся на:</span></p> <p><br /><span style="font-size: medium;">- Однострочные (<strong>//</strong>);</span><br /><span style="font-size: medium;">- Блочные (<strong>/*</strong> <span style="color: #339966;">текст комментария или часть программы</span> <strong>*/</strong>).</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Однострочными комментариями можно закомментировать часть одной строки или всю строку полностью.</span></p> <p><span style="font-size: medium;">Пример 1</span></p> <p> <img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex1.jpg" border="0" alt="" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Из примера видно, что строка №34 закомментирована полностью. В то время как в строке №36 закомментировали часть строки «Rc3 & Rc4» и заменили на выражение «Rc3 | Rc4». А к строке №35 написали комментарий.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium;"> Блочные комментарии дают возможность закомментировать участок программы. Но следует отметить, что рассматриваемый тип комментариев не позволяет комментировать часть кода в строке.</span></p> <p><span style="font-size: medium;">Пример 2</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex2.jpg" border="0" alt="" /></span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Хотелось бы отметить, что именно комментарии дают возможность написать заголовок к листингу. То есть отразить непосредственно в коде программы автора программы, назначение блока и т.п.</span><br /><span style="font-size: medium;"> В Verilog имя (идентификатор) - последовательность букв и цифр, знаков «$» и «_», причем начинаться оно обязано не с цифры. Регистр имеет значение. Если начальный символ – «\», то следом за ним может идти любая последовательность символов. Все, что до пробела, будет считаться корректным именем. Например: «Character», «cHaracter», «$Character», «\c+Ha^racter».</span></p> <p style="text-align: justify;"><span style="font-size: medium;">Правило объявления постоянных (констант) в Verilog имеет следующий вид</span></p> <p><br /><em><span style="font-size: medium;">[размер]['система счисления] значение константы</span></em></p> <p><em><span style="font-size: medium;"><br /></span></em></p> <p style="text-align: justify;"><span style="font-size: medium;"> При объявлении размера указывается число бит в слове константы, а в системе счисления указывается соответствующий код (d = десятичный, b = двоичный, o = восьмеричный, h = шестнадцатеричный). По умолчанию система счисления воспринимается как десятичная.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex3.jpg" border="0" alt="" width="569" height="127" /></span></p> <p><br /><span style="font-size: medium;"> Пунктуация - пробелы игнорируются в Verilog. Точка с запятой используется для обозначения конца командной строки. Запятые, как правило, используются для отдельных элементов в списке.</span></p> <p><span style="font-size: medium;"> Значения сигналов - сигналы в Verilog могут принимать одно из четырех значений:</span></p> <p><span style="font-size: medium;">- 0 (логический 0);</span><br /><span style="font-size: medium;">- 1 (логическая 1);</span><br /><span style="font-size: medium;">- X (не задан или не определен);</span><br /><span style="font-size: medium;">- Z (состояние высокого импеданса; для применения тристабильных состояний).</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium;"> Параметры - параметр в Verilog может быть любая постоянная величина. Параметры используются для унификации блоков (макросов). Например, 4-разрядный сумматор становится полезнее если его описать как n-разрядный сумматор, где n – параметр разрядности, задаваемый пользователем перед компиляцией. Ниже приведены некоторые типичные примеры применения параметров:</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex4.jpg" border="0" alt="" width="342" height="115" /></span></p> <p><br /><span style="font-size: medium;"> Память - Verilog позволяет использовать двумерные массивы, которые обычно используют как память (ОЗУ).</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex5.jpg" border="0" alt="" width="306" height="63" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Из примера видно, что объявляем регистр «m», как двумерный массив, состоящий из 64-х восьми-битных слов. Вы можете получить доступ к любому из 64-х слов указав, например m [2].</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium;"> Verilog 2001 поддерживает 2-уровневый операции по чтению объявленного массива, такие как m [2], [3]. Таким образом получаете доступ к отдельным битам считываемого байта.</span></p></div>
<div class="feed-description"><p><span style="font-size: medium;"> Комментарии делятся на:</span></p> <p><br /><span style="font-size: medium;">- Однострочные (<strong>//</strong>);</span><br /><span style="font-size: medium;">- Блочные (<strong>/*</strong> <span style="color: #339966;">текст комментария или часть программы</span> <strong>*/</strong>).</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Однострочными комментариями можно закомментировать часть одной строки или всю строку полностью.</span></p> <p><span style="font-size: medium;">Пример 1</span></p> <p> <img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex1.jpg" border="0" alt="" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Из примера видно, что строка №34 закомментирована полностью. В то время как в строке №36 закомментировали часть строки «Rc3 & Rc4» и заменили на выражение «Rc3 | Rc4». А к строке №35 написали комментарий.</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium;"> Блочные комментарии дают возможность закомментировать участок программы. Но следует отметить, что рассматриваемый тип комментариев не позволяет комментировать часть кода в строке.</span></p> <p><span style="font-size: medium;">Пример 2</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex2.jpg" border="0" alt="" /></span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Хотелось бы отметить, что именно комментарии дают возможность написать заголовок к листингу. То есть отразить непосредственно в коде программы автора программы, назначение блока и т.п.</span><br /><span style="font-size: medium;"> В Verilog имя (идентификатор) - последовательность букв и цифр, знаков «$» и «_», причем начинаться оно обязано не с цифры. Регистр имеет значение. Если начальный символ – «\», то следом за ним может идти любая последовательность символов. Все, что до пробела, будет считаться корректным именем. Например: «Character», «cHaracter», «$Character», «\c+Ha^racter».</span></p> <p style="text-align: justify;"><span style="font-size: medium;">Правило объявления постоянных (констант) в Verilog имеет следующий вид</span></p> <p><br /><em><span style="font-size: medium;">[размер]['система счисления] значение константы</span></em></p> <p><em><span style="font-size: medium;"><br /></span></em></p> <p style="text-align: justify;"><span style="font-size: medium;"> При объявлении размера указывается число бит в слове константы, а в системе счисления указывается соответствующий код (d = десятичный, b = двоичный, o = восьмеричный, h = шестнадцатеричный). По умолчанию система счисления воспринимается как десятичная.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex3.jpg" border="0" alt="" width="569" height="127" /></span></p> <p><br /><span style="font-size: medium;"> Пунктуация - пробелы игнорируются в Verilog. Точка с запятой используется для обозначения конца командной строки. Запятые, как правило, используются для отдельных элементов в списке.</span></p> <p><span style="font-size: medium;"> Значения сигналов - сигналы в Verilog могут принимать одно из четырех значений:</span></p> <p><span style="font-size: medium;">- 0 (логический 0);</span><br /><span style="font-size: medium;">- 1 (логическая 1);</span><br /><span style="font-size: medium;">- X (не задан или не определен);</span><br /><span style="font-size: medium;">- Z (состояние высокого импеданса; для применения тристабильных состояний).</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium;"> Параметры - параметр в Verilog может быть любая постоянная величина. Параметры используются для унификации блоков (макросов). Например, 4-разрядный сумматор становится полезнее если его описать как n-разрядный сумматор, где n – параметр разрядности, задаваемый пользователем перед компиляцией. Ниже приведены некоторые типичные примеры применения параметров:</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex4.jpg" border="0" alt="" width="342" height="115" /></span></p> <p><br /><span style="font-size: medium;"> Память - Verilog позволяет использовать двумерные массивы, которые обычно используют как память (ОЗУ).</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_2/ex5.jpg" border="0" alt="" width="306" height="63" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Из примера видно, что объявляем регистр «m», как двумерный массив, состоящий из 64-х восьми-битных слов. Вы можете получить доступ к любому из 64-х слов указав, например m [2].</span></p> <p style="text-align: justify;"><br /><span style="font-size: medium;"> Verilog 2001 поддерживает 2-уровневый операции по чтению объявленного массива, такие как m [2], [3]. Таким образом получаете доступ к отдельным битам считываемого байта.</span></p></div>
Часть 3. Структура – модули, порты и цепи
2013-09-18T01:49:23+00:00 2013-09-18T01:49:23+00:00 http://portal-ed.ru/index.php/uchebnik-verilog/119-chast-3-struktura-moduli-porty-i-tsepi EngineerDeveloper® [email protected]
<div class="feed-description"><p style="text-align: justify;"><span style="font-size: medium;"><strong> Модуль</strong> - основной объект иерархии проекта в языке Verilog. Из модулей различного уровня собирается устройство проекта, это происходит в модуле самого верхнего уровня. В принципе, проект может состоять из одного модуля, но большие проекты целесообразно разбить на отдельные модули, т.е. создать структуру проектируемого устройства (иерархия). Простая структура показана на рисунке 1. Здесь в модуле верхнего уровня (модуль 1) соединяются модули нижнего уровня (модули 2 и 3).</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/sh1.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p> </p> <p><span style="font-size: medium;">Общий синтаксис описаниями модуля:</span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex_____.jpg" border="0" alt="" /></span></p> <p> </p> <p><span style="font-size: medium;">Рассмотрим структуру и принцип написания модуля на примере логического элемента «NAND2».</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex6.jpg" border="0" alt="" /></p> <p> </p> <p><span style="font-size: medium;">Создадим на базе модуля «MY_NAND» более сложное устройство:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex7.jpg" border="0" alt="" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> В приведенном выше примере №6, мы собрали устройство из трех модулей типа MY_NAND - D1, D2, D3. Структура устройства MY_MODULE показана на рисунке 2. Здесь мы использовали позиционное назначение портов, т.е. порты назначаются в соответствии с их положением в листе портов модуля MY_NAND. Теперь перепишем Verilog - код и посмотрим, как можно непосредственно назначать порты, не используя листа портов:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/sh2.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Мы не будем уже пользоваться позиционным назначением портов. Посмотрите, как выглядит непосредственное назначение в языке Verilog. Видите, порты назначаются в любой последовательности независимо от их расположения в листе портов модуля MY_NAND.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex8.jpg" border="0" alt="" /></p> <p style="text-align: justify;"> </p> <p style="text-align: justify;"><span style="font-size: medium;"> Мы можем, используя схожий механизм Verilog, переименовать порты интерфейса модуля, не изменяя внутри модуля ничего. Это может быть полезным, когда мы хотим иметь более информативные названия портов в уже написанном модуле и не переписывать при этом внутренности:</span></p> <p> </p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex9.jpg" border="0" alt="" /></p> <p><span style="font-size: medium;">А теперь давайте рассмотрим два оператора присваивания в примерах на Verilog. Сначала рассмотрим блочное присваивание:</span></p> <p> </p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex10.jpg" border="0" alt="" /></p> <p><span style="font-size: medium;">На рисунке 3 показано, какую схему мы получим в результате синтеза кода с применением блочного присваивания.</span></p> <p> </p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/sh3.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p align="center"><span style="font-size: medium;">Рисунок 3. Результат блочного присвоения</span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;">А теперь пример внеблочного присваивания:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex11.jpg" border="0" alt="" /></p> <p><span style="font-size: medium;"> На рисунке 4 показано, какую схему мы получим в результате синтеза кода с применением внеблочного присваивания.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/sh4.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p align="center"><span style="font-size: medium;">Рисунок 4. Результат внеблочного присвоения</span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;"> Порт – порты в Verilog бывают трёх типов:</span></p> <p><span style="font-size: medium;"> - ‘Input’ - входной;</span></p> <p><span style="font-size: medium;"> - ‘Output’ - выходной;</span></p> <p><span style="font-size: medium;"> - ‘Inout’ - двунаправленный.</span></p> <p><span style="font-size: medium;"> Список портов описывается в начале модуля см. пример 12.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex12.jpg" border="0" alt="" /></p> <p><span style="font-size: medium;"> Имена входных и выходных портов по умолчанию типа ‘wire’.</span></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"><strong> Цепи.</strong> Цепи на схеме соответствуют физическим проводам, которые подключаются ко всем компонентам схемы. Разрядность цепей по умолчанию — один бит. Цепи не хранят значения сигнала, и для того чтобы состояние сигнала в цепи было определено, какой-либо источник сигнала должен непрерывно управлять ею. Если цепь имеет несколько источников сигнала — драйверов (например, два выхода вентилей подключены к одной цепи), то значение результирующего сигнала в цепи имеет значение, согласно тому, какой тип цепи используется. Названия цепей и выполняемые ими функции приведены в таблице 1.</span></p> <p style="text-align: justify;"> </p> <p style="text-align: justify;"><span style="font-size: medium;">Таблица 1.</span></p> <table style="width: 646px; height: 826px;" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="102"> <p style="text-align: center;"><span style="font-size: medium;">Название</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Функция</span></p> </td> <td valign="top" width="423"> <p><span style="font-size: medium;">Описание</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">wire</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="423"> <p style="text-align: center;"><span style="font-size: medium;">Для этой цепи, если все драйверы имеют одно и то же значение, тогда wire принимает это же значение. Если все драйверы, кроме одного, имеют значение Z, тогда wire принимает значение того драйвера, который имеет значение выходного сигнала, не равное Z. Если два или больше не5Z драйвера имеют различную мощность выходного каскада, то wire принимает значение более сильного драйвера. Если два драйвера равной силы имеют различные значения, то wire принимает значение x.</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">wand</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">AND</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Проводное «И»</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">wand/triand</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">z</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> </tbody> </table> </div> <p align="center"><span style="font-size: medium;"> </span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">wor</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">OR</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Проводное «ИЛИ»</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">wand/triand</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">z</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> </tbody> </table> </div> <p align="center"><span style="font-size: medium;"> </span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">tri</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Цепь с третьим состоянием</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">triand</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri + AND</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Цепь с третьим состоянием, выполняющая проводное «И»</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">wand/triand</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">х</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">х</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">z</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;"> </span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">trior</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri + OR</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Цепь с третьим состоянием, выполняющая проводное «ИЛИ»</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">wand/triand</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">х</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">х</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">z</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> </tbody> </table> </div> <p align="center"><span style="font-size: medium;"> </span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">tri0</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri + pulldown</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Когда эта цепь не управляется, тогда ее значение — 0. Моделируется функция pulldown</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">tri1</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri + pullup</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Когда эта цепь не управляется, тогда ее значение — 1. Моделируется функция pullup</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">trireg</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Цепь ведет себя как wire, за исключением того, что, когда все драйверы сети находятся в высоком импедансе — Z5состоянии, тогда цепь сохраняет свое последнее значение, которое было, когда эта цепь управлялась. trireg используются для того, чтобы моделировать емкость в данной цепи</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">supply0</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Моделируют цепи, которые связаны с «землей»</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">supply1</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Моделируют сети, которые связаны с питанием</span></p> </td> </tr> </tbody> </table> <p style="text-align: justify;"><span style="font-size: medium;"><br /></span></p> <p> </p> <p><span style="font-size: medium;">Цепь объявляется следующим образом:</span></p> <p style="text-align: center;"><span style="font-size: medium;"> <em>тип[разрядность] имя цепи ;</em></span></p> <p><span style="font-size: medium;"> Разрядность целесообразно указывать для векторов, а для одноразрядного провода указывается только тип и имя.</span></p> <p><span style="font-size: medium;"> Цепи типа trireg объявляются по следующим синтаксическим правилам:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/pravilo.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p> </p> <p><span style="font-size: medium;">charge_strength - емкость источника (для моделирования).</span></p> <p><span style="font-size: medium;">Емкость источника может принимать следующие значения: small, medium, large. По умолчанию используется medium.</span></p> <p><span style="font-size: medium;">Ниже приведены примеры объявления цепей:</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex13.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p> </p> <p><span style="font-size: medium;"> Далее рассмотрим типы из группы переменных.</span></p> <p><span style="font-size: medium;">Таблица 2</span></p> <table style="width: 638px;" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="83"> <p align="center"><span style="font-size: medium;"><strong>Тип</strong></span></p> </td> <td width="555"> <p align="center"><span style="font-size: medium;"><strong>Описание</strong></span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">reg</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная без знака</span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">integer</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная со знаком, размерность в 32 разряда</span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">time</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная в 64 разряда без знака</span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">real</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная с плавающей точкой</span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">realtime</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная с плавающей точкой</span></p> </td> </tr> </tbody> </table> <p style="text-align: justify;"><span style="font-size: medium;"> Регистры в языке Verilog определяются по следующим синтаксическим правилам:</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/pravilo1.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Примеры объявления переменных на языке Verilog:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex14.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Для структуризации данных используется константа - parametr (параметр). Параметры не принадлежат к какому-либо регистру или группе цепей. Параметры не переменные, они — константы. Параметры могут быть как местные, локальные, так и глобальные. Синтаксис для объявлений параметров <parameter_declaration>:</span></p> <p> </p> <p><span style="font-size: medium;"><em><parameter_declaration></em></span></p> <p><span style="font-size: medium;"><em>::= parameter</em></span></p> <p><span style="font-size: medium;"><em><list_of_assignments>;</em></span></p> <p> </p> <p style="text-align: justify;"><span style="font-size: medium;">Примечание: в некоторых случаях при использовании параметров можно определять диапазон при объявлении параметра.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"><list_of_assignments> — список назначений, разделенный запятыми, где правая сторона назначения должна быть постоянным выражением, то есть выражением, содержащим только постоянные числа и предварительно определенные параметры. В следующем примере 16 показано объявление параметров.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex15.jpg" border="0" alt="" /></span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;"><br /></span></p></div>
<div class="feed-description"><p style="text-align: justify;"><span style="font-size: medium;"><strong> Модуль</strong> - основной объект иерархии проекта в языке Verilog. Из модулей различного уровня собирается устройство проекта, это происходит в модуле самого верхнего уровня. В принципе, проект может состоять из одного модуля, но большие проекты целесообразно разбить на отдельные модули, т.е. создать структуру проектируемого устройства (иерархия). Простая структура показана на рисунке 1. Здесь в модуле верхнего уровня (модуль 1) соединяются модули нижнего уровня (модули 2 и 3).</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/sh1.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p> </p> <p><span style="font-size: medium;">Общий синтаксис описаниями модуля:</span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex_____.jpg" border="0" alt="" /></span></p> <p> </p> <p><span style="font-size: medium;">Рассмотрим структуру и принцип написания модуля на примере логического элемента «NAND2».</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex6.jpg" border="0" alt="" /></p> <p> </p> <p><span style="font-size: medium;">Создадим на базе модуля «MY_NAND» более сложное устройство:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex7.jpg" border="0" alt="" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> В приведенном выше примере №6, мы собрали устройство из трех модулей типа MY_NAND - D1, D2, D3. Структура устройства MY_MODULE показана на рисунке 2. Здесь мы использовали позиционное назначение портов, т.е. порты назначаются в соответствии с их положением в листе портов модуля MY_NAND. Теперь перепишем Verilog - код и посмотрим, как можно непосредственно назначать порты, не используя листа портов:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/sh2.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Мы не будем уже пользоваться позиционным назначением портов. Посмотрите, как выглядит непосредственное назначение в языке Verilog. Видите, порты назначаются в любой последовательности независимо от их расположения в листе портов модуля MY_NAND.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex8.jpg" border="0" alt="" /></p> <p style="text-align: justify;"> </p> <p style="text-align: justify;"><span style="font-size: medium;"> Мы можем, используя схожий механизм Verilog, переименовать порты интерфейса модуля, не изменяя внутри модуля ничего. Это может быть полезным, когда мы хотим иметь более информативные названия портов в уже написанном модуле и не переписывать при этом внутренности:</span></p> <p> </p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex9.jpg" border="0" alt="" /></p> <p><span style="font-size: medium;">А теперь давайте рассмотрим два оператора присваивания в примерах на Verilog. Сначала рассмотрим блочное присваивание:</span></p> <p> </p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex10.jpg" border="0" alt="" /></p> <p><span style="font-size: medium;">На рисунке 3 показано, какую схему мы получим в результате синтеза кода с применением блочного присваивания.</span></p> <p> </p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/sh3.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p align="center"><span style="font-size: medium;">Рисунок 3. Результат блочного присвоения</span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;">А теперь пример внеблочного присваивания:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex11.jpg" border="0" alt="" /></p> <p><span style="font-size: medium;"> На рисунке 4 показано, какую схему мы получим в результате синтеза кода с применением внеблочного присваивания.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/sh4.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p align="center"><span style="font-size: medium;">Рисунок 4. Результат внеблочного присвоения</span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;"> Порт – порты в Verilog бывают трёх типов:</span></p> <p><span style="font-size: medium;"> - ‘Input’ - входной;</span></p> <p><span style="font-size: medium;"> - ‘Output’ - выходной;</span></p> <p><span style="font-size: medium;"> - ‘Inout’ - двунаправленный.</span></p> <p><span style="font-size: medium;"> Список портов описывается в начале модуля см. пример 12.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex12.jpg" border="0" alt="" /></p> <p><span style="font-size: medium;"> Имена входных и выходных портов по умолчанию типа ‘wire’.</span></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"><strong> Цепи.</strong> Цепи на схеме соответствуют физическим проводам, которые подключаются ко всем компонентам схемы. Разрядность цепей по умолчанию — один бит. Цепи не хранят значения сигнала, и для того чтобы состояние сигнала в цепи было определено, какой-либо источник сигнала должен непрерывно управлять ею. Если цепь имеет несколько источников сигнала — драйверов (например, два выхода вентилей подключены к одной цепи), то значение результирующего сигнала в цепи имеет значение, согласно тому, какой тип цепи используется. Названия цепей и выполняемые ими функции приведены в таблице 1.</span></p> <p style="text-align: justify;"> </p> <p style="text-align: justify;"><span style="font-size: medium;">Таблица 1.</span></p> <table style="width: 646px; height: 826px;" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="102"> <p style="text-align: center;"><span style="font-size: medium;">Название</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Функция</span></p> </td> <td valign="top" width="423"> <p><span style="font-size: medium;">Описание</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">wire</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="423"> <p style="text-align: center;"><span style="font-size: medium;">Для этой цепи, если все драйверы имеют одно и то же значение, тогда wire принимает это же значение. Если все драйверы, кроме одного, имеют значение Z, тогда wire принимает значение того драйвера, который имеет значение выходного сигнала, не равное Z. Если два или больше не5Z драйвера имеют различную мощность выходного каскада, то wire принимает значение более сильного драйвера. Если два драйвера равной силы имеют различные значения, то wire принимает значение x.</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">wand</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">AND</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Проводное «И»</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">wand/triand</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">z</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> </tbody> </table> </div> <p align="center"><span style="font-size: medium;"> </span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">wor</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">OR</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Проводное «ИЛИ»</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">wand/triand</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">z</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> </tbody> </table> </div> <p align="center"><span style="font-size: medium;"> </span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">tri</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Цепь с третьим состоянием</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">triand</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri + AND</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Цепь с третьим состоянием, выполняющая проводное «И»</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">wand/triand</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">х</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">х</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">z</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;"> </span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">trior</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri + OR</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Цепь с третьим состоянием, выполняющая проводное «ИЛИ»</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">wand/triand</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">х</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">х</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td width="78"> <p align="center"><span style="font-size: medium;">z</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">x</span></p> </td> <td width="21"> <p align="center"><span style="font-size: medium;">z</span></p> </td> </tr> </tbody> </table> </div> <p align="center"><span style="font-size: medium;"> </span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">tri0</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri + pulldown</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Когда эта цепь не управляется, тогда ее значение — 0. Моделируется функция pulldown</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">tri1</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;">Tri + pullup</span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Когда эта цепь не управляется, тогда ее значение — 1. Моделируется функция pullup</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">trireg</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Цепь ведет себя как wire, за исключением того, что, когда все драйверы сети находятся в высоком импедансе — Z5состоянии, тогда цепь сохраняет свое последнее значение, которое было, когда эта цепь управлялась. trireg используются для того, чтобы моделировать емкость в данной цепи</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">supply0</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Моделируют цепи, которые связаны с «землей»</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p><span style="font-size: medium;">supply1</span></p> </td> <td valign="top" width="113"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="423"> <p align="center"><span style="font-size: medium;">Моделируют сети, которые связаны с питанием</span></p> </td> </tr> </tbody> </table> <p style="text-align: justify;"><span style="font-size: medium;"><br /></span></p> <p> </p> <p><span style="font-size: medium;">Цепь объявляется следующим образом:</span></p> <p style="text-align: center;"><span style="font-size: medium;"> <em>тип[разрядность] имя цепи ;</em></span></p> <p><span style="font-size: medium;"> Разрядность целесообразно указывать для векторов, а для одноразрядного провода указывается только тип и имя.</span></p> <p><span style="font-size: medium;"> Цепи типа trireg объявляются по следующим синтаксическим правилам:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/pravilo.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p> </p> <p><span style="font-size: medium;">charge_strength - емкость источника (для моделирования).</span></p> <p><span style="font-size: medium;">Емкость источника может принимать следующие значения: small, medium, large. По умолчанию используется medium.</span></p> <p><span style="font-size: medium;">Ниже приведены примеры объявления цепей:</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex13.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p> </p> <p><span style="font-size: medium;"> Далее рассмотрим типы из группы переменных.</span></p> <p><span style="font-size: medium;">Таблица 2</span></p> <table style="width: 638px;" border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td width="83"> <p align="center"><span style="font-size: medium;"><strong>Тип</strong></span></p> </td> <td width="555"> <p align="center"><span style="font-size: medium;"><strong>Описание</strong></span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">reg</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная без знака</span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">integer</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная со знаком, размерность в 32 разряда</span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">time</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная в 64 разряда без знака</span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">real</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная с плавающей точкой</span></p> </td> </tr> <tr> <td width="83"> <p><span style="font-size: medium;">realtime</span></p> </td> <td width="555"> <p><span style="font-size: medium;">переменная с плавающей точкой</span></p> </td> </tr> </tbody> </table> <p style="text-align: justify;"><span style="font-size: medium;"> Регистры в языке Verilog определяются по следующим синтаксическим правилам:</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/pravilo1.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Примеры объявления переменных на языке Verilog:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex14.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Для структуризации данных используется константа - parametr (параметр). Параметры не принадлежат к какому-либо регистру или группе цепей. Параметры не переменные, они — константы. Параметры могут быть как местные, локальные, так и глобальные. Синтаксис для объявлений параметров <parameter_declaration>:</span></p> <p> </p> <p><span style="font-size: medium;"><em><parameter_declaration></em></span></p> <p><span style="font-size: medium;"><em>::= parameter</em></span></p> <p><span style="font-size: medium;"><em><list_of_assignments>;</em></span></p> <p> </p> <p style="text-align: justify;"><span style="font-size: medium;">Примечание: в некоторых случаях при использовании параметров можно определять диапазон при объявлении параметра.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"><list_of_assignments> — список назначений, разделенный запятыми, где правая сторона назначения должна быть постоянным выражением, то есть выражением, содержащим только постоянные числа и предварительно определенные параметры. В следующем примере 16 показано объявление параметров.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_3/ex15.jpg" border="0" alt="" /></span></p> <p><span style="font-size: medium;"><br /></span></p> <p><span style="font-size: medium;"><br /></span></p></div>
Часть 4 Выражения в языке Verilog
2013-10-01T01:08:03+00:00 2013-10-01T01:08:03+00:00 http://portal-ed.ru/index.php/uchebnik-verilog/123-chast-4-vyrazheniya-v-yazyke-verilog EngineerDeveloper® [email protected]
<div class="feed-description"><h1><span style="font-size: medium;">4.1 Операнды в выражениях языка Verilog</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Этот раздел описывает операторы и операнды, доступные в Verilog HDL, а также как использовать их в формальных выражениях. Выражения представляют собой конструкции, которые комбинируют операнды с операторами для получения результата, который представляет собой функцию от значений операндов и семантического смысла операторов. Кроме того, выражением может быть любой разрешенный операнд – допустим, группа битов регистра. Существуют некоторые ограничения при написании константных выражений – константные выражения могут содержать только константы или предварительно определенные параметры, но могут содержать любые операторы, приведенные в табл. 4-1. При использовании в выражениях переменных типа integer и time, они воспринимаются, так же как и переменные типа reg.</span></p> <p style="text-align: justify;"><span style="font-size: medium;">В языке Verilog можно использовать операнды следующих типов:</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- числа (включающие и вещественные);</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- цепи;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- регистры, integer и time-переменные;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- одиночные биты цепи;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- одиночные биты регистров;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- группу битов цепи;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- группу битов регистра;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- элементы памяти (массива);</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- результат конкатенации;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- вызовы пользовательских или системных функций, возвращающих любое из</span></p> <p style="text-align: justify;"><span style="font-size: medium;">перечисленных выше значений.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <h1 style="text-align: justify;"><span style="font-size: medium;">4.2 Операторы языка Verilog</span></h1> <p style="text-align: justify;"><span style="font-size: medium;">Символы операторов Verilog HDL похожи на те, что используются в языке С.</span></p> <p style="text-align: justify;"><span style="font-size: medium;">Список операторов приведен в табл. 3.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;">Табл. 3 Список операторов Verilog HDL</span></p> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">Символ</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Назначение</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Использование с типом real</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">{}</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Конкатенация (concatenation)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">+ - * /</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Арифметические (arithmetic)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">%</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Модуль (modulus)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">> >= < <=</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Отношения (relational)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">!</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое отрицание (logical negation)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">&&</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое И (logical and)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">||</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое ИЛИ (logical or)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">==</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое равенство (logical equality)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">!=</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое неравенство (logical inequality)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">===</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Идентичность (case equality)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">!===</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Не идентичность (case inecuality)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">~</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовая инверсия (bit-wise negation)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">&</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовое И (bit-wise and)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">|</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовое ИЛИ (bit-wise or)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">^</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовое исключающее ИЛИ(bit-wise exclusive or, xor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">^~ ~^</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовая эквивалентность (bit-wise equivalence, xnor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">&</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное И (reduction and)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">~&</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное НЕ-И (reduction nand)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">|</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное ИЛИ (reduction or)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">~|</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное НЕ-ИЛИ (reduction nor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">^</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное исключающее ИЛИ (reduction xor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">~^ ^~</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное НЕ исключающее ИЛИ (reduction xnor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;"><< </span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Сдвиг влево (left shift)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">>> </span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Сдвиг вправо (right shift)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;"><<<2</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Циклический сдвиг влево (arithmetic left shift)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">>>> </span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Циклический сдвиг вправо (arithmetic right shift)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td style="text-align: justify;" valign="top" width="102"> <p align="center"><span style="font-size: medium;">?:</span></p> </td> <td style="text-align: justify;" valign="top" width="340"> <p align="center"><span style="font-size: medium;">Условный оператор (conditional)</span></p> </td> <td valign="top" width="196"> <p style="text-align: justify;" align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> </tbody> </table> <p> </p> <h1><span style="font-size: medium;">4.2.1. Приоритет бинарных операций</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Приоритет бинарных операций (а также оператора «?:») подчиняется тем же правилам, что и приоритет аналогичных операций в языке С. Verilog HDL содержит также несколько операций, не представленных в языке С. Ниже представлен список операторов Verilog, упорядоченных по их приоритету.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"><em><span style="text-decoration: underline;">Наивысший приоритет</span></em></span></p> <p style="text-align: justify;"><span style="font-size: medium;">+ - ! ~ (унарные)</span></p> <p style="text-align: justify;"><span style="font-size: medium;">* / %</span></p> <p style="text-align: justify;"><span style="font-size: medium;">+ - (бинарные)</span></p> <p style="text-align: justify;"><span style="font-size: medium;"><< >> <<< >>></span></p> <p style="text-align: justify;"><span style="font-size: medium;">< <= > >=</span></p> <p style="text-align: justify;"><span style="font-size: medium;">== != === !===</span></p> <p style="text-align: justify;"><span style="font-size: medium;">& ~&</span></p> <p style="text-align: justify;"><span style="font-size: medium;">^ ^~ ~^</span></p> <p style="text-align: justify;"><span style="font-size: medium;">| ~|</span></p> <p style="text-align: justify;"><span style="font-size: medium;">&&</span></p> <p style="text-align: justify;"><span style="font-size: medium;">||</span></p> <p style="text-align: justify;"><span style="font-size: medium;">?:</span></p> <p style="text-align: justify;"><span style="font-size: medium;"><em><span style="text-decoration: underline;">Нижайший приоритет</span></em></span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Операторы, находящиеся в одной строке имеют равный приоритет, строки упорядочены от наивысшего приоритета к наименьшему. Все операторы с равным приоритетом выполняются в порядке слева-направо, исключение составляет операторы «?:» которые выполняются справа-налево.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex16.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p style="text-align: justify;"><span style="font-size: medium;"> В этом примере значение «В» прибавляется к «А», затем «С» вычитается из результата. Когда операторы имеют различный приоритет, сначала выполняются операторы с наивысшим приоритетом, а затем с меньшим.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex17.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p style="text-align: justify;"> </p> <p style="text-align: justify;"><span style="font-size: medium;"> В этом примере значение «В» будет поделено на значение «С» и результат будет добавлен к «А». Приоритет выполнения операций может быть изменен с помощью круглых скобок.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex18.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Результат будет совершенно другой в отличие от предыдущего примера. Сначала будет вычислена сумма «А» и «В» и лишь затем результат будет поделен на значение «С».</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"> </p> <h1>4.2.2 Знаковые и беззнаковые числа в выражениях.</h1> <p style="text-align: justify;"> </p> <p><span style="font-size: medium;"> Операнды могут выражаться как безразмерные числа, или они могут иметь размер.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> В выражениях Verilog интерпретирует числа в виде sss’f nnn (размерные числа, sss – размер числа в битах) как без знаковые. Запись в такую переменную числа со знаком приведет к тому, что в выражении будет использовано не отрицательное число, а дополнительный код, представленный уже как целое положительное число (см. пример в п. 3.5). Еще один пример приведен ниже, он показывает, что аналогичная ситуация может возникнуть и в случае использования переменной типа <strong>integer</strong>.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex19.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p><span style="font-size: medium;"> Не будем забывать, что по умолчанию целое число имеет 32 разряда.</span></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.3 Арифметические операции</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> К бинарным арифметическим операциям относятся: «+», «-», «*», «/», «%». Операция деления отсекает от целого числа дробную часть. Для получения остатка используется операция %. Эта операция воспринимает знак первого операнда. В следующих примерах представлены различные результаты этой операции.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex20.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p> </p> <p style="text-align: justify;"><span style="font-size: medium;"> Унарные арифметические операции (+, -) имеют приоритет перед бинарными. Если один из операндов в арифметических операциях имеет неопределенное значение, то и результат операции будет не определён (х).</span></p> <h1><span style="font-size: medium;">4.2.4 Операции отношения</span></h1> <p><span style="font-size: medium;"> Следующие примеры иллюстрируют операторы отношения:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex21.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Все эти выражения возвращают лог.0 если приведенное отношение ложно (false) или лог.1 если отношение истинно (true). Если один из операндов имеет неопределенное значение, то и результат будет не определен. Все операторы отношения имеют одинаковый приоритет и более низкий, чем приоритет арифметических операторов. Следующий пример иллюстрирует смысл этого правила:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex22.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Заметим, что в конструкции size – (1 < a) операция отношения вычисляется первой, а затем результат (0 или 1) вычитается из переменной size. В следующем же выражении сначала size уменьшается на 1, а затем результат сравнивается с а.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <h1 style="text-align: justify;"><span style="font-size: medium;">4.2.5 Операторы сравнения</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Операторы сравнения имеют более низкий приоритет, чем операторы сравнения. В следующем примере иллюстрируются операторы сравнения.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex23_.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Все четыре оператора имеют одинаковый приоритет. Они сравнивают операнды бит в бит, заполнением нулями, в случае если операнды имеют различную разрядность. Так же как и операторы отношения, они возвращают 0 если false и 1 если true. Если хотя бы один операнд содержит «x» или «z», то операции «==» и «!=» возвращают неопределенное значение. Операции «===» и «!==» сравнивают операнды с учетом x и z, поэтому всегда возвращают либо 0, либо 1.</span></p> <p><span style="font-size: medium;">________________________________________________________________________</span></p> <p><span style="font-size: medium;"><strong><em>Замечание:</em></strong></span></p> <p><span style="font-size: medium;"><em>Некоторые системы синтеза могут выдавать ошибку на операции «===» и «!==».</em></span></p> <p><span style="font-size: medium;"><em>________________________________________________________________________</em></span></p> <p><span style="font-size: medium;"><em> </em></span></p> <h1><span style="font-size: medium;">4.2.6 Логические операции</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Операторы логического «И» (&&) и логического «ИЛИ» (||) тесно связаны между собой. Результат логического сравнения может принимать значение «истинно» (true, 1) или «ложно» (false, 0), или если один из операндов имеет неопределенное значение, то и результат будет не определён. Допустим, один из операндов имеет значение равное 10, а второй равен нулю. Результат логического «И» будет равен 0, так как второй операнд равен нулю. Результат логического «ИЛИ», однако будет равен 1, так как первый операнд отличен от нуля. Verilog HDL воспринимает операнд равный 0 как «ложный», в то же время если операнд не равен нулю (не обязательно равен 1, например 10), то он воспринимается как «истинный». Именно это и произошло в приведенном примере: операция (true && false) привела к результату false, а операция (true || false) привела к результату true.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Приоритет операции «&&» больше чем приоритет «||», но оба они меньше, чем приоритет операций отношения и сравнения. Рассмотрим следующий пример:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">24 a < size – 1 && b != c && index != lastone.</span></em></p> <p align="center"><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;"> Три субвыражения объединены по логическому «И» без использования круглых скобок. Хотя такая конструкция вполне допустима, применять ее не следует из-за ухудшения читабельности кода. Следующий пример читается гораздо легче:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">(a < size – 1) && (b != c) && (index != lastone)</span></em></p> <p align="center"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Третьим логическим оператором является унарный оператор логического отрицания! Оператор логического отрицания преобразует ненулевое («истинное») значение в 0 («ложно»), а нулевое («ложное») в 1(«истинно»). Неопределенное значение приведет к неопределенному результату. Наиболее часто этот оператор используется в следующей конструкции: if (!inword) эта запись эквивалентна записи if (inword == 0).</span></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.7 Побитовые логические операции</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Побитовые операции выполняют манипуляции с операндами бит в бит, т.е. например 0-й бит первого операнда взаимодействует с 0-м битом второго; 1-й бит с 1-м и т.д. Если один из операндов имеет меньшую разрядность, то недостающие биты заполняются нулями. В следующих таблицах представлены результаты побитовых операций – значения результирующих битов в зависимости от битов операндов.</span></p> <p><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;">Таблица 4. Побитовое отрицание (~ - унарная операция)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">X</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;">Табл. 5. Побитовое И (&)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;">Табл. 6. Побитовое ИЛИ (|)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;">Табл. 7. Побитовое исключающее ИЛИ (^)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> 0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;">Табл. 8. Побитовое исключающее НЕ ИЛИ (~^ ^~)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: justify;"><span style="font-size: medium;"> Следует обратить внимание, что операторы & и &&; | и || различаются принципиально. Операторы && и || обычно используются в конструкциях с условиями (if, например), а & и | для маскирования отдельных битов переменной.</span></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.8 Операторы редукции</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Все операторы редукции являются унарными, и результатом всех операций является одноразрядное значение – 0, 1 или х. Алгоритм работы всех операторов следующий: на первом шаге вычисляется значение результата операции между 0-м и 1-м битом операнда, на следующем шаге вычисляется результат между предыдущим результатом и 2-м битом операнда и т.д. пока не будет вычислен результат по всем битам. На каждом шаге результат определяется по таблицам истинности 4 – 8. Необходимо заметить, что унарные операторы редукции NAND и NOR вычисляются точно также как операторы AND и OR, а полученный результат инвертируется. В таблице 9 приведены результаты унарных операций &, |, ~& и ~| различных комбинаций битов операнда. В таблице 10 приведены результаты операций ^ и ~^.</span></p> <p><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;">Таблица 9. Результаты унарных операций &, |, ~& и ~|</span></p> <p><span style="font-size: medium;"> </span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="174"> <p><span style="font-size: medium;">Разряды операнда</span></p> </td> <td valign="top" width="58"> <p><span style="font-size: medium;">&</span></p> </td> <td valign="top" width="49"> <p><span style="font-size: medium;">|</span></p> </td> <td valign="top" width="66"> <p align="center"><span style="font-size: medium;">~&</span></p> </td> <td valign="top" width="76"> <p align="center"><span style="font-size: medium;">~|</span></p> </td> </tr> <tr> <td valign="top" width="174"> <p><span style="font-size: medium;">Все в лог.0</span></p> </td> <td valign="top" width="58"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="49"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="66"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="76"> <p><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td valign="top" width="174"> <p><span style="font-size: medium;">Все в лог.1</span></p> </td> <td valign="top" width="58"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="49"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="66"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="76"> <p><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td valign="top" width="174"> <p align="center"><span style="font-size: medium;">Часть в лог.0, часть в</span></p> <p align="center"><span style="font-size: medium;">лог.1</span></p> </td> <td valign="top" width="58"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="49"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="66"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="76"> <p><span style="font-size: medium;">0</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;">Таблица 10. Результаты унарных операций ^ и ~^</span></p> <p><span style="font-size: medium;"> </span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td> <p align="center"><span style="font-size: medium;">Разряды операнда</span></p> </td> <td> <p align="center"><span style="font-size: medium;">^</span></p> </td> <td> <p align="center"><span style="font-size: medium;">~^</span></p> </td> </tr> <tr> <td> <p align="center"><span style="font-size: medium;">Нечетное число бит в</span></p> <p align="center"><span style="font-size: medium;">лог.1</span></p> </td> <td> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td> <p align="center"><span style="font-size: medium;">Четное число бит в</span></p> <p align="center"><span style="font-size: medium;">лог.1 (или ни одного)</span></p> </td> <td> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.9 Синтаксические ограничения</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> В языке Verilog накладываются два ограничения для того чтобы защитить файлы описания от типографской ошибки, которые крайне тяжелы для обнаружения. Ошибка заключается в вставке ошибочного пробела. В следующем примере первая строка не соответствует второй:</span></p> <p><span style="font-size: medium;"> </span></p> <p><em><span style="font-size: medium;">1. a & &b; a | |b;</span></em></p> <p><em><span style="font-size: medium;">2. a && b; a || b;</span></em></p> <p><em><span style="font-size: medium;"> </span></em></p> <p style="text-align: justify;"><span style="font-size: medium;"> В первой строке введен дополнительный символ пробела между символами & и |. Это может быть замысел разработчика, а может ошибочный ввод пробела. Для того, чтобы предотвратить подобную неоднозначность Verilog требует разделить бинарную и унарную операцию круглыми скобками. В силу этого требования первая строка примера является ошибочной. Поэтому правильно надо записывать так:</span></p> <p><span style="font-size: medium;"> </span></p> <p><em><span style="font-size: medium;">a & (&b); a | (|b);</span></em></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.10 Операторы сдвига</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> К операторам сдвига относятся операторы <<, >>, <<< и >>>. Первые два оператора выполняют простой сдвиг влево или вправо на количество позиций указанных операндом в правой части выражения, два других выполняют циклический или иначе арифметический сдвиг. В следующем примере иллюстрируется механизм действия этих операторов.</span></p> <p><span style="font-size: medium;"><strong> Выражение Результат</strong></span></p> <p align="center"><span style="font-size: medium;"> 8’b01001111 << 3 8’b01111000</span></p> <p align="center"><span style="font-size: medium;"> 8’b01001111 <<< 3 8’b01111010</span></p> <p align="center"><span style="font-size: medium;"> 8’b01001111 >> 3 8’b00001001</span></p> <p align="center"><span style="font-size: medium;"> 8’b01001111 >>> 3 8’b11101001</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Простые операторы сдвига заполняют освободившиеся позиции нулевыми значениями, циклические операторы сдвига выполняют сдвиг «по кольцу».</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.11 Условный оператор</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Условный оператор имеет три операнда, разделенные двумя операторами в следующем формате:</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">cond_expr ? true_expr : false_expr;</span></em></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Если условие (cond_expr) вычисляется как «ложное» (false), то в качестве результата будет использовано выражение false_expr. Если условие «истинно» (true), то будет использовано выражение true_expr. В случае если условие неопределенно, то оба выражения false_expr и true_expr сравниваются бит в бит, по правилам указанным в табл. 11, для того, чтобы вычислить окончательный результат. Если разрядность операндов различна, то наименьший из двух приводится к разрядности большего, при этом недостающие биты добавляются слева и заполняются нулями.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;">Таблице 11. Результат неопределенного условия</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>?:</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"><strong> 0</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"><strong> 1</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"><strong> x</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"><strong> z</strong></span></p> </td> </tr> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>0</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> 0</span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>1</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>x </strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>z </strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Следующий пример иллюстрирует типичное применение условного оператора для реализации шины с тремя состояниями:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">wire [15:0] busa = drive_busa ? data : 16’bz;</span></em></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Если drive_busa равен лог.1 то на шине busa устанавливается значение data. Если drive_busa неизвестен, то неизвестное значение устанавливается и на шине busa. В случае если drive_busa находится в состоянии лог.0, то шина busa находится в состоянии высокого импеданса.</span></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.12 Конкатенация</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Операция конкатенации является одной из наиболее удобных и мощных операций в языке Verilog. Суть ее заключается в слиянии нескольких переменных в единое целое, единую переменную, с которой можно производить любые другие операции. Необходимо отметить два момента: операция конкатенации обладает наивысшим приоритетом по сравнению с любой другой операцией вне символов конкатенации ({}), но операции заключенные внутри фигурных скобок имеют еще больший приоритет (Операции внутри фигурных скобок это недокументированное свойство языка, главное в этом случае, чтобы в результате внутренней операции результат получил определенную разрядность). Вторым моментом является тот факт, что операция конкатенации недопустима с вещественными числами.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Синтаксис операции приведен ниже:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">{<expr_1>, <expr_2>, … <expr_n>};</span></em></p> <p align="center"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Операция может содержать несколько повторяющихся элементов, для сокращения записи используется множитель, который указывает сколько раз повторяется данный элемент:</span></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: center;" align="center"><em><span style="font-size: medium;">{4{w}} эквивалентно {w, w, w, w}</span></em></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Множитель может быть целой, неотрицательной константой или константным выражением.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Также в операции могут использоваться внутренние объединения:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">{{a, b, c}, {3{d, e}}} эквивалентно {a, b, c, d, e, d, e, d, e}</span></em></p> <p align="center"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Результат операции слияния может использоваться в любом случае в качестве операндов или в качестве вектора (переменной) которой присваивается значение. Это широко используется для случаев, когда функция должна вернуть несколько значений.</span></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p></div>
<div class="feed-description"><h1><span style="font-size: medium;">4.1 Операнды в выражениях языка Verilog</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Этот раздел описывает операторы и операнды, доступные в Verilog HDL, а также как использовать их в формальных выражениях. Выражения представляют собой конструкции, которые комбинируют операнды с операторами для получения результата, который представляет собой функцию от значений операндов и семантического смысла операторов. Кроме того, выражением может быть любой разрешенный операнд – допустим, группа битов регистра. Существуют некоторые ограничения при написании константных выражений – константные выражения могут содержать только константы или предварительно определенные параметры, но могут содержать любые операторы, приведенные в табл. 4-1. При использовании в выражениях переменных типа integer и time, они воспринимаются, так же как и переменные типа reg.</span></p> <p style="text-align: justify;"><span style="font-size: medium;">В языке Verilog можно использовать операнды следующих типов:</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- числа (включающие и вещественные);</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- цепи;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- регистры, integer и time-переменные;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- одиночные биты цепи;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- одиночные биты регистров;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- группу битов цепи;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- группу битов регистра;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- элементы памяти (массива);</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- результат конкатенации;</span></p> <p style="text-align: justify;"><span style="font-size: medium;">- вызовы пользовательских или системных функций, возвращающих любое из</span></p> <p style="text-align: justify;"><span style="font-size: medium;">перечисленных выше значений.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <h1 style="text-align: justify;"><span style="font-size: medium;">4.2 Операторы языка Verilog</span></h1> <p style="text-align: justify;"><span style="font-size: medium;">Символы операторов Verilog HDL похожи на те, что используются в языке С.</span></p> <p style="text-align: justify;"><span style="font-size: medium;">Список операторов приведен в табл. 3.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;">Табл. 3 Список операторов Verilog HDL</span></p> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">Символ</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Назначение</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Использование с типом real</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">{}</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Конкатенация (concatenation)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">+ - * /</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Арифметические (arithmetic)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">%</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Модуль (modulus)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">> >= < <=</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Отношения (relational)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">!</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое отрицание (logical negation)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">&&</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое И (logical and)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">||</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое ИЛИ (logical or)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">==</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое равенство (logical equality)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">!=</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Логическое неравенство (logical inequality)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">===</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Идентичность (case equality)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">!===</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Не идентичность (case inecuality)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">~</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовая инверсия (bit-wise negation)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">&</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовое И (bit-wise and)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">|</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовое ИЛИ (bit-wise or)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">^</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовое исключающее ИЛИ(bit-wise exclusive or, xor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">^~ ~^</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Побитовая эквивалентность (bit-wise equivalence, xnor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">&</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное И (reduction and)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">~&</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное НЕ-И (reduction nand)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">|</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное ИЛИ (reduction or)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">~|</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное НЕ-ИЛИ (reduction nor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">^</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное исключающее ИЛИ (reduction xor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">~^ ^~</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Редукционное НЕ исключающее ИЛИ (reduction xnor)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;"><< </span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Сдвиг влево (left shift)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">>> </span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Сдвиг вправо (right shift)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;"><<<2</span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Циклический сдвиг влево (arithmetic left shift)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td valign="top" width="102"> <p align="center"><span style="font-size: medium;">>>> </span></p> </td> <td valign="top" width="340"> <p align="center"><span style="font-size: medium;">Циклический сдвиг вправо (arithmetic right shift)</span></p> </td> <td valign="top" width="196"> <p align="center"><span style="font-size: medium;">Не допустимо</span></p> </td> </tr> <tr> <td style="text-align: justify;" valign="top" width="102"> <p align="center"><span style="font-size: medium;">?:</span></p> </td> <td style="text-align: justify;" valign="top" width="340"> <p align="center"><span style="font-size: medium;">Условный оператор (conditional)</span></p> </td> <td valign="top" width="196"> <p style="text-align: justify;" align="center"><span style="font-size: medium;">Допустимо</span></p> </td> </tr> </tbody> </table> <p> </p> <h1><span style="font-size: medium;">4.2.1. Приоритет бинарных операций</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Приоритет бинарных операций (а также оператора «?:») подчиняется тем же правилам, что и приоритет аналогичных операций в языке С. Verilog HDL содержит также несколько операций, не представленных в языке С. Ниже представлен список операторов Verilog, упорядоченных по их приоритету.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"><em><span style="text-decoration: underline;">Наивысший приоритет</span></em></span></p> <p style="text-align: justify;"><span style="font-size: medium;">+ - ! ~ (унарные)</span></p> <p style="text-align: justify;"><span style="font-size: medium;">* / %</span></p> <p style="text-align: justify;"><span style="font-size: medium;">+ - (бинарные)</span></p> <p style="text-align: justify;"><span style="font-size: medium;"><< >> <<< >>></span></p> <p style="text-align: justify;"><span style="font-size: medium;">< <= > >=</span></p> <p style="text-align: justify;"><span style="font-size: medium;">== != === !===</span></p> <p style="text-align: justify;"><span style="font-size: medium;">& ~&</span></p> <p style="text-align: justify;"><span style="font-size: medium;">^ ^~ ~^</span></p> <p style="text-align: justify;"><span style="font-size: medium;">| ~|</span></p> <p style="text-align: justify;"><span style="font-size: medium;">&&</span></p> <p style="text-align: justify;"><span style="font-size: medium;">||</span></p> <p style="text-align: justify;"><span style="font-size: medium;">?:</span></p> <p style="text-align: justify;"><span style="font-size: medium;"><em><span style="text-decoration: underline;">Нижайший приоритет</span></em></span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Операторы, находящиеся в одной строке имеют равный приоритет, строки упорядочены от наивысшего приоритета к наименьшему. Все операторы с равным приоритетом выполняются в порядке слева-направо, исключение составляет операторы «?:» которые выполняются справа-налево.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex16.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p style="text-align: justify;"><span style="font-size: medium;"> В этом примере значение «В» прибавляется к «А», затем «С» вычитается из результата. Когда операторы имеют различный приоритет, сначала выполняются операторы с наивысшим приоритетом, а затем с меньшим.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex17.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p style="text-align: justify;"> </p> <p style="text-align: justify;"><span style="font-size: medium;"> В этом примере значение «В» будет поделено на значение «С» и результат будет добавлен к «А». Приоритет выполнения операций может быть изменен с помощью круглых скобок.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex18.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Результат будет совершенно другой в отличие от предыдущего примера. Сначала будет вычислена сумма «А» и «В» и лишь затем результат будет поделен на значение «С».</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"> </p> <h1>4.2.2 Знаковые и беззнаковые числа в выражениях.</h1> <p style="text-align: justify;"> </p> <p><span style="font-size: medium;"> Операнды могут выражаться как безразмерные числа, или они могут иметь размер.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> В выражениях Verilog интерпретирует числа в виде sss’f nnn (размерные числа, sss – размер числа в битах) как без знаковые. Запись в такую переменную числа со знаком приведет к тому, что в выражении будет использовано не отрицательное число, а дополнительный код, представленный уже как целое положительное число (см. пример в п. 3.5). Еще один пример приведен ниже, он показывает, что аналогичная ситуация может возникнуть и в случае использования переменной типа <strong>integer</strong>.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex19.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p><span style="font-size: medium;"> Не будем забывать, что по умолчанию целое число имеет 32 разряда.</span></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.3 Арифметические операции</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> К бинарным арифметическим операциям относятся: «+», «-», «*», «/», «%». Операция деления отсекает от целого числа дробную часть. Для получения остатка используется операция %. Эта операция воспринимает знак первого операнда. В следующих примерах представлены различные результаты этой операции.</span></p> <p><span style="font-size: medium;"><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex20.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></span></p> <p> </p> <p style="text-align: justify;"><span style="font-size: medium;"> Унарные арифметические операции (+, -) имеют приоритет перед бинарными. Если один из операндов в арифметических операциях имеет неопределенное значение, то и результат операции будет не определён (х).</span></p> <h1><span style="font-size: medium;">4.2.4 Операции отношения</span></h1> <p><span style="font-size: medium;"> Следующие примеры иллюстрируют операторы отношения:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex21.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Все эти выражения возвращают лог.0 если приведенное отношение ложно (false) или лог.1 если отношение истинно (true). Если один из операндов имеет неопределенное значение, то и результат будет не определен. Все операторы отношения имеют одинаковый приоритет и более низкий, чем приоритет арифметических операторов. Следующий пример иллюстрирует смысл этого правила:</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex22.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Заметим, что в конструкции size – (1 < a) операция отношения вычисляется первой, а затем результат (0 или 1) вычитается из переменной size. В следующем же выражении сначала size уменьшается на 1, а затем результат сравнивается с а.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <h1 style="text-align: justify;"><span style="font-size: medium;">4.2.5 Операторы сравнения</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Операторы сравнения имеют более низкий приоритет, чем операторы сравнения. В следующем примере иллюстрируются операторы сравнения.</span></p> <p><img src="images/statyi/FPGA/Uchebnik_Verilog/Chast_4/ex23_.jpg" border="0" alt="" style="display: block; margin-left: auto; margin-right: auto;" /></p> <p style="text-align: justify;"><span style="font-size: medium;"> Все четыре оператора имеют одинаковый приоритет. Они сравнивают операнды бит в бит, заполнением нулями, в случае если операнды имеют различную разрядность. Так же как и операторы отношения, они возвращают 0 если false и 1 если true. Если хотя бы один операнд содержит «x» или «z», то операции «==» и «!=» возвращают неопределенное значение. Операции «===» и «!==» сравнивают операнды с учетом x и z, поэтому всегда возвращают либо 0, либо 1.</span></p> <p><span style="font-size: medium;">________________________________________________________________________</span></p> <p><span style="font-size: medium;"><strong><em>Замечание:</em></strong></span></p> <p><span style="font-size: medium;"><em>Некоторые системы синтеза могут выдавать ошибку на операции «===» и «!==».</em></span></p> <p><span style="font-size: medium;"><em>________________________________________________________________________</em></span></p> <p><span style="font-size: medium;"><em> </em></span></p> <h1><span style="font-size: medium;">4.2.6 Логические операции</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Операторы логического «И» (&&) и логического «ИЛИ» (||) тесно связаны между собой. Результат логического сравнения может принимать значение «истинно» (true, 1) или «ложно» (false, 0), или если один из операндов имеет неопределенное значение, то и результат будет не определён. Допустим, один из операндов имеет значение равное 10, а второй равен нулю. Результат логического «И» будет равен 0, так как второй операнд равен нулю. Результат логического «ИЛИ», однако будет равен 1, так как первый операнд отличен от нуля. Verilog HDL воспринимает операнд равный 0 как «ложный», в то же время если операнд не равен нулю (не обязательно равен 1, например 10), то он воспринимается как «истинный». Именно это и произошло в приведенном примере: операция (true && false) привела к результату false, а операция (true || false) привела к результату true.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Приоритет операции «&&» больше чем приоритет «||», но оба они меньше, чем приоритет операций отношения и сравнения. Рассмотрим следующий пример:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">24 a < size – 1 && b != c && index != lastone.</span></em></p> <p align="center"><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;"> Три субвыражения объединены по логическому «И» без использования круглых скобок. Хотя такая конструкция вполне допустима, применять ее не следует из-за ухудшения читабельности кода. Следующий пример читается гораздо легче:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">(a < size – 1) && (b != c) && (index != lastone)</span></em></p> <p align="center"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Третьим логическим оператором является унарный оператор логического отрицания! Оператор логического отрицания преобразует ненулевое («истинное») значение в 0 («ложно»), а нулевое («ложное») в 1(«истинно»). Неопределенное значение приведет к неопределенному результату. Наиболее часто этот оператор используется в следующей конструкции: if (!inword) эта запись эквивалентна записи if (inword == 0).</span></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.7 Побитовые логические операции</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Побитовые операции выполняют манипуляции с операндами бит в бит, т.е. например 0-й бит первого операнда взаимодействует с 0-м битом второго; 1-й бит с 1-м и т.д. Если один из операндов имеет меньшую разрядность, то недостающие биты заполняются нулями. В следующих таблицах представлены результаты побитовых операций – значения результирующих битов в зависимости от битов операндов.</span></p> <p><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;">Таблица 4. Побитовое отрицание (~ - унарная операция)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">X</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;">Табл. 5. Побитовое И (&)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;">Табл. 6. Побитовое ИЛИ (|)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;">Табл. 7. Побитовое исключающее ИЛИ (^)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> 0</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="26"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top" width="28"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;">Табл. 8. Побитовое исключающее НЕ ИЛИ (~^ ^~)</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;"> </span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> 1</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top" width="36"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top" width="38"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p style="text-align: justify;"><span style="font-size: medium;"> Следует обратить внимание, что операторы & и &&; | и || различаются принципиально. Операторы && и || обычно используются в конструкциях с условиями (if, например), а & и | для маскирования отдельных битов переменной.</span></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.8 Операторы редукции</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Все операторы редукции являются унарными, и результатом всех операций является одноразрядное значение – 0, 1 или х. Алгоритм работы всех операторов следующий: на первом шаге вычисляется значение результата операции между 0-м и 1-м битом операнда, на следующем шаге вычисляется результат между предыдущим результатом и 2-м битом операнда и т.д. пока не будет вычислен результат по всем битам. На каждом шаге результат определяется по таблицам истинности 4 – 8. Необходимо заметить, что унарные операторы редукции NAND и NOR вычисляются точно также как операторы AND и OR, а полученный результат инвертируется. В таблице 9 приведены результаты унарных операций &, |, ~& и ~| различных комбинаций битов операнда. В таблице 10 приведены результаты операций ^ и ~^.</span></p> <p><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;">Таблица 9. Результаты унарных операций &, |, ~& и ~|</span></p> <p><span style="font-size: medium;"> </span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top" width="174"> <p><span style="font-size: medium;">Разряды операнда</span></p> </td> <td valign="top" width="58"> <p><span style="font-size: medium;">&</span></p> </td> <td valign="top" width="49"> <p><span style="font-size: medium;">|</span></p> </td> <td valign="top" width="66"> <p align="center"><span style="font-size: medium;">~&</span></p> </td> <td valign="top" width="76"> <p align="center"><span style="font-size: medium;">~|</span></p> </td> </tr> <tr> <td valign="top" width="174"> <p><span style="font-size: medium;">Все в лог.0</span></p> </td> <td valign="top" width="58"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="49"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="66"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="76"> <p><span style="font-size: medium;">1</span></p> </td> </tr> <tr> <td valign="top" width="174"> <p><span style="font-size: medium;">Все в лог.1</span></p> </td> <td valign="top" width="58"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="49"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="66"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="76"> <p><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td valign="top" width="174"> <p align="center"><span style="font-size: medium;">Часть в лог.0, часть в</span></p> <p align="center"><span style="font-size: medium;">лог.1</span></p> </td> <td valign="top" width="58"> <p><span style="font-size: medium;">0</span></p> </td> <td valign="top" width="49"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="66"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top" width="76"> <p><span style="font-size: medium;">0</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;">Таблица 10. Результаты унарных операций ^ и ~^</span></p> <p><span style="font-size: medium;"> </span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td> <p align="center"><span style="font-size: medium;">Разряды операнда</span></p> </td> <td> <p align="center"><span style="font-size: medium;">^</span></p> </td> <td> <p align="center"><span style="font-size: medium;">~^</span></p> </td> </tr> <tr> <td> <p align="center"><span style="font-size: medium;">Нечетное число бит в</span></p> <p align="center"><span style="font-size: medium;">лог.1</span></p> </td> <td> <p align="center"><span style="font-size: medium;">1</span></p> </td> <td> <p align="center"><span style="font-size: medium;">0</span></p> </td> </tr> <tr> <td> <p align="center"><span style="font-size: medium;">Четное число бит в</span></p> <p align="center"><span style="font-size: medium;">лог.1 (или ни одного)</span></p> </td> <td> <p align="center"><span style="font-size: medium;">0</span></p> </td> <td> <p align="center"><span style="font-size: medium;">1</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.9 Синтаксические ограничения</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> В языке Verilog накладываются два ограничения для того чтобы защитить файлы описания от типографской ошибки, которые крайне тяжелы для обнаружения. Ошибка заключается в вставке ошибочного пробела. В следующем примере первая строка не соответствует второй:</span></p> <p><span style="font-size: medium;"> </span></p> <p><em><span style="font-size: medium;">1. a & &b; a | |b;</span></em></p> <p><em><span style="font-size: medium;">2. a && b; a || b;</span></em></p> <p><em><span style="font-size: medium;"> </span></em></p> <p style="text-align: justify;"><span style="font-size: medium;"> В первой строке введен дополнительный символ пробела между символами & и |. Это может быть замысел разработчика, а может ошибочный ввод пробела. Для того, чтобы предотвратить подобную неоднозначность Verilog требует разделить бинарную и унарную операцию круглыми скобками. В силу этого требования первая строка примера является ошибочной. Поэтому правильно надо записывать так:</span></p> <p><span style="font-size: medium;"> </span></p> <p><em><span style="font-size: medium;">a & (&b); a | (|b);</span></em></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.10 Операторы сдвига</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> К операторам сдвига относятся операторы <<, >>, <<< и >>>. Первые два оператора выполняют простой сдвиг влево или вправо на количество позиций указанных операндом в правой части выражения, два других выполняют циклический или иначе арифметический сдвиг. В следующем примере иллюстрируется механизм действия этих операторов.</span></p> <p><span style="font-size: medium;"><strong> Выражение Результат</strong></span></p> <p align="center"><span style="font-size: medium;"> 8’b01001111 << 3 8’b01111000</span></p> <p align="center"><span style="font-size: medium;"> 8’b01001111 <<< 3 8’b01111010</span></p> <p align="center"><span style="font-size: medium;"> 8’b01001111 >> 3 8’b00001001</span></p> <p align="center"><span style="font-size: medium;"> 8’b01001111 >>> 3 8’b11101001</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Простые операторы сдвига заполняют освободившиеся позиции нулевыми значениями, циклические операторы сдвига выполняют сдвиг «по кольцу».</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.11 Условный оператор</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Условный оператор имеет три операнда, разделенные двумя операторами в следующем формате:</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">cond_expr ? true_expr : false_expr;</span></em></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Если условие (cond_expr) вычисляется как «ложное» (false), то в качестве результата будет использовано выражение false_expr. Если условие «истинно» (true), то будет использовано выражение true_expr. В случае если условие неопределенно, то оба выражения false_expr и true_expr сравниваются бит в бит, по правилам указанным в табл. 11, для того, чтобы вычислить окончательный результат. Если разрядность операндов различна, то наименьший из двух приводится к разрядности большего, при этом недостающие биты добавляются слева и заполняются нулями.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p> <p><span style="font-size: medium;">Таблице 11. Результат неопределенного условия</span></p> <div align="center"> <table border="1" cellspacing="0" cellpadding="0"> <tbody> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>?:</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"><strong> 0</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"><strong> 1</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"><strong> x</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"><strong> z</strong></span></p> </td> </tr> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>0</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> 0</span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>1</strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;">1</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>x </strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> <tr> <td valign="top"> <p><span style="font-size: medium;"><strong>z </strong></span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;">x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> <td valign="top"> <p><span style="font-size: medium;"> x</span></p> </td> </tr> </tbody> </table> </div> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Следующий пример иллюстрирует типичное применение условного оператора для реализации шины с тремя состояниями:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">wire [15:0] busa = drive_busa ? data : 16’bz;</span></em></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Если drive_busa равен лог.1 то на шине busa устанавливается значение data. Если drive_busa неизвестен, то неизвестное значение устанавливается и на шине busa. В случае если drive_busa находится в состоянии лог.0, то шина busa находится в состоянии высокого импеданса.</span></p> <p><span style="font-size: medium;"> </span></p> <h1><span style="font-size: medium;">4.2.12 Конкатенация</span></h1> <p style="text-align: justify;"><span style="font-size: medium;"> Операция конкатенации является одной из наиболее удобных и мощных операций в языке Verilog. Суть ее заключается в слиянии нескольких переменных в единое целое, единую переменную, с которой можно производить любые другие операции. Необходимо отметить два момента: операция конкатенации обладает наивысшим приоритетом по сравнению с любой другой операцией вне символов конкатенации ({}), но операции заключенные внутри фигурных скобок имеют еще больший приоритет (Операции внутри фигурных скобок это недокументированное свойство языка, главное в этом случае, чтобы в результате внутренней операции результат получил определенную разрядность). Вторым моментом является тот факт, что операция конкатенации недопустима с вещественными числами.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Синтаксис операции приведен ниже:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">{<expr_1>, <expr_2>, … <expr_n>};</span></em></p> <p align="center"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Операция может содержать несколько повторяющихся элементов, для сокращения записи используется множитель, который указывает сколько раз повторяется данный элемент:</span></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: center;" align="center"><em><span style="font-size: medium;">{4{w}} эквивалентно {w, w, w, w}</span></em></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Множитель может быть целой, неотрицательной константой или константным выражением.</span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Также в операции могут использоваться внутренние объединения:</span></p> <p><span style="font-size: medium;"> </span></p> <p align="center"><em><span style="font-size: medium;">{{a, b, c}, {3{d, e}}} эквивалентно {a, b, c, d, e, d, e, d, e}</span></em></p> <p align="center"><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> Результат операции слияния может использоваться в любом случае в качестве операндов или в качестве вектора (переменной) которой присваивается значение. Это широко используется для случаев, когда функция должна вернуть несколько значений.</span></p> <p><span style="font-size: medium;"> </span></p> <p style="text-align: justify;"><span style="font-size: medium;"> </span></p></div>