私はザイリンクスのツールに精通していませんが、アルテラのツールには精通しているので、それらについて説明します。ザイリンクスと他の人はそれほど違わないはずです。
Verilog
最初に行う必要があるのは、Verilogを学ぶことです。Verilog(およびやや似たVHDL)は最初にシミュレーション言語として設計され、多くの構成要素(#5
たとえば、「5タイムステップ待機」を意味し、タイムステップは通常ナノ秒)であるため、これは頭を痛めます。そのため、Verilogコードを合成可能にする、つまりFPGAのビットストリームにコンパイルできるようにするために留意しなければならない多くの制限があります。
ただし、最大のショックは、Verilog(およびVHDL)で記述するものがシステムに期待される動作であり、コンパイラが記述から適切なロジックを推測することです。注意しないと、これから多くの厄介なバグを得ることができます。
たとえば、Dフリップフロップは次のようになります。
always @(posedge RESET or posedge CLK)
begin
if(RESET)
Q <= 1'b0;
else if(CLK_ENA)
Q <= D;
end
これはDFFがどのように機能するかを説明し、コンパイラはそれを分析し、DFFが必要かどうかを判断する必要があります。これ@(...)
は感度リストと呼ばれ、コードブロックの再評価をトリガーする信号のリストです。従って、このブロックでは、Q
そこに立ち上がりエッジがある場合にのみ変更RESET
またはCLK
(これはアクティブ・ハイのリセットのためのものです)。センシティビティリスト(組み合わせロジックブロックの修飾子posedge
やnegedge
修飾子のない右側の変数をすべて含む必要がある)の何かを忘れると、コンパイラはエラーを呼び出すのではなく、必要に応じてラッチを合成します。クレイジーですが、Verilogは元々、実装の詳細を隠した(したがって必要としなかった)シミュレーション言語であったため、その通りです。VHDLも同じですが、より冗長です。
最後に、SystemVerilogと呼ばれるVerilogの新しいバージョンが数年前にリリースされました。これにより、合成可能なコードの作成がはるかに簡単になります。ザイリンクスISEとアルテラQuartus IIの両方がサポートしているため、可能であれば、この言語を学んでください。主な問題は、良い参考資料がまったくないことです。
DFFのSystemVerilogバージョンは、いくつかの小さなことをクリーンアップします。
always_ff @(posedge RESET, posedge CLK)
begin
if(RESET)
Q <= '0;
else if(CLK_ENA)
Q <= D;
end
感度リストの信号はコンマで区切られていることに注意してください。これは、そこで動作しなかったためor
に混乱していたためand
です。また、交換注意1'b0
(単一0
有するビット)'0
(但し多くに展開することを、シンボル0
、ビットは、それが割り当てられているものに基づいて必要とされる多くのパラメータ化モジュールとより柔軟に)。最後に、内容をフリップフロップに合成する必要always
がある(すべての組み合わせロジック、ラッチ、フリップフロップに使用できる)の置換に注意してくださいalways_ff
。またalways_comb
、ブロックへの入力から感度を算出するだけなので、感度リストを削除するがあります。
アルテラの設計ソフトウェアはQuartus IIと呼ばれ、Web Editionを探しています。(サブスクリプションエディションはかなり高価で、最速または最新のFPGAモデルにのみ必要です。)
悲しいことは、このテーマに関する良い本が見つからなかったことです。私が学んだことは、合成可能なものとそうでないものを伝えるのが上手くいかないVerilogの本やサンプルコードなど、複数のソースから物をつなぎ合わせることで得たものです。Quartus IIには、Dフリップフロップからステートマシンまで、いくつかの一般的な構造のテンプレートコードを挿入する「テンプレートの挿入」コマンドがあります。
デモ用ハードウェア
Verilogでプロセッサを実装したら、ビルドする必要があります。当分の間、Quartusがチップ(ファミリーを選択する必要があります。CycloneIVをお勧めします)とピン配置を選択します。一度表示されると、必要なチップの量がわかります。使用したロジックエレメント、フリップフロップ、RAMビットなどの数が表示されます。これらのいずれについても50%を超えないようにしてください。もしそうなら、コンパイラが選択したチップを見て、少なくとも同じ数のピンを持つ次のより大きな(ロジックエレメントの)チップを手動で選択し、使用率が50%未満になるまで繰り返します。
その後、少なくとも最終的に構築したチップと同じ大きさのチップを搭載したデモボードを探しに行きます。必要な周辺機器やI / Oコネクタがあることを確認してください。不足しているハードウェアを提供するために、拡張コネクタに差し込むドーターカードを構築することは珍しくありません。
ハードウェアを選択したら、実際のピン配置を把握し、ピンプランナーを使用して正しいピンに正しい信号を配置します。デモボードには、デモボード上のどのデバイスまたはコネクタピンにどのピンが配線されているかを示すユーザーガイドがあります。
ピン配置を設定したら、目的のピンを使用するように再度ビルドします。システムクロックなどの一部の信号には専用の入力ピンが必要になることに注意してください(したがって、内部PLLに直接配線されます)。
プログラマを使用して、デザインをFPGAに直接ダウンロードします(以前に述べたシフトレジスタ)。これで、おなじみの編集-コンパイル-実行のデバッグサイクルになりました。それが機能するまでそれを打ちます。
動作したら、プログラマーを使用してコードをオンボード構成デバイスにダウンロードし、プログラムが電源投入時にロードおよび実行できるようにします。
これはかなり長かったので、いくらか助けになるといいのですが。学ぶべきことがたくさんあります。手続き型言語から関数型言語への移行など、新しいプログラミングパラダイムを学習するようなものではなく、新しいプログラミング言語を学習するようなものではありません。Verilogは同時言語です。ほとんどのコードは常に実行されています。
がんばろう!