我是vhdl的新手,我找不到解决这个微不足道的问题的好方法。我正在寻找一种重置整数数组的好方法。
type integer_vector is array (0 to N) of integer;
...
process(...)
variable tab: integer_vector;
...
if reset = '1' then
tab := ??
是否有类似tab <= (others=>(others=>'0'))
的内容适用于slv?我不想使用for循环,因为合成不支持这个。
答案 0 :(得分:2)
Morten的代码看起来还不错,所以请提一下报告此内容的综合工具和版本。一些综合工具可能过于原始而无法接受此代码:在其他情况下,可能存在合成选项来启用必要的行为。 (还要检查你是否正确地遵循了他的指示:(others => 0);
要求整数,而(others => '0');
要求位。)
然而,对于综合,请注意两件事:
(a)范围整数会更好;它试图生成32位整数(虽然后期合成阶段可能会修剪它们)
例如。
subtype my_int is natural range 0 to 99; -- needs 7 bits
type my_int_vector is array ( 0 to N) of my_int;
可能会产生更小的硬件,并且肯定会让读者清楚预期会出现较小的整数。
(b)为了在单个操作中重置整个阵列,它需要在寄存器中实现整个批次,这可以产生巨大的硬件。
如果安排在每个时钟周期重置一个位置(通常在状态机中),通过整个阵列的计数器索引,那么阵列可以实现为块存储器,从而节省大量空间。
答案 1 :(得分:0)
当数组元素为integer
时,您可以执行以下操作:
tab := (others => 0);
示例中的内部(others=>'0')
会将'0'
分配给数组的每个std_logic
中的所有std_logic_vector
元素,因此当元素为integer
时,只是0
,如上所示。