如何测量vhdl中两个数据之间的距离

时间:2014-01-25 02:27:39

标签: vhdl

计算list1中每个元素的位置与list2中相同元素的位置之间的距离,然后在vhdl中找到标准化距离 首先,我们将生成mem1(由每个数据输入的地址组成),即从1,2,3,4 ....到mem1数据输入结束的地址,ok mem2(由每个数据输入的地址组成),即从mem2数据输入的1,2,3,4 .... t0结束的地址,确定 检查从mem1输入的任何数据是否是从mem2输入的任何数据。 即mem1中每个元素的位置以及mem2中相同元素的位置 因此,同一元素的地址在两个mem中会有所不同 地址差异将是距离测量。 即搜索相似性,计算list1和list2之间的距离 我如何在vhdl代码中执行此操作??? 请帮忙???

3 个答案:

答案 0 :(得分:1)

你的方法听起来很合理。我会设计一个实例化一块内存的实体。输入将是您要查找的数据。输出将是数据的位置,以及指示是否找到数据的信号。从存储器中读出所有数据需要许多时钟周期。时钟周期数等于存储器的深度。因此,如果您的内存中有10个数据字,则需要10个时钟才能读取所有单词。

你应该考虑一些极端情况......如果数据字在内存中两次怎么办?数据是按顺序存储在内存中的吗?

一旦你想出了所有这些,就在更高级别的文件中实例化其中两个组件。此文件计算两个数据位置之间的距离。

这就是我如何在概念上解决它。祝你好运。

答案 1 :(得分:0)

如果我理解正确,你想要产生一个数组,其中包含array_1中每个元素到array_2中保持相同值的元素的距离。

如果是这样,这是对可能的解决方案的第一次尝试:

function individual_distances(vector_1, vector_2: integer_vector) return integer_vector is
    variable distances: integer_vector(vector_1'range);
begin
    for i in vector_1'range loop
        for j in vector_2'range loop
            if (vector_1(i) = vector_2(j)) then
                distances(i) := j - i;
            end if;
        end loop;
    end loop;

    return distances;
end;

以下是一些随机数组的示例输出:

individual_distances( (1, 2, 3, 4, 5), (5, 4, 3, 2, 1) );  --> (4, 2, 0, -2, -4)
individual_distances( (1, 2, 3, 4), (4, 3, 2, 1) );        --> (3, 1, -1, -3)
individual_distances( (1, 2, 3), (1, 2, 3) );              --> (0, 0, 0)

正如Martin Thompson所说,此解决方案是否适用于您的情况取决于您的性能目标和列表的大小。实际上,这可以适用于中小型列表。如果您的列表很大,您应该研究架构选择。例如,算法的完全序列化版本将花费N ^ 2个时钟周期。下面的示例需要64个周期来计算两个数组之间的距离,每个数组包含8个元素:

process (clock, reset) is
    variable i, j: integer range 0 to 7;
begin
    if reset then
        i := 0;
        j := 0;
        distances <= (others => 0);
    elsif rising_edge(clock) then
        if (vector_1(i) = vector_2(j)) then
            distances(i) <= abs(j - i);
        end if;
        if i < 7 then
            i := i + 1;
        else
            i := 0;
            j := (j + 1) mod 8;
        end if;
    end if;
end process;

存在其他中间解决方案,例如仅序列化外部循环。如果您需要性能,还可以考虑使用流水线技术。

以上代码是可综合的,只需记住根据您的设计要求约束范围。

答案 2 :(得分:0)

我做了一个代码作为你的建议rick,但我有同样的问题,是什么错误类型的距离与类型不兼容 -

 library IEEE;

使用IEEE.STD_LOGIC_1164.all;

包装样品是 type sample是std_logic_vector(0到7)的数组(0到255);

结束样本;

entity measure is

端口(      CLK:STD_LOGIC;       A1:样品中;       A2:样品;       距离:出样本); 结束措施; 建筑行为衡量标准是 信号d:样本; 函数距离(A1,A2:样本)返回样本是     可变距离:样本; 开始     我在A1'范围循环中         对于A2'范围循环中的j             if(A1(i)= A2(j))然后                 距离:=(j - i);             万一;         结束循环;     结束循环;

return distances;

端; 结束行为;