Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лек 2 Типы VHDL_данных и их интерпретация при R...doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
287.23 Кб
Скачать

7 Подтипы

Язык VHDL позволяет объявлять подтипы для существующих типов данных. Каждый подтип представляет собой подмножество значений исходного типа. При этом не запрещено, чтобы подмножество значений, относящихся к подтипу, полностью покрывало множество значений исходного типа. Кроме того, при определении подтипа можно, по необходимости, изменить порядок следования значений исходного типа. То есть если изначально значения были упорядочены по возрастанию, то при определении подтипа можно задать упорядочение допустимых для него значений по убыванию.

Объявление подтипа, как и типа, состоит из имени и определения. Следует обратить внимание на то, что подтип может быть определен непосредственно при объявлении объекта языка VHDL. Исходя из данного выше определения подтипа, можно сказать, что при задании типа любого объекта VHDL модели создается новый подтип.

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

<объявление подтипа> ::=

subtype <идентификатор> is <определение подтипа>

<определение подтипа> ::=

<идентификатор>

[range <простое выражение> [to | downto] <простое выражение>]

Большинство рассмотренных ранее арифметических, логических операций требовали, чтобы оба операнда принадлежали одному типу и возвращали значение того же типа. Но, это ограничение не относится к подтипам. То есть, операнды и результат могут принадлежать разным подтипам одного типа. Перед началом выполнения операции все ее аргументы будут приведены к базовому типу. После завершения операции выполняется приведение к подтипу результата с проверкой попадания в допустимый диапазон.

Например, пусть объявлены два подтипа целого типа:

subtype byte is integer range 0 to 255;

subtype word is integer range 0 to 65535;

В таком случае можно реализовать модуль умножения двух однобайтовых значений, который будет формировать двухбайтовый результат:

entity mult is

port (

a : in byte;

b : in byte;

c : out word

);

end entity mult;

architecture behavioral of mult is

begin

process (a, b) is

begin

c <= a * b;

end process;

end architecture behavioral;

Согласно стандарту, по умолчанию предоставляется три подтипа. Во-первых, это два подтипа целочисленного типа целое:

  • подтип для натуральных чисел (natural) с возрастающим диапазоном от 0 до наибольшего целого значения;

subtype natural is integer range 0 to integer'high;

  • подтип для положительных чисел (positive) с возрастающим диапазоном от 1 до наибольшего целого значения.

subtype positive is integer range 1 to integer'high;

Во-вторых, это подтип типа время, используемый для задания длительности задержки (delay_length). Этот подтип имеет возрастающий диапазон от 0 до наибольшего значения типа время:

subtype delay_length is time range 0 fs to time'high;