使用VHDL我想要一些寄存器,每个寄存器存储16位。 所以我发现VHDL有一个内置数组,我想用它在iy中的每个元素中存储16位所以我想知道VHDL是否将这个数组映射到实际寄存器?
答案 0 :(得分:3)
简短的回答是否定的 - 数组类型没有映射到寄存器。
答案很长:
VHDL中的数组类型只是同一类型元素的索引集合。在您的情况下,您可能使用数组作为寄存器库的输出。
所以,假设你有一组8个寄存器,每个寄存器有16位。该存储体的输出将是16位向量的数组(大小为8)。该寄存器库的组件声明如下所示:
component reg8x16 port( clock: in std_logic; reset: in std_logic; enable: in std_logic; rout : out r_array(0 to 7) ); end component;
rout
是您从注册银行注册的输出数组。因此,您可以使用类型为rout(0)
的{{1}}从银行取消引用寄存器0的输出。
另外,不要忘记在某处声明数组类型(通常在包文件中)。它看起来像是:
std_logic_vector(15 downto 0)
type r_array is array (integer range <>) of std_logic_vector(15 downto 0);
语句是数组索引范围的一种占位符 - 稍后将在使用数组类型时填充(例如在上面的组件声明中)。
我不确定这是否能回答你的问题。我不会详细介绍如何创建reg8x16组件。基本上,您只需创建一个16位寄存器,其输出类型为(integer range <>)
(您可以在线查找如何执行此操作...这是非常基本的VHDL)。然后,您只需实例化其中的8个寄存器,并将它们放在名为std_logic_vector(15 downto 0);
的组件中。
答案 1 :(得分:3)
数组就像任何其他变量或信号一样:如果你描述的行为意味着它必须记住从一个时钟滴答到另一个时钟滴滴的状态,那么触发器(或者存储器块,如果条件是正确的)将由合成器。
答案 2 :(得分:1)
任何具有有效范围的数组都将映射到生成的网表中的连线。这很明显 - 硬件只包含门和线。类似于(3 downto 0)(1到0)的东西会产生4x2或8位大小的线。现在,您将单个访问(如(3)(1))映射到此1维数组中的索引。所以a(3)(1)基本上是(7)。
答案 3 :(得分:0)