需要知道是否组合

时间:2014-02-02 00:00:01

标签: vhdl

我编写了一个代码,用于计算给定的4位std_logic_vector中的1的数量,并且输出必须以2位向量显示。我写的代码是这样的:

count <= A + "01" when input(0) = '1' else A;
A     <= B + "01" when input(1) = '1' else B;
B     <= C + "01" when input(2) = '1' else C;
C     <=     "01" when input(3) = '1' else "00";

代码运行良好,但我想知道代码是纯粹组合和可合成的,因为我怀疑是否&#39; +&#39;运算符是组合还是不组合。 在我看来&#39; +&#39;运算符是组合的,因为它是使用全加器或半加器电路实现的。是&#39; +&#39;限制在组合电路中的整数和实数值操作数?

1 个答案:

答案 0 :(得分:2)

+运算符是组合和可合成的。 +可以运作 直接在integerreal上,以及std_logic_vector上的操作 需要使用包以包含必要的功能。从你的代码看起来你已经使用过:

library ieee;
use ieee.std_logic_unsigned.all;

即使有了名称,这也是一个非IEEE标准软件包,也是替代品 IEEE标准包为ieee.numeric_std

请注意,根据您的代码,看起来您使用的是2位向量 计算4位向量中1的数量,所以如果所有4位都是1,则为2位 向量将溢出并显示值0。

计算1的替代实现是创建一个使用的函数 ieee.numeric_std包,结果长度为3位,这可能看起来像 像:

function cnt_1s(slv : std_logic_vector) return std_logic_vector is
  variable res_v : std_logic_vector(2 downto 0);
begin
  res_v := (others => '0');
  for idx in slv'range loop
    if slv(idx) = '1' then
      res_v := std_logic_vector(unsigned(res_v) + 1);
    end if;
  end loop;
  return res_v;
end function;

该函数也是可综合的,因为循环展开以实现 所需的硬件数量,就像问题中的显式代码一样。该 然后可以使用函数将count用于:

count <= cnt_1s(input);