私は vhdl を初めて使用し、答えが見つからない質問があります。
1024 ビット長のベクトルで動作するアルゴリズムを実装しようとしています。したがって、ファイルからデータを読み取って、このtemp_vector(1023から0まで)に挿入する必要があります。
ファイルには多くの入力が含まれており、各入力に対して、アルゴリズムは前の入力の出力に対して動作します。問題は、この入力データの長さが一定ではなく、各入力の長さが 0 から 16000 まで変化することです。
各サイクルで、テストベンチから読み取って挿入できるのは 64 ビットのみです。特定の瞬間に、既に挿入されたデータに可変長のビットのシーケンスを追加する必要もあります。整数の bit_position を使用して、データを挿入した temp_vector の最後の位置を追跡し、整数の data_in_length を使用して、各サイクルで読み取ったデータの実際の長さを教えてくれます。
temp_vector がいっぱいになるか、すべての入力の挿入が完了したら、読み取りを停止し、アルゴリズムが temp_vector で動作してから、ファイルからの読み取りを再開します。
シミュレーションで正しい結果が得られます。私が抱えている問題は、FPGA と ASIC 合成にあります。これは、入力データの長さが変化することに関係しています。ファイルを読み取って temp_vector にデータを挿入するために、2 つの方法を考え出しました。初め
temp_vector_proc : process(clk, rst_n)
begin
if rst_n = '0' then
state <= RESET;
elsif clk'event and clk = '1' then
case state is
when RESET =>
state <= TAKING_DATA;
enable_calculations <= '0';
bit_position <= 0;
temp_vector <= (others => '0');
when TAKING_DATA =>
if take_data = '1' then
for i in 0 to 63 loop
temp_vector(i+bit_position) <= data_in_keyak(i);
end loop;
bit_position <= bit_position +data_in_length;
end if;
when ...
.....
end case;
end if; -- end rst_n = '0'
end process temp_vector_proc;
そして第二に
when TAKING_DATA =>
if take_data = '1' then
temp_vector(63+ bit_position downto bit_position) <= data_in(63 downto 0);
bit_position <= bit_position +data_in_length;
end if;
when ...
.....
end case;
2 番目のアプローチは FPGA で機能しますが、多くの時間がかかり、多くのロジック エレメントが消費され、デザイン コンパイラでは、範囲を一定にする必要があるというエラーが返されます。
最初のものもFPGAで動作し、ASIC(デザインコンパイラ)でエラーを返しませんが、ASICの場合は永久に実行されます(一晩実行させました)。最初のコードを含むエンティティのパス 1 マッピングの開始時にスタックしました。
問題を十分に説明したことを願っています。より効率的な方法で実装する方法についていくつか考えていただければ幸いです。
ファイルが一度に読み取られて操作されるため、ジェネリックを使用できるとは思わないため、シミュレーション中に長さが変化します。シフトについても考えましたが、シフト値は毎回変化するため、それでも多くの時間/領域を消費すると思います。
最後に、私のアプローチ全体が間違っている可能性がありますか? FPGA、特にASICの場合、特定の入力サイズで作業する必要がある可能性はありますか? つまり、すべてのファイルでは機能せず、指定されたサイズの入力のみで機能するコードを作成して合成する必要があります。
お時間をいただきありがとうございます。