6

VHDL プロジェクトで作業していますが、ベクトルの長さを計算する問題に直面しています。ベクトルの長さ属性があることは知っていますが、これは私が探している長さではありません。たとえば、私はstd_logic_vector

    E : std_logic_vector(7 downto 0);  

それから

    E <= "00011010";

そうlen = E'length = 8ですが、私はこれを探していません。len左端のゼロを捨てて計算したいので、len = 5;

「0」のビットを左から右にチェックすることで for ループを使用でき、「1」のビットが発生した場合は停止できることがわかっています。しかし、それは効率的ではありません。1024 以上のビットがあり、回路が遅くなるからです。効率的な方法で長さを計算する方法やアルゴリズムはありますか? log(n) レベルのゲートの組み合わせゲートを使用するなど ( n = ビット数 )。

4

4 に答える 4

5

対数 (基数 2) と非常によく似た「ビット カウント」で行うこと。

これは、信号を表現するのに必要なビット数を計算するために VHDL で一般的に使用されます。たとえば、最大 N 個の要素を RAM に格納する場合、その RAM のアドレス指定に必要なビット数は ceil(log2(N)) です。このために私は使用します:

function log2ceil(m:natural) return natural is
begin -- note: for log(0) we return 0
    for n in 0 to integer'high loop
        if 2**n >= m then
            return n;
        end if;
    end loop;
end function log2ceil;

通常、これは定数を使用して合成時に実行する必要があり、速度は問題ではありません。ただし、本当に必要な場合は、FPGA ロジックを生成することもできます。

他の人が述べたように、VHDL の「for」ループはルックアップ テーブルを生成するために使用されるだけで、信号パスが長いために遅くなる可能性がありますが、それでも 1 つのクロックしか必要としません。起こり得ることは、最大クロック周波数が低下することです。通常、これは、64 ビット (1024 ビットと述べました) よりも大きいベクトルで動作し、100 MHz よりも高速なクロックで動作する場合にのみ問題になります。おそらく、シンセサイザーはこれがあなたの問題であるとすでにあなたに言っているかもしれません。そうでなければ、最初に試してみることをお勧めします。

次に、操作を複数のクロックに分割し、中間結果を FF に格納する必要があります。(コードを再構成してシンセサイザーの裏をかこうとすることを前もって忘れてしまいます。ルックアップ テーブルはテーブルです。このテーブルの値をどのように生成するかが重要なのはなぜですか? " 値がある場合)。

速度が重要な場合は、最初のクロックを使用してすべての 16 ビット ブロックを並行して (相互に独立して) チェックし、次に 2 番目のクロック サイクルを使用してすべての 16 ビット ブロックの結果を 1 つの結果に結合します。FPGA ロジックの量が問題になる場合は、クロック サイクルごとに 1 つの 16 ビット ブロックをチェックするステート マシンを実装します。

ただし、その際に CPU を再発明しないように注意してください。

于 2013-05-14T06:32:49.983 に答える
3

ループを使用する際の問題は、合成時にロジックのチェーンが非常に長くなる可能性があることです。

問題を調べるもう 1 つの方法は、最上位のセット ビットのインデックスを見つけることです。これを行うには、プライオリティ エンコーダーを使用できます。これの良いところは、ツリー構造で小さなプライオリティ エンコーダを使用して大きなプライオリティ エンコーダを作成できることです。そのため、遅延は O(N) ではなく O(log N) になります。

ここに 4 ビット プライオリティ エンコーダーがあります: http://en.wikibooks.org/wiki/VHDL_for_FPGA_Design/Priority_Encoder これらのブロックを 5 つ使用して 16 ビット プライオリティ エンコーダーを作成し、次に 5 つの 16 ビット エンコーダーから 256 ビット エンコーダーを作成できます。

しかし、非常に多くのビットがあるため、かなり巨大になります。

于 2013-05-14T15:21:02.460 に答える
1

最近のほとんどのシンセサイザーは、再帰関数をサポートしています。log(N)実際、これにより、N がビット数である場合に匹敵する複雑さが得られます。

  • ベクターを半分にカット
  • 上半分がすべてゼロの場合
    • 答えの先頭ビットは「1」です。下位ビットは下半分のベクトルに依存します
  • さもないと
    • 答えの先頭ビットは「0」です。下位ビットは上半分のベクトルに依存します
  • 上で選択した目的の半分のベクトルを再帰します。
于 2013-05-14T15:37:42.150 に答える