Цель этого ответа - продемонстрировать индексацию значений подэлементов от RED_Buffer1
до RED_Buffer5
. Без цели раскрытия кода это может легко оказаться вопросом XY Problem .
Хотя можно организовать от RED_Buffer1
до RED_Buffer5
в значение, которое можно проиндексировать, как показано ниже, существуют и другие проблемы.
library ieee;
use ieee.std_logic_1164.all;
entity lshift is
port (
red_buffer1: in std_logic_vector (6 downto 0);
red_buffer2: in std_logic_vector (6 downto 0);
red_buffer3: in std_logic_vector (6 downto 0);
red_buffer4: in std_logic_vector (6 downto 0);
red_buffer5: in std_logic_vector (6 downto 0);
ir_buffer1: in std_logic_vector (6 downto 0);
ir_buffer2: in std_logic_vector (6 downto 0);
ir_buffer3: in std_logic_vector (6 downto 0);
ir_buffer4: in std_logic_vector (6 downto 0);
ir_buffer5: in std_logic_vector (6 downto 0);
output: out bit_vector (1 downto 0)
);
end entity lshift;
architecture indexed_array of lshift is
signal condition1: boolean;
signal valor: std_ulogic;
type lbuffer is array (1 to 5) of std_logic_vector (6 downto 0);
signal red_buffer: lbuffer;
begin
red_buffer <= (red_buffer1, red_buffer2, red_buffer3, red_buffer4,
red_buffer5);
process (red_buffer)
begin
for i in 1 to 5 loop
for j in red_buffer'range loop
if red_buffer(i)(j) = '1' then
output <= "01";
end if;
end loop;
end loop;
end process;
end architecture indexed_array;
Как здесь осуществляется индексация
Объявляется составной тип (lbuffer
), имеющий необходимое количество элементов с требуемым подтипом элемента. Это возможно, потому что объявления для портов RED_Buffer1
- RED_Buffer5
имеют общий указатель подтипа. Присваивание элементам объекта типа lbuffer
будет совместимым, если совпадают элементы между целевым и правосторонним выражением.
Объявлен сигнал red_buffer
с отметкой типа lbuffer
.
Было выполнено параллельное назначение сигналу в операторе одновременного назначения сигналов в части оператора архитектуры из агрегата. Ассоциация в совокупности является позиционной. Можно легко использовать именованную ассоциацию
-- red_buffer <= (red_buffer1, red_buffer2, red_buffer3, red_buffer4,
-- red_buffer5);
red_buffer <= (1 => red_buffer1, 2 => red_buffer2, 3 => red_buffer3,
4 => red_buffer4, 5 => red_buffer5);
Тип агрегата взят из контекста, здесь оператор присваивания, где red_buffer
имеет подтип lbuffer
.
Выбранный элемент композиции red_buffer
выбирается по имени индекса (red_buffer(i)
). Подэлемент red_buffer(i)
выбирается с помощью индексированного имени, где имя red_buffer(i)
, где 'i is a constant using 'j
из внутреннего цикла - red_buffer(i)(j)
.
Обратите внимание, что диапазон параметра j
не совпадает с индексным диапазоном подтипа элемента lbuffer
, здесь идентичного подтипу от RED_Buffer1
до RED_Buffer5
. Это означает еще одну потенциальную семантическую проблему с исходным кодом, цель которого здесь не ясна. Единственная подсказка, присутствующая в оригинальном коде, взята из linha_cond
, где linha означает строку на португальском или каталонском языке, указывающую, что j
используется для индексации внутри 'строки'.
Исходный код не работает по двум причинам
Во-первых, объект не может быть объявлен встроенным в VHDL. Параметр цикла for динамически разрабатывается из неявного объявления, параметр цикла виден только в последовательности операторов оператора цикла. Синтаксис не допускает дополнительных объявлений объектов.
Во-вторых, имя для объявления объекта передается в списке идентификаторов, состоящем из одного или нескольких идентификаторов, которые являются лексическими элементами (лексемами), которыми нельзя манипулировать программно.
Другие семантические проблемы с кодом вопроса
Назначение output
без времени не представляется полезным.
Оператор процесса - это независимо выполняемый параллельный оператор, в котором оператор цикла, содержащий присвоение тому же сигналу output
, перезапишет прогнозируемый выходной сигнал для элементов output
без какого-либо промежуточного промежутка времени. ,
Существует только одна запись в очереди прогнозируемого выходного сигнала для любого конкретного времени моделирования. Цикл моделирования состоит из обновлений сигналов с последующим возобновлением и последующей приостановкой любых процессов, чувствительных к обновлениям сигналов. Цель состоит в том, чтобы эмулировать параллелизм в аппаратных средствах при описании поведения с помощью последовательных операторов.
Здесь это будет означать, что output
будет обновлено до значения "01", если какое-либо из условий оператора if в развернутых циклах оценивается как ИСТИНА. Это, вероятно, не предполагаемое поведение (без дополнительной информации от первоначального автора).
Также обратите внимание, что output
не присваивается другое значение и нет значения по умолчанию или другого назначенного значения. Для синтеза это будет представлять задержку задержки на output
до тех пор, пока не будет найдено «1».
В обоих случаях это относится к неявной защелке для output
.
Эта проблема с примером кода не может быть решена без знания того, как он должен работать, и единственная подсказка, которая была показана здесь на Stackoverflow, на данный момент - это вопрос, удаленный пользователем , требующий 10K + репутация для доступа (другие увидят сообщение Page not found
, см. редакция 1 ).
Кроме того, понятия, передаваемые из языков программирования или языков сценариев, обычно не переносятся на языки описания аппаратного обеспечения, которые обычно являются формальными обозначениями, определяемыми самостоятельно (здесь в IEEE Std 1076, Справочное руководство по языку VHDL), требующими внедрения или настойчивых усилий для изучения. HDL обычно описывают аппаратное и структурное поведение, а не программную эквивалентность.