Читайте также:
|
|
Для того чтобы воспользоваться в программном проекте какой-либо программной величиной (переменной, сигналом, константой), она должна быть объявлена и определена. Это положение же касается и программных величин (переменной, сигнала, константы), когда они имеют составную структуру, т.е. являются массивами. Для определения программных величин такого вида (часто говорят массивов) в языке VHDL используются такие конструкции:
ü Агрегат (aggregate);
ü Сектор (slice).
ü Строка бит;
ü Символьная строка (string);
Эти компоненты не играют самостоятельной роли в языке VHDL. Они являются составными частями конструкциями операторов объявлений составных программных величин.
Замечание: Программные величины типа массив можно определять (формировать числовые данные значений их элементов) можно также классическим программным способом.
Aggregate.
Агрегат – это конструктивный элемент языка, который позволяет объединить множество разрозненных значений в одно цельное значение, которое будет трактоваться как массив значений.
Агрегат чаще всего располагается в правой части операторов присвоения для инициализации и назначения значений сигналам.
Естественно, что конструктивный элемент языка VHDL агрегат целесообразно применять с программными величинами (signal, variable, constant), когда они объявлены как массивы.
Понятие Агрегат можно сформулировать также следующим образом: это конструктивный элемент языка (запись специального вида), который содержит в своем составе одно или большее количество цифровых (символьных) значений, каждый из которых ассоциируется со значениями элементов массивов. Агрегат к объявляемому массиву прикрепляется (присоединяется) посредством операторов: присваивания:=, инициализации:= или назначения значения сигналу <=.
По своему конструктивному оформлению наипростейший агрегат инициализирующий одномерный массив типа integer из 5 элементов, представляет собой запись, содержащую круглые скобки, внутри которых содержаться значения его элементов, отделенных запятыми: (2, 3, 10, -10, 15);
Наипростейший агрегат инициализирующий одномерный массив типа real содержащий 5 элементов, представляет собой запись, содержащую круглые скобки, внутри которых содержаться значения его элементов, отделенных запятыми: (-2.3, 4.3, 15.6, 78.9, 1.9);
Наипростейший агрегат инициализирующий одномерный массив типа bit_vector или std_logic_vector содержащий 4 элементов, представляет собой запись, содержащую круглые скобки, внутри которых содержаться значения его элементов, отделенных запятыми. Значения самих элементов массива должны быть охвачены апострофами: (‘1’, '0', '0', '1');
Наипростейший агрегат инициализирующий одномерный массив типа character содержащий 6 элементов, представляет собой запись, содержащую круглые скобки, внутри которых содержаться значения его элементов, отделенных запятыми. Значения самих элементов массива должны быть охвачены апострофами: (‘G’, 'k', 'w', 'f', ‘z’, ‘s’);
Для того, чтобы такими видами агрегатов инициализировался массив, они должен быть прикреплен к имени массива посредством одной из вышеуказанных операций.
Важно помнить, даже для инициализации сигнал-массивов, когда они объявляются в разделе объявлений тела архитектуры, должна использоваться операция :=. Для сигнал-массивов операция <= используется в разделе выполняемых операторов тела архитектуры.
В языке VHDL применяется два класса ассоциации элементов агрегата с элементами массива:
· Позиционная (списочная) ассоциация;
· Именованная ассоциация.
При использовании обоих видов ассоциации в конструкции агрегата разрешается использовать следующие разновидности конструктивных подэлементов:
- Ключевое слово others, которое в конструкции агрегата должно быть всегда последним;
- Простое выражение, которое может иметь или позиционное или именованное соответствие
- Комбинацию позиционного или списочного соответствия
- При позиционном соответствии допускается использовать выражения вида: n1 to n2, n4 downto n3, где n1, n2, n3, n4 - номера элементов живого массива и агрегата, между которыми устанавливается соответствие;
- Операцию многократного соответствия, которая читается как “И” и в конструкции агрегата обозначается символом |.
Судя по приведенному списку конструктивных подэлементов агрегата, можно заметить, что его внутреннее устройство может иметь многоликий вид, который целесообразно рассмотреть на примерах.
Пример 1.
Пусть в программном проекте криптографического процессора имеется объявление переменной вида:
variable Data12: bit_vector (0 to 3);
Эта переменная объявлена посредством предопределенного одномерного массива bit_vector и содержит 4 элемента (4 бита), для которых установлен возрастающий порядок.
Задать значения элементам этого массива можно с помощью агрегата, который можно прикрепить к массиву посредством оператора присвоения:
Data12:= (‘0’, ‘1’, ‘1’, ‘0’); --это агрегат, который является простым по своему конструктивному устройству.
Ассоциация элементов агрегата и битов массива здесь позиционная (списочная). Значения элементов для массива будут взяты из агрегата в порядке их расположения, т.е.:
Data12(0)=0
Data12(1)=1
Data12(2)=1
Data12(3)=0
Пример 2.
Variable Da14:bit_vector(3downto0):= (3=>’0’,2=>’1’,0=>’1’,1=>’1’);
агрегат
Это агрегат, который является простым по конструктивному устройству. Он содержит именованную ассоциацию. Порядок расположения назначений при именованной ассоциации может быть произвольным.
Пример 3.
Variable Da_15: std_logic_vector(7 downto 0):= (‘0’,’x’,’1’,’1’, 2=>’w’,3=>’0’,1=>’z’,0=>’1’);
Спичное соответствий Именованное соответствие
В этом примере элемента битового массива будут назначены такие значения:
7 бит = 0
6 бит = x
5 бит = 1
4 бит = 1
3 бит = 0
2 бит = w
1 бит = z
0 бит = 1
Этот агрегат является простым по конструктивному устройству. Однако он содержит как позиционный (списочный) способ ассоциации, так и именованный способ. При таком варианте оформления агрегата сначала должен использоваться вариант списочного, а затем именованного соответствия.
Пример 4.
Signal Da_16: std_logic_vector (7 downto 0) <=(‘0’, ’x’,
5 downto 2=>’z’, 1=>’1’, 0=>’x’);
В этом примере элементы битового массива будут назначены такие значения:
7 бит = 0
6 бит = x
5-2 бит = z
1 бит = 1
0 бит = x
Пример 5.
Type Da_int4 is array (natural range <>) of integer;
Signal Da_16: Da_int4(0 to 3):=(7, 26, -39, 67);
Одномерный Массив Da_16 типа Da_int4, содержащий 4-ре элемента инициализирован агрегатом посредством списочного соответствия. Нумерация элементов (индексация) начинается с нуля.
В этом примере элементам массива будут назначены такие значения:
0 элем = 7
1 элем = 26
3 элем = -39
4 элем = 67
Пример 6.
Type Da_float3_4 is array(0 to 2, 0 to 3) of real;
Signal Da_16: Da_float3_4:= ((2.3, 6.8, -4.7, 5.0),
(11.7, 2.8, 3=>5.2, 2=>6.8),
(12.9, others=>-1.2));
Здесь объявлен двухмерный вещественный пользовательский массив Da_float3_4 содержащий 3-ри строки и 4-ре столбца. Затем объявляется программная величина Da_16 как массив типа Da_float3_4. Следовательно, программная величина Da_16, будет являться двухмерным массивом, содержащим три строки и четыре столбца. Элементы этого массива являются числами типа real. Для инициализации этого массива используется комплексный агрегат. В этом агрегате каждая строка содержит свой подагрегат. Каждый подагрегат использует свой способ ассоциации. Подагрегаты заключаются в круглые скобки иотделяются друг от друга запятыми. В данном примере элементы двухмерного массива Da _16 будут такими:
2.3 6.8 -4.7 5.0
11.7 2.8 6.8 5.2
12.9 -1.2 -1.2 -1.2
Пример 7.
Signal Data_bus:std_logic_vector(15 downto 0);
Data_Bus<=(‘1’, ‘0’, 13 downto 6=> ’1’, 5 downto 0=> ’z’);
Списочная ассоциация Именованная ассоциация с указанием диапазона
15 бит = 1
14 бит = 0
13-6 бит = 1
5-0 бит = z
Пример 8.
Signal Data_bus15:std_logic_vector(15 downto 0);
Data_Bus15<=(13 downto 7=>’0’, others=>’1’);
В массиве Data_bus15 элементы с 13 по 7 получают значение 0, все остальные (15, 14 и с 6 по 0) – значение 1.
Пример 9.
Этот пример иллюстрирует пример многократного соответствия (назначения), т.е. использование операции многократного назначения, которая обозначается символом | (Символ вертикальная черта).
Signal Data_bus15:std_logic_vector(0to15);
Data_Bus15<=(0|1|2|3 to 7=> ’1’, 6=>’z’, others=>’x’);
многократное соответствие именован. Соотв. соответствие others
В этом случае элементы массива:
0, 1, 2 и с 3 по 7 = 1
6 элем. = z
остальные = x
СЕКТОР (slice).
При работе с массивами в языке VHDL часто используется понятие сектор. Сектор представляет собой одномерный массив, образованный из группы последовательно расположенных элементов другого (родительского) массива.
В литературе по языку VHDL можно встретить определение понятия сектор: сектор – это подмассив уже существующего (определенного) массива, который (сектор) может включать в свой состав от одного элемента, взятого из родительского массива, до всех элементов из родительского массива.
Идентификатор (имя) сектора должно совпадать с идентификатором родительского массива.
Сектор должен использоваться в том же качестве, как и родительский массив. Так, например, если родительский массив имеет тип signal, то и сектор должен использоваться в VHDL программе как signal.
Пусть имеется определение родительского массива вида:
Signal Da_bus: bit_vector (31 downto 0);
Из этого родительского массива мы можем организовать несколько секторов:
Signal Da_bus (31 downto 31); --сектор содержит один элемент (31й элемент)
Signal Da_bus (15 downto 7); --сектор содержит элементы с 15 по 7 из родительского массива.
Важное замечание:
Направление в указаниях диапазонов родительского массива и сектора должны совпадать.
Так, объявление сектора вида Da_bus (13 downto 17); является ошибкой.
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
Дата добавления: 2015-10-30; просмотров: 128 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Вводные замечания и классификация массивов | | | NASA'S Chandra Shows Milky Way is Surrounded by Halo of Hot Gas |