2016-07-29 31 views
1

私は配列/ベクトルを持っています。最初のものを処理することによって新しい配列を生成したいと思います。私が必要とする簡単な例は、新しい配列のすべてのi番目の要素は、最初のものからのi-1、i、およびi + 1要素の合計です。 これは配列を繰り返し処理することで、非常に簡単にシーケンシャルな方法で行うことができます。 new [i]:= old [i-1] + old [i] + old [i + 1]のように、これを一般化してこれを並列演算にする式を割り当てることがあれば、ここで、i∈(1、n))。vhdlの一般化集合体

+0

初期化された配列を返す関数を作成します。 –

+0

コメントでは、有限のリソースFPGAで1000以上の要素、その数と要素サイズの色の実装を扱うことを表明しており、適合しない可能性があります。あなたはいくつの要素もそのサイズも示しておらず、それはあなたの質問が不明であることを示しています。完全なパラメータを持たない理論的な質問は、有益な答えを得ることができない可能性が高い。機能を完成させるために、いくつかのクロック数でより少ないリソースを使用できる時間/複雑さのトレードオフがあります。 – 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; 

は、クロックの各立ち上がりエッジで配列bに14個の値並列に計算されます。そして、これを行うために必要な数の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; 

しかし、再び、それはシンセサイザーのために違いはありませんでしょう。