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

         

СТРОКИ, БИТОВЫЕ СТРОКИ И АГРЕГАТЫ


Строки,битовые строки,агрегаты (strings, bit strings, aggregates) используются для конструирования значений для обьектов массивных типов. Они могут использоваться в любом месте, где допускается значение типа массив, например, как начальное значение константы или операнд в выражении. Мы уже видели, как строковая запись используется для представления значений предопределенных типов string и bit_vector. Такая же запись может быть использована для массивных значений любого одномерного массива, элементы которого имеют тип character; например: signal data_bus:bit6_data(15 downto 0); . . . data_bus<="UUUUUUUUFFFFFFFF"; Не надо путать символ ('A') со строкой, представляющей массив длиной 1 ("A"). VHDL позволяет компактно описывать битовые строки (значение типа bit vector) в базисе 2,8 и 16. constant clear:bit_vector :=B"00_101_010"; constant empty:bit_vector :=O"052"; constant null:bit_vector :=X"2A"; Все три константы имеют одно и то же значение. Отметим, что символы подчеркивания могут использоваться в любом месте в битовой строке для облегчения чтения. Расширенными цифрами (extended digits) для шестнадцатеричного представления являются буквы от A до F, причем могут использоваться как большие, так и маленькие буквы. Тип элемента массива, созданного агрегатом,может быть любого предопределенного типа или иметь тип, определенный пользователем. Массивные агрегаты формируются при помощи позиционной (positional) записи, поименованной (named) записи или комбинации этих двух форм. Рассмотрим несколько примеров. constant clear:bit_vector:=('0','0','1','0','1','0','1','0'); constant mos_delay:transition_delay := -- 'U' '0' '1' 'F' 'R' 'X' --второй индекс -- --первый индекс ( (0ns, 4ns, 5ns, 3ns, 5ns, 0ns), --'U' (5ns, 0ns, 5ns, 3ns, 5ns, 0ns), --'0' (5ns, 4ns, 0ns, 3ns, 5ns, 0ns), --'1' (5ns, 4ns, 5ns, 0ns, 5ns, 0ns), --'F' (5ns, 4ns, 5ns, 3ns, 0ns, 0ns), --'R' (5ns, 4ns, 5ns, 3ns, 5ns, 0ns)) --'X' parts_per_color <= (green => 3,indigo => 10,blue => 5); square := (1 to 10 => (1 to 10 => 0.0)); unit <= ( (1 => 1.0, others => 0.0),(2 => 1.0 others =>0.0), (3 => 1.0, others => 0.0),(4 => 1.0 others => 0.0)); Это новое обьявление для clear имеет точно тот же смысл, что и предыдущее.
Агрегат записывается, как список значений элементов, разделенных запятыми. Первое значение элемента назначается элементу с самым левым значением индекса и затем эта операция выполняется в порядке слева-направо. Значением элемента может быть произвольное выражение. Константе mos_delay в процессе инициализации присваивается значение массива времен перехода между состояниями. Агрегат состоит из списка строковых значений, разделенных запятыми. Каждое строковое значение само представляется в форме агрегата. Заметим, что последнее предписание на изменение массива наиболее быстрое. Сигналу parts_per_color присваивается значение с использованием поименованной, а не позиционой формы записи. В этом случае агрегат также является списком, элементы которого разделены запятыми, но в то же время каждый элемент списка состоит из выбора значения индекса, правой стрелки и значения, которое должно быть назначено выбранному элементу массива. Значения индекса нет необходимости представлять в порядке, соответствующем типу, так как каждое значение индекса явно поименовано. Все элементы в square будут иметь значения 0.0 после выполнения назначения. Вложенные агрегаты порождают сложное значение , имеющее значение 0.0 во всех строковых элементах с индексами от1 до 10. Это сложное значение назначается каждой строке массива. Сигналу unit будет назначено значение 1.0 для всех элементов, находящихся на главной диагонали, нуль для всех других элементов. Поименованная запись используется для выбора одной индексной позиции и присвоения значения элементу в каждой строке. Для остальной части строки используется операция выбора others.

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