Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Лекции(2013)

.pdf
Скачиваний:
12
Добавлен:
12.05.2015
Размер:
448.08 Кб
Скачать

Значения всех функций в пакете STD_LOGIC_1164 определены на всем множестве значений сигналов.

Все логические функции (И, ИЛИ, ИЛИ-НЕ…) реализованы в девятизначной логике, поэтому при реализации алгоритма описания схемы лучше использовать булевы выражения и значения переменных, а не прямой перебор значений и назначение констант.

Как уже отмечалось, в пакете есть полезные функции определения фронтов сигналов: Rising_edge( S ) и Falling_edge( S )

Пакеты Numeric_std и Numeric_bit

Пакеты предназначены для упрощения проектирования устройств, использующих арифметические операции. Они отличаются между собой тем, что функции и типы объявлены над разными базовыми типами данных: std_logic и bit соответственно.

Впакетах определены типы битовых векторов: unsigned – положительные целые двоичные числа без знака и signed – целые двоичные числа, у которых старший бит считается знаковым («0» – положительное число, «1» – отрицательное число).

Впакете определены перегружаемые логические функции (not, and, or, nand, nor, xor, xnor), арифметические функции (+, -, *, mod, rem, abs), функции сдвига (srl, sll,ror,rol), а также функции сравнения для типов signed, unsigned и integer(и его подтипов) в различных сочетаниях.

Следует отметить, что арифметические, логические и сдвиговые операции над типами signed и unsigned выполняются побитово одинаково, разница проявляется в интерпретации чисел (расширение разрядности, сравнение, преобразование в integer). При вычитании число-вычитаемое автоматически преобразуется в дополнительный код, подразумевается также, что отрицательные числа представлены в дополнительном коде.

Варифметических операциях нельзя смешивать операнды типа signed и unsigned. Однако, один из операндов может быть типа signed или unsigned , а другой – типа integer (или его подтип). Также нельзя присваивать тип signed типу unsigned и наоборот.

Длина числа, которому присваивается результат выражения, должна быть изначально задана достаточной для хранения результата. Длина хотя бы одного из операндов должна равняться длине результата (явно расширена до длины результата). Другой операнд может быть автоматически расширен до этой длины.

Для увеличения разрядности операндов до нужной длины существует функция resize. Функция resize(<число>,<количество разрядов>) расширяет число (переменную / сигнал с именем или константу с типом) до количества разрядов, заданного целым десятичным числом. При этом, число типа unsigned дополняется слева соответствующим количеством нулей, а типа signed – значением его знакового (старшего) разряда.

Например:

resize(unsigned (“10”), 4) =”0010”, resize(signed (“10”), 4) =”1110”. resize(unsigned (“01”), 4) =”0001”, resize(signed (“01”), 4) =”0001”.

При описание устройства стандартным образом рекомендуется объявлять сигналы в интерфейсе типа std_logic или bit, а в архитектуре использовать внутренние сигналы или переменные внутри процессов типа unsigned и signed. При этом для соответствующего преобразования используются функции конкретизации типов.

Есть функции преобразования типов To_Unsigned, To_Signed, To_Integer для преобразования типа Integer в Unsigned и Signed и наоборот.

library IEEE;

use IEEE.STD_LOGIC_1164.all; use IEEE.numeric_std.all;

41

entity lab4 is

generic (Lin: integer :=2); port(

A,B: in STD_LOGIC_vector (Lin downto 0); C: in STD_LOGIC;

Sum: out STD_LOGIC_vector (Lin+1 downto 0) );

end lab4;

architecture lab4 of lab4 is

signal D: signed (Lin+1 downto 0);

signal DU: unsigned(Lin downto 0):=(others=>'0'); signal As,Bs: signed (Lin downto 0);

signal Mul: signed (Lin*2+1 downto 0); signal Int, Intsum:integer;

begin

D<=resize(As,Lin+2)+ Bs after 2ns; Mul<=As*3;

process (C)

variable vsum:unsigned (Lin+1 downto 0); variable va,vb:unsigned (Lin downto 0);

begin

if Rising_Edge(C) then

DU<=DU-1 after 2ns; -- работает как обычный счетчик (11..1-> 00..0)

va:=unsigned(A); vb:=unsigned(B);

--конкретизация типа

vsum:=resize(va,Lin+2)- resize(vb,Lin+2);

-- расширение операндов до размеров

 

-- результата

Sum<=STD_LOGIC_vector(vsum) after 2ns; --конкретизация типа

else NULL;

 

end if;

 

end process;

 

int<=to_integer(signed(D)); --преобразование типов intsum<=to_integer(signed(Sum)); --преобразование типов

end lab4;

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

Например: std_match(“10101Х”,“1-1-1-”) = true.

Взаключение отметим, что упоминавшиеся ранее пакеты Std_Logic_signed Std_Logic_unsigned включают, в основном такие же функции, что и Std_Logic_arith, но используются обычно при описании объектов проекта, в которых используются либо тип signed либо тип unsigned. В операциях для двух аргументов в качестве второго операнда в этих пакетах может быть STD_LOGIC_vector.

42

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]