Lynx-EyEDの電音鍵盤 新館

広帯域制御屋の駄文とか

Quartus II 14.0/14.1で初期値ありのUFMをインスタンシエートする

以前(アルテラCPLDで150LE未満のワンチップCPUを作ったお話 - Lynx-EyEDの電音鍵盤 新館)のときはQuartusII 13.1ベースで記事を書いていたので、14系列でかなりの変更があったと聞き、どう変わったか確認したときのメモです。

MegaWizardが消えたっぽい

MAX10 FPGAのUFMがAvalon-MMのモジュールとして使用できるようになっており(Altera On-Chip Flash)、その流れを受けてかMAX II/VのUFMもQsys経由でプロトコルや初期値のセットアップができるようになっています。
といってもMAXII/VのUFMはAvalon-MMのモジュールにならないので、後述するエクスポートするだけになります。

Qsysを今まで使っているなら特に問題ないと思いますが、Quartus IIでMAXII/Vのプロジェクトをつくり、Qsysを起動します(IP Catalogから起動してもOK)

UFMをSPIスレーブ、16bit,read onlyで初期化するので
画面左のIP Catalogからツリーをたどり、
Library -> Basic Functions -> On Chip Memory -> Altera USer Flash Memory for SPI Interface Protocol
を選択し、[add]ボタン
f:id:Lynx-EyED:20150103115111p:plain
プロトコルの詳細設定画面が出るので[General]タブで
Access mode : read only
Configuration mode : Extended mode (16bit address and data)
Port settings: Use 'osc' output port
にチェック
f:id:Lynx-EyED:20150103114123p:plain
次に[Initialization and Simulation]タブで
Memory Content Initialization: Initialize from hex or mif file
にチェックし、所望の初期値ファイル(ここではプロジェクトのルートにあらかじめ用意したUFM_Module.hex)を指定する。(後述:ここで問題が発生する)
して[Finish]する。
f:id:Lynx-EyED:20150103112801p:plain

QsysのSystem Contentsタブに戻り、
Avalonバス上につながるコネクションは今回ひとつもないので、すべてダブルクリックしてExportしておく。
f:id:Lynx-EyED:20150103112816p:plain
ここからはQsysのいつもの使い方なので駆け足で。
メニュー -> Generate -> Generate HDL -> Generate
Finish(Qsysを任意の名前で保存するのを忘れずに。)

Quartus II
Project -> Add/Remove Files in Project
で先ほどのQsysファイルをインポートする

インスタンシエート。自分はこんな感じでやりました

 qsys_ufm u0 (
	  .ufm_spi_0_ncs_ncs (ufm_ssel), // ufm_spi_0_ncs.ncs
	  .ufm_spi_0_osc_osc (int_osc), // ufm_spi_0_osc.osc
	  .ufm_spi_0_sck_sck (ufm_sclk), // ufm_spi_0_sck.sck
	  .ufm_spi_0_si_si   (ufm_mosi),   //  ufm_spi_0_si.si
	  .ufm_spi_0_so_so   (ufm_miso)    //  ufm_spi_0_so.so
 );

hexの中身が反映されない

これでコンパイルするとUFMに指定した初期値が反映されておりませんでした。
警告127003というのが目に付いたので見てみますと
f:id:Lynx-EyED:20150103112840p:plain

127003: Critical Warning (127003): Can't find Memory Initialization File or Hexadecimal (Intel-Format) File C:C:/altera/14.1/projects/ufm_module/altera14.1projectsufm_moduleUFM_Module.hex -- setting all initial values to 0

確かに初期値が読み込めてないっていうか、ファイル名バグってないですかこれ?System::Strings::Split('\')でも使って再連結するときに忘れたのかな(ぇ

対処:
プロジェクトフォルダからの相対パスでファイル名を指定する
自分の場合はプロジェクトのルートフォルダにUFM_Module.hexという名前で保存してあるので、
./UFM_Module.hex
f:id:Lynx-EyED:20150103113825p:plain
と記述し、先ほどと同じようにGenerate HDL -> Finish
コンパイルすれば、先ほどの警告はなくなり、初期値が反映される。

ちなみに

C:\altera\14.1\my_project_folder\my_project\my_ufm_data.hex という階層にhex/mifがある場合
C:\\altera\\14.1\\my_project_folder\\my_project\\my_ufm_data.hex
って書き直してやると動く模様。
でも、今後修正されたときにどんな挙動するかわかんなくなるし、やめたがいいかも。