Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
схемотехника / Введение в инструментальные средства.pdf
Скачиваний:
167
Добавлен:
27.03.2016
Размер:
1.94 Mб
Скачать

дить внутренний сигнал IQ, определив выходной сигнал Q как buffer.

Вход R является асинхронным; поскольку этот сигнал входит

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

Для сдвига применен оператор конкатенации (сцепления) &.

Конкатенация (объединение строк). К одномерным массивам

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

"abc" & "df" = "abcdf".

Пример описания двоичного трехразрядного счетчика приведен в листинге 24. Здесь выходной сигнал Q определен как buffer. Это позволило отказаться от использования внутреннего сигнала.

Листинг 24. VHDL-программа для двоичного счетчика

entity counter is port (

clk, r: in BIT;

Q: buffer INTEGER range 0 to 7

);

end counter;

architecture counter_arch of counter is begin

process (r,clk) begin

if r='1' then Q <= 0;

elsif CLK'event and CLK='1' then Q <= Q + 1; end if;

end process; end counter_arch;

VHDL-стандарты IEEE

Проектирование арифметико-логического устройства требует использования арифметических операций. Хотя язык VHDL имеет

129

встроенные операторы сложения (+) и вычитания (–), но они работают только с целыми и действительными числами и физическими типами. В частности, они не работают с типами BIT_VECTOR и с типом STD_LOGIC_VECTOR стандарта IEEE. Язык VHDL допус-

кает арифметические операции над двоичными и булевыми векторами только при подключении специальных пакетов.

Язык VHDL предоставляет замечательную возможность расширять типы данных и множество функций. Это важное свойство, поскольку встроенные типы BIT и BIT_VECTOR, в действительности, вовсе не адекватны требованиям моделирования реальных схем, когда обрабатываемые сигналы могут соответствовать третьему состоянию, а также быть неизвестными, безразличными и меняющейся интенсивности.

Поэтому вскоре после формализации языка в стандарте IEEE 1076 коммерческие поставщики начали вводить свои собственные встроенные типы данных, чтобы оперировать логическими величинами, отличающимися от 0 и 1. У разных поставщиков были, конечно, различные определения для этих расширенных типов, из-за чего началось возведение «Вавилонской башни».

Чтобы избежать этого, Институтом инженеров по электротехнике и электронике был разработан стандартный логический пакет 1164 (std_logic_1164), девятизначная логическая система которого удовлетворяет большую часть потребностей проектировщиков. За этим пакетом позднее последовал стандарт 1076-3, который содержит несколько пакетов со стандартными типами и операциями для векторов STD_LOGIC, интерпретируемых как целые числа со знаком и без знака. Эти пакеты включают:

std_logic_arith, std_logic_signed, std_logic_unsigned.

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

130

Пакеты std_logic_arith, std_logic_signed u std_logic_unsigned

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

В пакете std_logic_arith определены типы unsigned и signed как векторы элементов типа std_logic и подтип small_int типа integer, a также ряд арифметических функций, функций сравнения и сдвига над операндами этих типов.

Типы UNSIGNED и SIGNED имеют такое же определение, как и bit_vector, но для них разработан набор функций, который позволяет интерпретировать их значения как числовые. Тип UNSIGNED интерпретируется как двоичное представление числа без знака. Старшие разряды в представлении находятся слева. Тип SIGNED интерпретируется как двоичное представление числа со знаком в дополнительном коде. Старшие разряды в представлении также находятся слева. Самый левый разряд представляет знак ('0' соответствует '+', '1' — '-'). Тип small_int состоит из двух целых чисел: 0 и 1.

В пакете определены арифметические функции '+', '-', '*', abs, а также все функции сравнения для операндов типа unsigned, signed, small_int и integer в различном их со-

четании (табл. 3 — 5). Причем векторы операндов могут иметь разные диапазоны. Например, если объявлены:

constant

A:signed(4 downto 0):="11100";

-- число -4

constant

B:unsigned(3 downto 1):="101";

-- число 5

то результаты различных функций будут следующие:

А+7 = "00011", А+B = "00001", АB = "10111", A*3 = "01111", (А=B) = false, (А<B) = true.

131

 

 

 

Таблица 3

 

Пакет std logic_arith. Арифметические операторы

 

 

 

 

Оператор

Тип левого

Тип правого

Тип результата

операнда

операнда

 

 

+,—

Unsigned

Unsigned

Unsigned

+,—

Signed

Signed

Signed

+,—

Unsigned

Signed

Signed

+,—

Signed

Unsigned

Signed

+,—

Unsigned

Integer

Unsigned

+,—

Integer

Unsigned

Unsigned

+,—

Signed

Integer

Signed

+,—

Integer

Signed

Signed

+,—

Unsigned

Std_ulogic

Unsigned

+,—

Std_ulogic

Unsigned

Unsigned

+,—

Signed

Std_ulogic

Signed

+,—

Std_ulogic

Signed

Signed

+,—,*

Unsigned

Unsigned

Std_logic_vector

+,—,*

Signed

Signed

Std_logic_vector

+,—,*

Signed

Unsigned

Std_logic_vector

+,—,*

Unsigned

Signed

Std_logic_vector

+,—

Integer

Unsigned

Std_logic_vector

+,—

Integer

Signed

Std_logic_vector

+,—

Signed

Integer

Std_logic_vector

+,—

Unsigned

Std_ulogic

Std_logic_vector

+,—

Std_ulogic

Unsigned

Std_logic_vector

+,—

Signed

Std_ulogic

Std_logic_vector

+,—

Std_ulogic

Signed

Std_logic_vector

+

Unsigned

-

Unsigned

+,—,ABS

Signed

-

Signed

+

Unsigned

-

Std_logic_vector

+,—,ABS

Signed

-

Std_logic_vector

132

 

 

 

Таблица 4

 

Пакет std logic_arith. Операторы сдвига

 

 

 

 

 

Оператор

Тип левого операнда

Тип правого операнда

Тип результата

(количество позиций)

 

 

 

Unsigned

shl, shr

Unsigned

Unsigned

shl, shr

Signed

Unsigned

Signed

Примечание. shl — оператор сдвига влево. Первый операнд сдвигается влево на количество разрядов, указанное во втором операнде.

shr — оператор сдвига вправо. Первый операнд сдвигается вправо на количество разрядов, указанное во втором операнде.

 

 

 

 

Таблица 5

Пакет std logic_arith. Операторы сравнения

 

 

 

 

 

 

Оператор

Тип левого

Тип правого

 

Тип результата

операнда

операнда

 

 

 

 

 

 

 

 

Boolean

<,<=,>,>=,=,/=

Unsigned

Unsigned

 

<,<=,>,>=,=,/=

Unsigned

Signed

 

Boolean

<,<=,>,>=,=,/=

Signed

Unsigned

 

Boolean

<,<=,>,>=,=,/=

Signed

Signed

 

Boolean

<,<=,>,>=,=,/=

Unsigned

Integer

 

Boolean

<,<=,>,>=,=,/=

Integer

Unsigned

 

Boolean

<,<=,>,>=,=,/=

Signed

Integer

 

Boolean

<,<=,>,>=,=,/=

Integer

Signed

 

Boolean

Функция shr выполняет сдвиг вправо без учета знака операнда типа unsigned или с учетом знака операнда типа signed на количество разрядов, задаваемое вторым операндом типа unsigned. Аналогично функция shl выполняет сдвиг влево. Например, для констант из предыдущего примера:

SHR(A,B-4) = "11110",

SHL(A,B-3) = "10000".

133