2014-01-25 85 views
0

計算list1中每個元素的位置和list2中相同元素的位置之間的距離,然後在vhdl中找到規範化的距離首先,我們將mem1(由每個數據輸入的地址),即從1,2,3,4 ...到mem1數據輸入結束的地址,ok mem2(由每個數據輸入的地址組成),即來自1,2,3,4的地址.... t0結束mem2數據輸入,ok 檢查是否有任何從mem1輸入的數據=從mem2輸入的任何數據。 也就是說mem1中每個元素的位置以及mem2中相同元素的位置 因此,兩個mem中相同元素的地址不同 地址差異將是距離度量值。 即搜索相似性,計算列表1和列表2之間的距離 如何在vhdl代碼中做到這一點? 請幫忙嗎?如何測量兩個數據之間的距離vhdl

+0

這是否需要合成?如果是這樣,你的績效目標是什麼?名單有多大,需要進行多少次比較?有許多交易會影響任何解決方案的性能和規模。 –

+0

是nedd是可合成的,我們試圖做到這一點,但我想知道它是否正確?首先我們需要有一個ram組件。可以使用下面的推理或實例化它是簡單的雙重(單獨讀取地址/寫入地址) – basma

+1

您仍然需要一些性能目標和有關列表有多大的信息。如果它們很小,那麼可以將它建立在邏輯之外。如果它們很大,則需要使用內部存儲器進行存儲。如果他們是巨大的,你需要外部存儲器和可能是一個聰明的訪問模式/高速緩存,以最大限度地利用外部帶寬 –

回答

1

您的方法聽起來合乎邏輯。我會設計一個實例化一塊內存的單個實體。輸入將是您正在查找的數據。輸出將是數據的位置,以及指示數據是否被找到的信號。需要多個時鐘週期才能讀出存儲器中的所有數據。時鐘週期的數量將等於存儲器的深度。因此,如果您的記憶中有10個數據字,則需要10個時鐘來讀取所有字。

你應該考慮的角落案例......如果數據字在內存中兩次會怎樣?數據是否按順序存儲在內存中?

一旦你想出所有這些,在更高級別的文件中實例化這些組件中的兩個。該文件計算兩個數據位置之間的距離。

這就是我將如何解決它的概念。祝你好運。

+0

沒有重複的單詞,table1是一些從用戶A取得的樣本代表他寫的任何文本的三字符,並且在它後面的數字是他輸入這些三字母的時間,例如(acs - 125 ms,asd - 200 ms ........)build一個排序後的表格1(S1),(根據時間排序),表格2(S2)相同的三元組,但在不同的位置比較這些樣本,並找到兩個樣本的相同三元組之間的距離,即Ie在S1中的每個元素,並且在同一元件在s2的位置,d的位置(S1,S2)中,i應該使它在VHDL代碼, – basma

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) 

正如馬丁·湯普森指出,這種解決方案是否可用在你的情況取決於你的性能目標和列表的大小。實際上,這可能適用於中小型列表。如果你的名單很大,你應該研究建築選擇。例如,該算法的完全序列化版本將花費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; 

其他中間解決方案存在的,如序列化僅外部循環。如果你需要性能,你也可以考慮流水線。

上述代碼是可綜合的,只要記住根據您的設計要求限制範圍。

+0

是,你是對瑞克,但如果載體是std_logic_vector(0到7 )距離類型將如何與 - 類型不兼容。 – basma

+0

使用包ieee.numeric_std中定義的函數to_integer(slv),可以輕鬆地將std_logic_vector轉換爲整數。 – rick

+0

我怎樣才能讓你的RAM解決方案,麥垛,這是移位寄存器 – basma

0

我做一個代碼爲您的建議瑞克,但我有同樣的問題,什麼是距離的錯誤類型與類型的不兼容 -

library IEEE; 

使用IEEE.STD_LOGIC_1164.all;

包樣品是 類型樣品陣列(0到255)的std_logic_vector(0至7);

端樣本;

entity measure is 

端口( CLK:STD_LOGIC; A1:在樣品; A2:在樣品; 距離:出樣品); 結束措施; 體系結構行爲的度量是 信號d:樣本;函數距離(A1,A2:樣本)返回樣本爲 可變距離:樣本; (A1(i)= A2(j)) distance:=(j-i); end if; end loop; end loop;

return distances; 

end; 結束行爲;