在模拟中,这是完美的.这是检查可合成代码的零的最佳方法.会产生什么资源?
signal vector_slv : std_logic_vector(2048 downto 0);
...
if (vector_slv = (vector_slv'range => '0')) then
-- do something...
Run Code Online (Sandbox Code Playgroud)
考虑到h/w映射(具有最佳资源利用率),是否有任何其他最佳方式来实现此解决方案.
我会更了解所使用的资源.
如果范围可用,如示例代码中所示,那么建议解决方案看起来很好,我希望合成工具可以处理这样的构造.
如果范围不可用,那么与零比较可以像:
library ieee;
use ieee.numeric_std.all;
...
if unsigned( {std_logic_vector expression of any length} ) = 0 then
-- do something...
Run Code Online (Sandbox Code Playgroud)
我希望合成工具处理这个与比较相同(vector_slv'range => '0').
没有办法对合成产生或多或少的感觉.编写最能表达您意图的代码.
如果要比较所有零的向量,以下应该都会产生相同的结果,或者您应该对该工具提出严重的错误!
signal vector_slv : std_logic_vector(2048 downto 0);
constant zeros : std_logic_vector(vector_slv'range) := (others => '0');
...
if vector_slv = (vector_slv'range => '0') then
-- do something...
if vector_slv = zeros then
-- do something...
if unsigned(vector_slv) = to_unsigned(0, vector_slv'length) then
-- do something...
Run Code Online (Sandbox Code Playgroud)
实际上对于适合整数的较短向量:
if intvar = 0 then
Run Code Online (Sandbox Code Playgroud)
将与任何32位向量比较完全相同.
(顺便说一句,注意if条件不需要括号- VHDL不是C :)