聚合的信号分配目标一直是合法的,请参阅 IEEE Std 1076-1987 8.3 Signal Assignment Statement。它们是否在特定时间得到特定工具供应商的支持是一个单独的问题。
移位运算符自 -1993 年以来一直存在,并且是为位 (bit_vector) 类型的一维数组(复合)预定义的。
ror 是为包 numeric_std 中的有符号和无符号复合类型定义的,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 可以让您接触到此测试用例旨在避免的元值问题。
等待 1 ns 语句确保您看到新 rot_select 值的结果,而不是之前的结果,方法是确保模拟周期首先更新 rot_select。等待 9 ns 语句将事务排列到模拟时间。
最后一个 rot_select 分配和随后的旋转表明 (d0,d1,d2,d3,d4,d5,d6,d7) 的值没有通过完成下一个模 8 移位位置移位而改变。
您可以引入自己的 ror 和整数转换函数来消除类型转换。您自己的 ror 函数可以接受距离作为标准逻辑向量。