- •Файл Lekz5_massiv.Doc Лекция № 5 (5-тый курс) Тема: массивы в языке vhdl и проектах криптографических процессоров.
- •1. Вводные замечания и классификация массивов
- •2. Предопределенные типы массивов.
- •3. Массивы пользователя.
- •4. Примеры оформления объявлений пользовательских массивов:
- •5. Методы и средства для определения массивов (Задание значений элементам массивов)
- •6. Инициализация (задание) начальных значений массивов типов bit_vector и std_logic_vector посредством строки бит.
- •7. Инициализация (задание) начальных значений символьных типов массивов посредством символьной строки.
- •8. Программное формирование значений элементов массивов и доступ к элементам массивов
- •9. Пример vhdl проекта криптографического процессора, построенного с использованием массивов
6. Инициализация (задание) начальных значений массивов типов bit_vector и std_logic_vector посредством строки бит.
Строка бит в языке VHDL – это образование, которое состоит из множества допустимых значений в указанных типах и которое охвачено двойными кавычками.
“1101101” строка бит для типа bit_vector
“10zu1h0” строка бит для типа std_logic_vector
При инициализации массивов строкой бит реализуется списочный метод соответствия. Причем число бит в строке должно точно соответствовать количеству элементов в массиве.
Пример 10.
Signal Da_inbv: bit_vector (0 to 7);
Da_inbv <= “10100011”;
В этом массиве биты:
0, 2, 6, 7 –> 1
1, 3, 4, 5 0
Пример 11.
Variable Da_instd: std_logoc_vector (0 to 3);
Da_instd <= “z,1,x,h”;
В этом массиве биты:
0 z
1 1
2 x
3 h
7. Инициализация (задание) начальных значений символьных типов массивов посредством символьной строки.
В языке VHDL символьная строка – это образование, содержащее любой набор ASCII символов, который охвачен двойными кавычками.
“Masha12” строка бит
“shzur148” строка бит
Важно помнить, что при инициализации символьного массива символьной строкой, число символов в строке должно строго соответствовать числу элементов в массиве.
Пример 12.
Signal mass : string (0 to 7);
mass <= “shutov!!”;
Пример 13.
type mas_ch is array (0 to 5) of character;
signal mas1_ch : mas_ch := “papasa”;
Пример 14.
type mas_ch2m is array (0 to 3, 0 to 4) of character;
s
ignal
mass2m: mas_ch2m := ((“Mama”),
(“Mila”), агрегат из символьн.строк
(“Ramu”));
В этом примере объявлен пользовательский тип массива mas_ch2m , который определяет характеристики для будущих двухмерных массивов программных величин. Этим типом объявлена переменная mass2m , которая является двухмерным массивом, содержащим 3 строки и 4 столбца.
Массив mass2m инициализирован агрегатом, содержащим три символьные строки.
В пределах символьных строк ассоциация элементов является списочной.
Элементы массива mass2m получают значения:
M
a m a
M i l a
R a m u
Пример 15.
type mas_ch2m is array (positive range<>, positive range <>) of character;
signal sig1_mas2: mas_ch2m(1 to 3, 1 to 4)<= ((‘f’,’a’,’s’,’t’),
(‘a’,’b’,’d’,’e’),
(‘L’,’N’,’M’,’K’));
Этот двумерный символьный массив проинициализирован с помощью комплексного агрегата, который содержит три подагрегата.
В подагрегатах принят списочный способ соответствия.
f a s t
a b d e
L M N K
8. Программное формирование значений элементов массивов и доступ к элементам массивов
При программном формировании значений элементов массивов идентификатор уже объявленного массива должен располагаться в разделе выполняемых операторов тела архитектуры или в разделе выполняемых операторов тела явно заданного оператора process и быть конструктивным элементом левой части оператора назначения значения сигналу или быть конструктивным элементом левой части оператора присвоения значений переменной.
Идентификатор массива при этом должен снабжаться числовыми или символьными индексами. Индексы массива должны располагаться в круглых скобках и для случая двухмерного массива отделяться друг от друга запятой. С помощь индексов мы адресуемся к конкретным номерам элементов массива, т.е. фактически выбираем отдельный элемент, которому следует назначить значение.
Заметим, символьные индексы обычно используются, когда значения элементов массива формируются в теле оператора цикла. Следует помнить, что в такой ситуации индексы в массиве должны быть символьными и идентификаторы индексов в массиве должны совпадать с идентификаторами переменных цикла.
Числовые значения индексов обычно применяются, когда требуется сформировать значение для отдельного элемента массива.
Примеры:
Пример 1.
Пусть в разделе объявлений тела архитектуры был декларирован двухмерный массив вещественного типа вида:
Type Da_float3_4 is array (0 to 2, 0 to 3) of real;
В разделе объявлений тела архитектуры пусть также был декларирован двухмерный массив-сигнал вещественного типа вида Da_float3_4:
Signal Da_16: Da_float3_4;
Пусть требуется сформировать значения элементов сигнал-массива программным способом. Эту процедуру можно реализовать в разделе выполняемых операторов тела оператора process, размесив идентификатор сигнал-массива в теле операторов цикла for…loop. Программный код проекта, с учетом приведенных выше условий, может иметь такой вид:
library IEEE;
use IEEE.STD_LOGIC_1164.all;
entity form_mass is
port( s1_in : in real range 0.1 to 128.9;
clock : in STD_LOGIC;
s2_out : out real range 0.0 to 12568.9);
end form_mass;
architecture form_mass_ar of form_mass is
Type Da_float3_4 is array (0 to 2, 0 to 3) of real;
Signal Da_16: Da_float3_4;
begin
process(clock)
begin
z1 : for i in 0 to 2 loop
z2 : for j in 0 to 3 loop Da_16(i,j) <= 4.56 * s1_in; s2_out <= Da_16(i,j);
end loop z2;
end loop z1;
end process;
end form_mass_ar;
