4. Типы данных VHDL

Как уже было сказано, поле entity предназначено для описания системы как "черного ящика". В нем были определены порты, один из главных параметров которых - это тип данных порта. В примере использованы два наиболее распространенных типа:
  • std_logic
  • std_logic_vector
Первый - std_logic - это тип для однобитной шины данных. На самом деле данный тип может принимать значения не только единицу и ноль. Он так же может быть 'X', 'U', 'Z' и др. Такие дополнения необходимы, для вспомогательных для разработчика задач: во-первых, при моделировании неинициализированные сигналы принимают значение 'U', т.е. undefined
Тип std_logic_vector - это тип для описания шин, состоящих из std_logic, в которой каждая однобитная шина имеет те же свойства, что и std_logic.

Эти два типа данных поддерживают базовые битовые операции, перечисленные ранее.
Помимо этого шины поддерживают работу со "срезами", то есть с обращениями к конкретным битам. В VHDL допустимо присваивать значения по умолчанию, например, если ранее был созданы 7-битный порт типа std_logic_vector, то присвоить им постоянные значения можно следующей записью:

 1 my_bus_out1(0) <= '1';
2 my_bus_out1(3 downto 1) <= (others => '0');
3 my_bus_out1 (6 downto 4) <= "010";
В первой строке в нулевой бит шины записывается единица, работа с однобитной частью шины производится так же как если бы она была просто однобитным сигналом типа std_logic - поэтому значение обрамляется в одинарные кавычки.
Во второй строке приведен пример записи в часть шины - обращение к битам указано в скобках, а запись (others => '0') означает, что во все биты в шине необходимо записать нули.
Наконец, в третьей строке показана обычная запись числа в шину - она уже указана в двойных кавычках и битность записываемого числа должна совпадать с битностью шины, в которую ведется запись.

Типы данных

Тип данных std_logic_vector необходим прежде всего для интерпретации физического сигнала. Такой тип не подходит для математических операций. Внутри самого блока мы можем оперировать исключительно двоичными значения, для этого в VHDL используются различные типы данных, в том числе и из других библиотек ieee:

  • integer
  • другие (natural, positive, bit,...)
  • unsigned (библиотека numeric_std)
  • signed (библиотека numeric_std)

Рассмотрим основные типы данных.

unsigned, signed, integer

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

Типы unsigned и signed - это двоичные типы данных, которые по способу инициализации схожи с std_logic_vector. Unsigned является беззнаковым типом данных, в то время как signed - знаковым. 

<...>
signal sum1 : unsigned(7 downto 0) :="10110100"; --8bit unsigned
signal sum2 : signed(3 downto 0) :=4x"F";        --4bit signed
<...>

При инициализации сигнала данного типа его битность четко определена в скобках; в примере сигналы sum1 и sum2 однозначно определены как шины на 8 и 4 бит соответственно. После указания типа данных и его битности появилась еще одна запись с так называемым "моржовым" оператором (двоеточие равно). Данная запись указывает значение сигнала в нулевой момент времени. В верхней строке показан пример инициализации в двоичном виде, а инициализация сигнала sum2 показана с использованием шестнадцатеричного числа F.

Тип данных integer является целочисленным типом данных, однако, при инициализации его битность по умолчанию 32, если только не указаны ограничения при создании сигнала:

<...>
signal count1 : integer;              --32bit
signal count2 : integer range 0 to 3; --2bit
<...>
Запись range 0 to 3 сообщает, что создаваемый сигнал не может принимать значения вне указанного диапазона [0;3]. Исходя из этих данных синтезатор определит, что для данного диапазона достаточно двух бит.


Другие типы данных

В языке VHDL определены и другие, менее популярные типы данных. К примеру, positive — это подвид типа integer, который может принимать только положительные значения от 1 до 232. Тип natural — подтип integer, который может принимать неотрицательные значения: от 0 до 232.


Константы

При описании различных схем существуют ситуации, где используются конкретные числа, с которыми выполняются математические или логические операции. Так как использование так называемых "магических чисел" является плохой практикой, существуют константы. Пример использования константы:

1  library ieee;
2  use ieee.std_logic_1164.all;
3  use ieee.numeric_std.all;
4 
5  entity const_use is
6  port(
7      s1 : in std_logic;
8      s2 : in std_logic_vector(7 downto 0);
9      s3 : out std_logic
10 );
11 end;
12 
13 architecture rtl of const_use  is ;
14    constant s2_check : std_logic_vector(7 downto 0) :="11001010";
15
16 begin
17 
18   process(all)
19   begin
20     if s1 = '1' then
21         s2 <= s2_check;
22     else 
23        s2 <= (others =>'0');
24     end if;
25   end process;
26 end rtl;

В строке 14 продемонстрирован пример создания константы и инициализация её значения. Аналогично сигналам константы могут быть любого типа данных


Массивы

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

type <type_name> is array (range) of <type>;

В данной команде <type_name> — это название типа данных, range - это размер массива, а <type> — это указание типа данных каждого из элементов массива. Рассмотрим пример:

<..>
type my_array is array (0 to 5) of unsigned(7 downto 0); --creating array
signal const_arr : my_array; -- creating array signal

Здесь создается тип my_array, этот тип подразумевает, что это массив из 6 значений (от 0 до 5) данных типа unsigned(7 downto 0).


Литература:

Signed and Unsigned in VHDL, Nandland: https://www.nandland.com/vhdl/examples/example-signed-unsigned.html

Data type conversion in VHDL, Doulos: https://www.doulos.com/knowhow/vhdl/vhdl-vector-arithmetic-using-numeric_std/

VHDL Arrays, Nandland: https://www.nandland.com/vhdl/examples/example-array-type-vhdl.html