将长std_logic_vector与零进行比较

pow*_*est 11 vhdl

在模拟中,这是完美的.这是检查可合成代码的零的最佳方法.会产生什么资源?

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映射(具有最佳资源利用率),是否有任何其他最佳方式来实现此解决方案.

我会更了解所使用的资源.

Mor*_*mer 7

如果范围可用,如示例代码中所示,那么建议解决方案看起来很好,我希望合成工具可以处理这样的构造.

如果范围不可用,那么与零比较可以像:

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').


Mar*_*son 6

没有办法对合成产生或多或少的感觉.编写最能表达您意图的代码.

如果要比较所有零的向量,以下应该都会产生相同的结果,或者您应该对该工具提出严重的错误!

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 :)