СПРАВОЧНИК ПО ЯЗЫКУ VHDL

         

ОПЕРАЦИИ НАД МАССИВАМИ


Массив может появляться в выражении в множестве случаев. Элемент массива выбирается путем задания значений индексов для каждой индексной позиции. Два массива также как два значения одного типа можно сравнивать, используя операторы равенства и неравенства. Результат будет булевого типа. Для одномерных массивов определяются две дополнительных операции: вырезка (slicing) и конкатенация. Вырезка позволяет выбрать непрерывное подмножество массива. Конкатенация создает большой массив из двух массивов или из массива и одного значения элементного типа. Все приведенные ниже булевые выражения имеют значения true. constant A:bit_vector := "01010"; constant B:bit_vector := "010"; variable S:string (1to 5); . . . ...A(0)='0' ... --Элемент выбирается при помощи индекса ...A(3)='1' ... ...A(1 to 3) = "101"... -- Вырез выбирается диапазоном ...B(1 to 2) = A(3 to 4) ... ...A = '0'&"101"&'0'... --Массив создается конкатенацией ...A = B & "10" ... S:="AbCdE"; --Переменной S назначается значение ...S(2) = 'b' ... ...S(4) = 'd' ... ...S(3 to 5) = "CdE"... S(2 to 4) := "XYZ"; --Вырезу из S назначается новое значение ...S = "AXYZB"... Операторы упорядочивания (<,<=,>,>=) являются предопределенными для одномерных массивов с элементами целого или перечислительного типа. Сравнение производится поэлементно слеванаправо до тех пор,пока не будет обнаружено различие или массивы не будут просмотрены. Не обязательно, чтобы массивы были одинаковой длины; если элементы короткого массива совпадают с начальными элементами длинного массива, то длинный массив будет считаться больше, чем короткий. Приведенные ниже булевы выражения являются истинными. name1 := "Jones"; name2 := "Smith"; ...name1 = name1 ... ...name2 < "Smithson"... count1 :=(2,3,6); count2 :=(2,3,7); ...count1 <= count2... ...count2>(1,3,7,9)... Логические операторы, определенные для скаляров типа bit и boolean, могут также использоваться для одномерных массивов с элементами любого типа.
Операция выполняется последовательно над каждым элементом и результатом является массив с элементами, имеющими тот же тип, что и аргументы. Оба массива должны иметь одну и ту же длину и тип. signal Areg,Breg:bit_vector(32 downto 0); type bool_vector is array (natural range <>) of boolean; signal stage_full,required:bool_vector(1 to 24); . . . Areg<=Areg xor Breg; stage_full<=(stage_full(13 to 24) & stage_full(1 to 12)) and required; Ecли массивное значение назначается обьекту , то число элементов в подтипе должно проверяться в процессе моделирования. Если размер неправильный, то моделирование будет остановлено и будет выдано соответствующее сообщение об ошибке. Например, следующее назначение будет вызывать ошибку во время моделирования. Areg <= Areg&Breg; -- ОШИБКА: значение выражения не будет -- переслано в Areg Для того, чтобы быть назначенным массиву данного подтипа или быть связанным с ним массивное значение должно быть корректного базового типа, то есть недостаточно только того, чтобы совпадали типы входящих в массив элементов. signal data_reg:bit6_data(0 to 7); signal address_reg: bit6_address(0 to 7); . . . data_reg<=address_reg; --НЕВЕРНО !! Несмотря на то, что оба сигнала являются массивами элементов, имеющими тип bit6, назначение не допускается. Тем не менее преобразование типов(type conversion) допускается между двумя массивными типами если: массивные типы имеют одинаковое число измерений; элементы имеют одинаковые типы и либо индексы целого типа, либо индексы одинакового перечислительного типа. О двух таких типах говорят, что они тесно связанные (closely related). Таким образом допустимо следующее преобразование типов: data_reg <= bit6_data(address_reg);

Содержание раздела