我有一个像这样的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的编码示例。
答案 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"
由于此解决方案基于移位寄存器,因此很容易以时钟方式实现,并且如果需要,可以一次处理一个元素,甚至可以管理整个过程。