Vhdl 将std_逻辑_向量的所有位相加

Vhdl 将std_逻辑_向量的所有位相加,vhdl,xilinx,vivado,Vhdl,Xilinx,Vivado,我想把n位std_逻辑_向量的所有位相加。最简单的方法是什么? 例如:一个库ieee; 使用ieee.std_logic_1164.all; 使用ieee.numeric_std.all; ... --基于循环的 函数hw_循环(v:std_逻辑_向量)返回自然值 变量h:自然变量; 开始 h:=0; 对于v'range循环中的i 如果v(i)=‘1’,则 h:=h+1; 如果结束; 端环; 返回h; 端函数hw_环; ... --基于日志树,使用递归函数: 函数hw_树(v:std_逻辑_向量

我想把n位std_逻辑_向量的所有位相加。最简单的方法是什么? 例如:一个
库ieee;
使用ieee.std_logic_1164.all;
使用ieee.numeric_std.all;
...
--基于循环的
函数hw_循环(v:std_逻辑_向量)返回自然值
变量h:自然变量;
开始
h:=0;
对于v'range循环中的i
如果v(i)=‘1’,则
h:=h+1;
如果结束;
端环;
返回h;
端函数hw_环;
...
--基于日志树,使用递归函数:
函数hw_树(v:std_逻辑_向量)返回自然值
恒定尺寸:自然:=v'长度;
常数vv:std_逻辑_向量(大小-1到0):=v;
变量h:自然变量;
开始
h:=0;
如果尺寸=1且vv(0)=“1”,则
h:=1;
如果大小>1,则
h:=hw_树(vv(大小-1到大小/2))+hw_树(vv(大小/2-1到大小/0));
如果结束;
返回h;
端函数hw_树;
...
信号A:标准逻辑向量(7到0);
信号B0、B1:标准逻辑向量(2到0);
...

B0为什么不发布您编写的代码,并告诉我们您认为它有什么问题?您想如何添加位?是否用于将其转换为整数值?它是用来找出向量包含多少个1的吗?这是在VHDL中使用递归函数的一种巧妙方法-它会生成一个累加器树,遍历所有位(试图模糊地记住它是如何完成的)。试试看。这很简单。记住:即使是波纹进位也会被映射到FPGA LUT。它被称为汉明权重。
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
...
-- Loop-based
function hw_loop(v: std_logic_vector) return natural is
  variable h: natural;
begin
  h := 0;
  for i in v'range loop
    if v(i) = '1' then
      h := h + 1;
    end if;
  end loop;
  return h;
end function hw_loop;
...
-- Log-tree-based, using a recursive function:
function hw_tree(v: std_logic_vector) return natural is
  constant size: natural := v'length;
  constant vv: std_logic_vector(size - 1 downto 0) := v;
  variable h: natural;
begin
  h := 0;
  if size = 1 and vv(0) = '1' then
    h := 1;
  elsif size > 1 then
    h := hw_tree(vv(size - 1 downto size / 2)) + hw_tree(vv(size / 2 - 1 downto 0));
  end if;
  return h;
end function hw_tree;
...
signal A: std_logic_vector(7 downto 0);
signal B0, B1: std_logic_vector(2 downto 0);
...
B0 <= std_logic_vector(to_unsigned(hw_loop(A), 3));
B1 <= std_logic_vector(to_unsigned(hw_tree(A), 3));
...