Первоначально IEEE не определила стандартных пакетов для работы со знаковыми числами. Поэтому каждый производитель САПР начал использовать свои собственные пакеты. Так в начале 90-х компания Synopsys использовала три пакета – std_logic_arith, std_logic_signed, std_logic_unsigned. Например, в ModelSim. И поскольку пакетов от IEEE не было, то пакеты от Synopsys начали использоваться повсеместно.

 

Пакеты std_logic_signed/std_logic_unsigned использовали тип std_logic_vector и давали возможность работать с этими векторами как знаковыми и беззнаковыми числами. Пакет  std_logic_arith определил два новых типа SIGNED и UNSIGNED и операции над этими типами.

Другие производители САПР, такие как Cadence и Mentor начали выпускать свои версии пакета std_logic_arith, но не совпадающие с библиотекой компании Synopsys. Все компании начали требовать от IEEE, чтобы их пакеты были использованы в библиотеках IEEE.

В конце концов в IEEE все-таки решили взять ситуацию в свои руки и выпустили пакеты numeric_bit и numeric_std, которые вошли в состав в состав стандартных билиотек IEEE. При этом мы не забываем, что VHDL LRM (Language Reference Manual) является стандартом IEEE. А это значит, что все, что одобрено IEEE, является стандартом.

Пакет numeric_bit основывается на типе bit, а пакет numeric_std ­– на типе std_logic. Оба пакета, подражая пакетам компании Synopsys, определяли новые типы SIGNED и UNSIGNED. Но при этом пакеты не содержали те же функции, параметры и имена, что и пакет от Synopsys. Т.е. библиотеки были не совместимы между собой.

Обратите внимание, что пакет numeric_std (а нам он более интересен) описывает сразу оба типа – SIGNED и UNSIGNED. Это позволяет избежать конфуза и использовать оба типа простым объявлением одной библиотеки. И что важно, в пакете от IEEE описаны операции с различными различными типами операндов (SIGNED, UNSIGNED и их различных комбинаций). Это позволяет использовать одни и те же функции во всех случаях. Функции перегружаются автоматически в зависимости от типа операндов. В то же время пакет std_logic_arith от Synopsys просто реализует всю арифметику как беззнаковую. А для использования знаковой арифметики у Synopsys есть пакет std_logic_signed.

В результате получилась ситуация при которой возник некоторый конфликт поколений. Разработчики, изучавшие VHDL на основе пакетов Synopsys продолжают их использовать, а более молодые разработчики уже используют пакеты от IEEE. Явными примерами являются фирменные руководства от Altera и Xilinx, в которых то и дело встречаются артефакты от библиотек Synopsys. Например, функция преобразования типов CONV_UNSIGNED, которая в библиотеках IEEE была заменена на TO_UNSIGNED.

Подведем небольшие итоги.

Большая часть производителей САПР сейчас поддерживает пакеты numeric_bit/numeric_std. Библиотеки IEEE являются более предпочтительным вариантом. И для получения максимальной кроссплатформенности кода на VHDL, старайтесь избегать использования пакетов std_logic_signed или std_logic_unsigned и всегда используйте типы SIGNED или UNSIGNED (на крайний случай INTEGER) для арифметических операций.

library ieee;

use ieee.std_logic_1164.all;

 

use ieee.numeric_std.all;                  -- используем библиотеку IEEE

 

Если уж очень хочется поиспользовать пакеты от Synopsys, то делайте так:

library ieee;

use ieee.std_logic_1164.all;

use ieee.std_logic_arith.all;              -- используем библиотеку Synopsys

use ieee.std_logic_unsigned.all;

 

При этом запомните:

·        для арифметических операций используйте пакет std_logic_arith

·        для счетчиков и тестбенч используйте пакет std_logic_unsigned

·        не используйте пакет std_logic_signed

 

И уж точно избегайте ситуации с одновременным использованием библиотек от IEEE и Synopsys. Т.е. такая конструкция недопустима:

library ieee;

use ieee.std_logic_1164.all;

use ieee.numeric_std.all;

 

use ieee.std_logic_arith.all ;

Додати коментар


Захисний код
Оновити