Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在vhdl中测量两个数据之间的距离_Vhdl - Fatal编程技术网

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

如何在vhdl中测量两个数据之间的距离,vhdl,Vhdl,计算列表1中每个元素的位置与列表2中相同元素的位置之间的距离,然后在vhdl中找到归一化距离 首先,我们将创建mem1(由每个数据输入的地址组成),即地址从1,2,3,4。。。。要结束mem1数据输入,请单击“确定” mem2(由每个数据输入的地址组成),即1,2,3,4….的地址。。。。t0 mem2数据输入结束,正常 检查从mem1输入的任何数据是否=从mem2输入的任何数据。 即每个元件在mem1中的位置和同一元件在mem2中的位置 因此,两个mem中相同元素的地址将不同 地址差异将作为距

计算列表1中每个元素的位置与列表2中相同元素的位置之间的距离,然后在vhdl中找到归一化距离 首先,我们将创建mem1(由每个数据输入的地址组成),即地址从1,2,3,4。。。。要结束mem1数据输入,请单击“确定” mem2(由每个数据输入的地址组成),即1,2,3,4….的地址。。。。t0 mem2数据输入结束,正常 检查从mem1输入的任何数据是否=从mem2输入的任何数据。 即每个元件在mem1中的位置和同一元件在mem2中的位置 因此,两个mem中相同元素的地址将不同 地址差异将作为距离度量。 即搜索相似性,计算列表1和列表2之间的距离 我如何在vhdl代码中做到这一点???
有什么帮助吗?

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

你应该考虑一些拐角的情况……如果数据字在内存中出现两次怎么办?数据是否按顺序存储在存储器中

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


这正是我在概念上处理它的方式。祝您好运。

如果我理解正确,您希望生成一个数组,其中包含从数组_1中的每个元素到数组_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;
过程(时钟、复位)被禁用
变量i,j:0到7的整数范围;
开始
如果重置,则
i:=0;
j:=0;
距离(0);
elsif上升沿(时钟),然后
如果(向量_1(i)=向量_2(j)),那么

距离(i)我按照你的建议编写了一个代码,但是我有同样的问题,什么是错误类型的距离与类型的距离不兼容-

 library IEEE;
使用IEEE.STD_LOGIC_1164.all

包装样品是 类型样本是标准逻辑向量(0到7)的数组(0到255)

末端样品

entity measure is
港口( 时钟:标准逻辑; A1:样品中; A2:样品中; 距离:出样); 末端测量; 行为度量的体系结构是 信号d:样品; 函数距离(A1,A2:样本)返回样本为 可变距离:样本; 开始 对于1'范围循环中的i 对于A2'范围循环中的j 如果(A1(i)=A2(j)),那么 距离:=(j-i); 如果结束; 端环; 端环

return distances;
结束;
结束行为

这需要合成吗?如果是,你的绩效目标是什么?列表有多大,需要进行多少比较?有许多权衡会影响任何解决方案的性能和大小。是的,nedd是可合成的,我们尝试这样做,但我想知道它是否正确?首先,我们需要一个ram组件。可以使用下面的推理或实例化它是简单的双(单独的读地址/写地址)您仍然需要一些性能目标和关于列表有多大的信息。如果它们很小,你可以用逻辑来构建它。如果它们很大,则需要使用内部内存进行存储。如果它们很大,你需要外部内存,可能需要一个聪明的访问模式/缓存来最大限度地利用外部带宽。Hi martin,两个表将是std_逻辑_向量(0到7)的数组(0到255),我将使用fbga内部ram,我将计算(s1,s2),(s1,s3)和(s2,s3)之间的距离然后找到平均值,然后用它来做另一件事。这不是重复的单词,表1是从用户A处采集的一些样本,用三角图表示他所写的任何文本,后面的数字是他键入这些三角图所需的时间,例如(acs--125毫秒,asd--200毫秒……)构建排序表1(S1),(根据时间排序),表2(S2)对于相同的三角图,但在不同的位置,比较这些样本,并找到两个样本中相同三角图之间的距离,即s1中每个元素的位置和s2中相同元素的位置,d(s1,s2),我应该用vhdl代码进行设置,是的,您是对的,但如果向量是std_逻辑_向量(0到7)距离的类型与-的类型不兼容。您可以使用函数to_integer(slv)轻松地将标准逻辑向量转换为整数在ieee.numeric\u std包中定义。rick,我如何为ram制定解决方案?这是针对移位寄存器的。上述建议可用于任何类型的阵列,无论是ram还是移位寄存器。无论如何,您不能像对具有单个读取端口的典型ram那样使用它。在这种情况下,最简单的方法是计算一个距离每个时钟边缘的ce值。我编辑了答案以包含一个序列化版本。此版本一次只读取每个向量的一个元素,并且适合于每个输入向量存储在同步块RAM中的实现。现在,您的工作是计算det