使用其他矢量索引创建一个矢量作为VHDL中的元素

时间:2013-09-04 12:47:39

标签: vector indexing vhdl

我有一个像这样的std_logic_vector作为输入:v1 =“10001010”并且我想创建另一个这样的向量:v2 = X“00000731”,其中X“7”,X“3”和X“ 1“表示第一个向量(v1)的索引,其中值为'1'。

v1(1)='1',v1(2)='0',v1(3)='1'等。

请帮我一些可以创建v2的编码示例。

3 个答案:

答案 0 :(得分:0)

类似的东西:

variable base : natural := 0;
....
v2 <= (others => '0');
for i in v1'right to v1'left loop
  if v1(i) = '1' then
    v2(base+3 downto base) = to_unsigned(i,4);
    base := base + 4;
  end if;
end for;

答案 1 :(得分:0)

v2可以使用此函数生成,v1为std_logic_vector(8 - 1 downto 0):

library ieee;
use ieee.numeric_std.all;
...
function v1_to_v2(v1 : std_logic_vector) return std_logic_vector is
  variable v2_v   : std_logic_vector(4 * v1'length - 1 downto 0);
  variable ones_v : natural;
begin
  ones_v := 0;
  v2_v := (others => '0');
  for idx in 0 to v1'left loop
    if v1(idx) = '1' then
      v2_v(4 * ones_v + 3 downto 4 * ones_v) := std_logic_vector(to_unsigned(idx, 4));
      ones_v := ones_v + 1;
    end if;
  end loop;
  return v2_v;
end function;

该功能可以在Altera Cyclone IV E中关闭~220 MHz的时序 (EP4CE6E22A7)FPGA,当v1和v2上有触发器时。

这是否是可接受的解决方案取决于您的详细问题 正试图解决。

此外,并非您为v2选择的格式将导致v2 = 对于“00000001”,当v1 =“00000000”时为X“00000000”。这可能没问题,具体取决于 关于问题的细节。

答案 2 :(得分:0)

过去我们遇到过类似的问题。我们找到的最佳解决方案是为v2使用移位寄存器:循环遍历v1的元素,只要在v1中找到'1',就会移入循环索引。

这是一个能够满足您需求的功能:

  type output_type is array (7 downto 0) of unsigned(2 downto 0);

  function find_ones(v1: std_logic_vector(7 downto 0)) return output_type is
    variable v2: output_type := (others => "000");
  begin
    for i in v1'range loop
      if v1(i) = '1' then
        v2 := v2(6 downto 0) & to_unsigned(i, 3);
      end if;
    end loop;
    return v2;
  end;  

  -- results:
  --   find_ones("00000000") --> "000_000_000_000_000_000_000_000"
  --   find_ones("11111111") --> "111_110_101_100_011_010_001_000"
  --   find_ones("10001010") --> "000_000_000_000_000_111_011_001"

由于此解决方案基于移位寄存器,因此很容易以时钟方式实现,并且如果需要,可以一次处理一个元素,甚至可以管理整个过程。