2.3. Данные, выражения и их интерпретация в цифровом устройстве
Состояние линий связи в цифровых схемах, равно как и состояние элементов схемы отражается в VHDL-программах данными категорий SIGNAL и VARIABLE. Назовем данные «одиночными», если состоянию каждой линии присваивается индивидуальное имя, а «групповыми», если несколько линий рассматриваются как единый объект и имеют общее имя. При моделировании цифрового устройства, не содержащего монтажной логики [2], [6], элементов с тремя состояниями и без учета переходных состояний и сбойных ситуаций достаточно положить, что сигналы могут принимать два значения – логический ноль и логическую единицу. Тогда удобно в описании отнести одиночные данные либо к типу BOOLEAN, либо к типу BIT. Принципиальной разницы в использовании этих типов нет – для обоих типов определены одинаковые логические операции, которые отражаются при синтезе такими же компонентами. Например, замена в листинге 1. 1 типов данных на BOOLEAN или BIT не изменит результатов синтеза. Обычно тип BOOLEAN используется как средство записи обобщенных условий исполнения операторов (операции сравнения дают результат BOOLEAN ), а BIT – для представления фактических значений уровней, хотя это, в общем-то, это дело вкуса. Отметим, что, несмотря на общность допустимых операций, смысла и аппаратной интерпретации преобразований данных типов BOOLEAN и BIT, данные разных типов несовместимы в одной операции. Например, если x1 и x2 относятся к типу BOOLEAN, а y1 и y2 к типу BIT, то выражение (x1 AND y1) OR (x2 AND NOT y2) недопустимо. Можно записать так (x1 AND (y1 = '1')) OR (x2 AND (y2 = '0')), причем результат будет булевского типа. Параллельные операторы присваивания, а также последовательные присваивания, записанные в теле процессов, список чувствительности которых содержит все аргументы такого оператора, при реализации в аппаратуре порождают комбинационные логические схемы (за исключением случаев, рассмотренных далее). В случаях, когда логическая функция относительно проста, удобнее и нагляднее параллельные присваивания, но в сложных случаях следует пользоваться декомпозицией исходной функции (этот вопрос подробно рассмотрен в [1] и [2]). Использование параллельных операторов позволяет легче “заставить” компилятор реализовать схему в том виде, в котором её хотел бы получить разработчик. Такое совпадение безразлично при работе аппаратуры с частотами, обеспечивающими полное завершение переходных процессов, но при сбойных ситуациях совпадение оказывается весьма полезным.
Если проектируются устройства, содержащие шинные соединения компонентов (элементы с высокоимпедансным состоянием, схемы с открытым коллектором и т. п. ), а также при необходимости анализа проектируемого устройства в переходных состояниях, в том числе обнаружения риска сбоев, используется моделирование в многозначном алфавите. Стандарт языка не определяет многозначного алфавита, но практически все интерпретаторы имеют в своем составе пакет std_logic_1164, который определяет тип данных std_logic, то есть набор допустимых девяти значений данных этого типа, и правила выполнения логических операций с такими данными. Для применения этого типа в программу необходимо включать декларацию использования этого пакета. Реализация комбинационных схем при выполнении преобразований данных типа std_logic не отличается от схем, выполняющих такие же преобразования с данными типа BIT, но результаты моделирования будут отличаться, и моделирование с типом std_logic более адекватно. К тому же тип std_logic позволяет описывать шинные соединения, а синтезаторы интерпретируют эти соединения включением соответствующих буферных схем.
Состояния группы соединений или компонентов могут представляться массивами (если элементы группы определены как BIT или std_logic, то предопределены и соответствующие типы массивов: BIT_VECTOR и std_logic_ VECTOR ), а также некоторые скалярные типы данных. С каждым элементом векторных данных можно оперировать как с отдельным битом, но допустимы и групповые операции, в том числе двуместные операции над векторами равной размерности. Тогда операция выполняется параллельно для пар одноименных битов. При реализации это соответствует наличию одинаковых индивидуальных схем преобразования для каждой пары битов. Из возможных способов представления группы скалярными данными отметим численные и перечислимые типы данных. Каждой возможной кодовой комбинации в группе сопоставляется значение из списка разрешенных значений для данных выбранного типа (число для численных типов, имя или символ для перечислимых). Прямое использование в логических выражениях отдельных битов кода, представляемого скалярным данным, невозможно. Если такое использование необходимо, требуется введение специальных правил (подпрограмм) преобразования численных и перечислимых значений в код. Тип данных INTEGER используется в случаях, когда в алгоритме присутствует относительно большое число арифметических операций. Коды, сопоставляемые значениям данных этого типа, современные синтезаторы интерпретируют в традиционной форме позиционного двоично-взвешенного кодирования. Предпочтительно использовать ограниченный тип, то есть задавать диапазон допустимых значений данных, что позволит синтезатору выбрать минимально достаточную разрядность представления. Операторы, преобразующие численные данные, при синтезе интерпретируются подсхемами из библиотеки используемой САПР, выполняющими требуемое преобразование, например сумматорами, умножителями и т. п. Для выделения отдельных битов данных, отнесенных к типу INTEGER, а также для представления числового эквивалента кода, в большинстве систем интерпретации имеются стандартизованные функции преобразования типов. Например, в системе моделирования ModelSim функции преобразования вектор-число и (conv_integer) и число-вектор (conv_std_logic_vector) определены в пакете std_logic_arith.
Обычно перечислимый тип используют для большей наглядности представления алгоритма. Для перечислимых типов предопределены только операции сравнения. Правила любых других преобразований, включая преобразование типов, определяет разработчик. Если специальных правил кодирования не вводится, программа синтеза автоматически выбирает способ кодирования, исходя из минимума аппаратных затрат или максимального быстродействия. В любом случае число разрядов в схеме, воспроизводящей данные перечислительного типа не меньше двоичного логарифма от количества элементов в списке допустимых значений типа. Пусть, например, проектируется арифметико-логическое устройство, для которого определены такие операции: ADD (сложение), SUBB (вычитание), AND (поразрядное И), OR (поразрядное ИЛИ), NOT (инверсия), СOPY (повторение одного из входов). Тогда требуется ввести тип таких данных и управляющие сигналы этого типа: TYPE instruction IS (add, subb, and, or, not, copy); SIGNAL current_instruction: instruction; Теперь правило функционирования арифметико-логического устройства будет описываться приблизительно так:
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|