対数 (基数 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 を再発明しないように注意してください。