4. Типы данных VHDL
- std_logic
- 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_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