Altera コンフィグROMの空き領域をユーザー領域Flashとして使用する方法

どうしてもユーザーデータを記憶しておくFlashが必要な場合があります。FPGAボードにFlashが乗っていればいいのですが、それがない場合は、EPCS64などのコンフィグROMの空き領域をユーザーFlashとして利用することが可能です。利用方法としては、例えばBIOSなどのROMデータを書いておく方法や、FPGAで動的にデータをログするなどのことが可能です(書き込みはできるみたいですが、試していません)。

今回は、例としてコンフィグROMににあらかじめ固定値のデータ(data.hex)をマージしたROMデータ(.pof)を作り、FPGAでユーザー空間としてそのアドレスに書かれたデータを読んでみることにします。EPCS64メモリのアドレスマップは0x00000000~0x003fffffまでをコンフィグデータの領域として、0x00400000~0x00400019までをユーザー領域として使用するとします(どうやら、FPGAのコンフィグデータは必ず0アドレスから始まっていないとコンフィグできないようなので、必ずユーザー領域はそれよりも下の領域を使うようにしてください)。

DE0-CVのサンプルプロジェクトを添付したので、試してみてください(タイミング制約とかそこら辺何も書いてないので、実使用する場合は適当に記述してください)。

epcs_userflash_de0-cv.zip

ユーザーデータ

今回はテストなので、バイナリデータでアドレス=データの簡単なものを用意しました(bin.bin)。ただし、Quartus Primeでは.binなどは読み込んでくれないので、.hexのデータを用意しました(data.hex)。

.binから.hexへの返還はそのアプリを自作するなど頑張ってください(ぐぐればそれっぽいソフトも出てきます)。

必要なIP

Altera ASMI ParallelというIPを使用します。Qsysの画面で設定を行います。今回はユーザー領域からデータを読むだけなので、特に対した設定を行ったわけではなく、ほぼdefault状態です。read_addressポートも、今回の実験では使用していないため、チェックを外してもよいでしょう。

fast_readはどうやらFlashから高速にデータを読むモードのようです。このモードを使用するとEPCS64では25MHzで駆動することができるらしいです。今回は実験なので、特に速度は求めないため、通常モードで使用します。その際は最大クロックは20MHzとされています。

サンプルプロジェクトの中ではpllのIP用いています。これは、DE0-CVのクロック入力が50MHzなのに対して、ASMIのIPは最大20MHzなので、このPLLで20MHzを作っています。

FPGAのコンフィグROMにユーザーデータ(data.hex)をマージ

まずは、ユーザーデータ(data.hex)を含まない状態で.pof(コンフィグROM用のコンフィグイメージ)を作る必要があるので、論理合成を行います。 この際、プロジェクトの設定でEPCS64を使う設定をしないでASMIのIPを使うと論理合成エラーが出るようです。設定していなかった場合は初めにQuartus Primeのメイン画面からAssignments → Deviceを押して、ウインドウ中央にあるDevice and Pin Optionsをクリックし、CategoryからConfigurationを選択して、以下画像のようにEPCS64を使うように設定してから論理合成を行ってください。

論理合成でユーザーデータ(data.hex)を含まないpofファイル(test_asmi.pof)が生成で来たら、次に、このコンフィグデータとユーザーデータをマージしたコンフィグファイル(output_file.pof)を作ります。Quartus PrimeのメインウインドウからFile → Convert Programming fileを開きます。

まずProgramming file typeのグループにあるConfiglation deviceをEPCS64に変更して、保存ファイル名を適当に設定しましょう。ここでは“output_files/output_file.pof”とします。そして、Input files to convertのグループから、SOF Dataの行を選択し、Add Fileを押して、論理合成時に生成されたsofファイル(test_asmi.sof)を選択します。通常個のデータはoutput_filesディレクトリに保存されています。

そして、Add Hex Dataをクリックして、Addressing modeをRelative addressingにして、Set start addressにチェックを入れ、アドレスを0x400000にセットして、Hex fileを追加してください。

次に、SOF Dataのスタートアドレスを設定します。Input files to convertの中の、SOF Dataの欄を選択し、Propertiesを押して、Address mode for selected pagesの欄からStartに設定し、Start addressを0x0に設定します。この作業は必ず行ってください。FPGAのコンフィグデータは必ず0アドレスから始まっている必要があるので、ここにコンフィグデータがないと、FPGAのコンフィグに失敗してしまいます。

ここまでできたら、Generateしてください。output_filesディレクトリにoutput_file.pofができているので、このファイルをASモードでコンフィグROMに書き込みましょう。