vhdl

2016-07-29 59 views
1

我有一個數組/矢量,我想通過處理第一個生成一個新的數組。我需要的一個簡單例子是,新數組中的每個第i個元素都是第一個元素的i-1,i和i + 1元素的總和。 我知道這可以非常容易地通過迭代遍歷數組以順序方式完成。 (如數學:new [i]:= old [i - 1] + old [i] + old [i + 1]),如果有任何形式的分配表達式可以推廣這個並行操作,其中i∈(1,n))。vhdl

+0

編寫一個返回初始化數組的函數。 –

+0

在您表達意圖處理1000個或更多元素的評論中,該數字和元素大小在有限資源FPGA中實現並且可能不適合。你沒有說明有多少元素和它們的大小,並告訴我們你的問題不清楚。沒有完整參數的理論問題很可能無法得到有用的答案。可能存在時間/複雜性的折衷,您可以在某些時鐘週期內使用更少的資源來完成該功能。 – user1155120

回答

0

由於你的問題是關於並行性的,我假設你對從你的VHDL描述中合成的硬件感興趣,而不是仿真。

並行性是的問題當所有這些添加發生?如果你的設計是同步的 - 比方說,一個名爲clk時鐘的上升沿的 - 那麼:

subtype word: unsigned(7 downto 0); 
type word_array is array(natural range <>) of word; 
signal a: word_array(0 to 15); 
signal b: word_array(1 to 14); 
... 
process(clk) 
begin 
    if rising_edge(clk) then 
    for i in 1 to 14 loop 
     b(i) <= a(i - 1) + a(i) + a(i + 1); 
    end loop; 
    end if; 
end process; 

將並行的14個值計算陣列b在每個時鐘的上升沿。它會根據需要實例化多個8位加法器來完成此操作。問題不在於你是否使用for循環或其他什麼東西,當這些操作發生時真的是?答案在於:在相同的時鐘週期

你可以重載"+"運營商對向量工作:

function "+"(a, b: word_array) return word_array is 
    constant n: positive := a'length; 
    variable va: word_array(0 to n - 1) := a; 
    variable vb: word_array(0 to n - 1) := b; 
    variable sum: word_array(0 to n - 1); 
begin 
    if n = 1 then 
    sum(0) := va(0) + vb(0); 
    else 
    sum := (va(0 to n/2 - 1) + vb(0 to n/2 - 1)) & 
      (va(n/2 to n - 1) + vb(n/2 to n - 1)); 
    end if; 
    return sum; 
end function "+"; 

,並用它來顯然譜寫出更加並行描述:

process(clk) 
begin 
    if rising_edge(clk) then 
    b <= a(0 to 13) + a(1 to 14) + a(2 to 15); 
    end if; 
end process; 

但它也就沒有什麼區別和由此產生的硬件將是相同的。

你也可以使用一個生成的語句做同樣的:

g: for i in 1 to 14 generate 
    process(clk) 
    begin 
    if rising_edge(clk) then 
     b(i) <= a(i - 1) + a(i) + a(i + 1); 
    end if; 
    end process; 
end generate g; 

但同樣,它將使用於合成沒什麼區別。