まず、FPGA用にHDLを書き込んだり、HDLを適用したりする際には、特定のFPGAの機能と限界を理解することが大切です。ザイリンクスは、各FPGAモデルを文書化する優れた仕事をしています。 LUT4およびMUXF5ブロックを見ると、FPGAファミリはSpartan 3でしょうか?データシートを調べることで、どのハードウェア構成要素が実装するのが非常に効率的で、より多くのリソースが必要であるかを確認できます。一般に、ハードウェアの一部分が実際にチップ上のものに近づくほど、速く実行され、占有する領域が少なくなります。
たとえば、ザイリンクスLUTをシフトレジスタとして使用することもできます。つまり、スライス内のフリップフロップを使用する必要はありません。シフトレジスタがLUTにマップされていることを確認すると、非常に目立つ改善が得られます。 XSTはこれらの効率的なマッピングを推測するためにあなたのHDLに最善を尽くしていますが、リセットシグナルの前にイネーブル信号がチェックされているように、これらの効率的なマッピングを妨げる愚かなことがよくあります。シンセサイザーの出力と配置配線を調べて、FPGAへのマッピングを改善できるインスタンスを見つけてください。ザイリンクスのドキュメントには、VHDLとVerilogの例があり、より効率的なコンポーネントを推測するためにXSTを使用できます。コンポーネントを直接インスタンス化する方が簡単な場合もあります。複雑なコンポーネントの場合、非常に効率的なハードウェアを生成するUNIMACROとCOREGENウィザードがあります。
極端な例を挙げると、 PicoBlazeマイクロコントローラは、ザイリンクスFPGAアーキテクチャを利用するために特別に書かれています。この効率的なマッピングの例を見るためにPicoBlazeのソースコードを調べると役に立ちます。
第2に、組み合わせ論理パスが長すぎると、最大クロック周波数が制限されます。 FPGAをよりよくマップするためにコードを書き直すこと、または不要なハードウェアリソースを排除するために書き直すことに加えて、組み合わせ論理回路の途中にフリップフロップ(レジスタ)を挿入することもできます。コンピュータアーキテクチャでは、これをパイプラインと呼び、1命令あたりのサイクル数を増加させます。たとえば、PicoBlazeは命令ごとに2サイクルを使用します。インテルPentium 4の命令当たりのサイクルは約17サイクルでした。あなたが巧みであれば、1つの命令の処理を開始すると同時に、最後の命令の処理を終了するように、HDLを書き込むことができます。つまり、1命令(レイテンシ)あたり2クロックサイクルかかることになりますが、サイクル(スループット)ごとに1命令をリタイアすることができます。 8051やPicoBlazeのようなほとんどのマイクロコントローラはレイテンシに関係しており、x86アーキテクチャのようなほとんどのマイクロプロセッサはスループットに関係しています。