我几乎是VHDL的初学者,所以如果问题看起来很傻,请不要介意我,如果我不遵守本论坛的规则,请告诉我。 但是,我还没有在互联网上发现同样的问题。
这里,我有一个巨大的寄存器(1600位),我想写一个64位的块。块的地址由theta_io_ctrl的位确定。 theta_reg_bus_out是一个64位的std_logic_vector。
i1 <= 64*to_integer(unsigned(theta_io_ctrl(10 downto 6)));
for i in 63 downto 0 loop
i12 <= i1+i;
next_mem2(i12) <= theta_reg_bus_out(i);
end loop; -- i
此代码的问题是,它只考虑位0,而不考虑其他位。 这里,Modelsim告诉我theta_reg_bus_out = 00000000000000D3。 但是,当我检查相应地址的next_mem2中的内容时,我得到0000000000000001。
我也尝试过写#34; 0到63&#34;代替。然后,它只考虑位63。
我哪里错了?提前谢谢!
答案 0 :(得分:0)
i1
和i12
必须是信号,因为您通过信号分配为它们分配。 (下次你问一个问题时,最好构建一个MCVE)。信号不是变量:
i)直到所有进程暂停(无论是点击wait
语句还是从底部删除),它们都不会更新
ii)如果在所有进程挂起之前将值重新分配给信号,它只会覆盖先前分配的值。
因此,在您的代码中,当执行此行(i12 <= i1+i;
)时,信号i1
尚未更新。然后,在循环中,所有先前的信号i12
赋值都会被循环最后一次迭代的赋值覆盖。这就是为什么“只考虑位0”或第63位如果使用0 to 63
。
因此,要么i1
和i12
变量。 VHDL中的变量表现得像任何其他语言的变量,并立即更新。 (您将不得不进行一些谷歌搜索以找出变量,您不能简单地将其替换为另一个因为赋值运算符不同而且变量只能在流程中声明。)
或者只是将代码简化为:
for i in 63 downto 0 loop
next_mem2(i+64*to_integer(unsigned(theta_io_ctrl(10 downto 6)))) <= theta_reg_bus_out(i);
end loop; -- i