Цель сигнальных задания, которые являются агрегаты были законным все вместе увидеть IEEE Std 1076-1987 8.3 Signal Assignment Statement. Независимо от того, поддерживался ли он конкретным продавцом инструмента в определенный момент времени, это отдельный вопрос.
Операторы сдвига присутствуют с -1993 и предопределены для одномерных массивов (композитов) типа бит (бит_вектор).
ror определен для подписанных и неподписанных композитных типов в пакете numeric_std as is to_integer.
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity rot_display is
end entity;
architecture foo of rot_display is
signal d0: std_logic := '1';
signal d1: std_logic := '1';
signal d2: std_logic := '0';
signal d3: std_logic := '0';
signal d4: std_logic := '0';
signal d5: std_logic := '1';
signal d6: std_logic := '0';
signal d7: std_logic := '1';
signal rot_select: std_logic_vector(2 downto 0) := "000";
type rot is array (integer range 0 to 7) of std_logic_vector(2 downto 0);
constant rotation: rot :=
("111", "110", "101", "100", "011", "010", "001", "000");
begin
TEST:
process
begin
wait for 10 ns;
for i in rot'range loop
rot_select <= rotation(i);
wait for 1 ns;
(d0,d1,d2,d3,d4,d5,d6,d7) <=
std_logic_vector (
unsigned'(d0,d1,d2,d3,d4,d5,d6,d7)
ror
to_integer(unsigned(rot_select))
);
wait for 9 ns;
end loop;
-- put (d0,d1,d2,d3,d4,d5,d6,d7) back to original position by completing
-- modulo 8 shift (total of 32 shifts)
rot_select <= "100";
wait for 1 ns;
(d0,d1,d2,d3,d4,d5,d6,d7) <=
std_logic_vector (
unsigned'(d0,d1,d2,d3,d4,d5,d6,d7)
ror
to_integer(unsigned(rot_select))
);
wait for 9 ns;
wait; -- stops simulation
end process;
end architecture;
Использование to_integer может подвергнуть вас metavalue вопросы, что этот тест надуманный, чтобы избежать.
Ожидание 1 нс-заявлений гарантирует, что результат новых значений rot_select, а не предыдущего, за счет обеспечения цикла симуляции, сначала обновляется rot_select. Ожидание 9 нс-операторов выводит транзакции на время моделирования.
Последнее rot_select назначение и последующее вращение демонстрирует значение (d0, d1, d2, d3, d4, d5, d6, d7) не была изменена путем завершения следующего по модулю 8 число сдвиг позиции сдвигов.
Вы можете ввести свою собственную функцию преобразования ror и целого в исключенные преобразования типов. Ваша собственная функция ror может принимать расстояние как standard_logic_vector.
Вы говорите, что '(d0, d1, d2, d3, d4, d5, d6, d7) <= d7 & d0 & d1 & d2 & d3 & d4 & d5 & d6;' должно быть законным даже в VHDL-2002 , и причина, по которой ModelSim сообщает об ошибке в связи с отсутствием поддержки инструмента? –
@MortenZdk - Стоит прочитать историю отчетов о проблемах, которые ищут конфликты в интерпретациях. Конечно, левая сторона вашего назначения сигнала действительна. Любая проблема возникла бы с правой стороны и была бы ли «тип агрегата должен определяться из контекста, исключая сам агрегат, но включающий тот факт, что тип агрегата должен быть составным» (IEEE Std 1076-1993 , 8.4, Операция присвоения сигналов, параграф 7). Для меня это похоже на действительный VHDL. Работает для d0, .. как тип BIT, RHS для std_logic требует квалифицированного выражения. – user1155120
@MortenZdk Квалифицированное выражение, поскольку «&» может иметь конфликты перегрузки между std_ulogic_vector и std_logic_vector, которые -2008 вылечивает, делая std_logic_vector разрешенным подтипом. Любой инструмент, который просто жалуется на левую сторону, вероятно, ошибочен. – user1155120