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