我编写了一个代码,用于计算给定的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;限制在组合电路中的整数和实数值操作数?
答案 0 :(得分:2)
+
运算符是组合和可合成的。 +
可以运作
直接在integer
和real
上,以及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);