2年前とかに買ったDE0ですが、Timestampの不一致とやらでNiosを動作させることができず、ずっと放置していました。最近またNios動かせるようになりたいと思い、リベンジしてみました。
Quartus Ⅱ v14.0 Web EditionはCyclone Ⅲに対応していない
まずはこっから。本当に対応してませんでした。幾らなんでもサポート切るの早すぎじゃないですか…。DE0に乗っているCyclone Ⅲを使いたかったので、v13.0を利用しました。Niosについて
Nios Ⅱ/eをDE0で利用する方法については、Sim's blogさんの以下の2つの記事を参考にしました。NIOSを使ってみました(1) - Sim's blog http://blog.goo.ne.jp/sim00/e/8e1fc436d1e29a6decc20f8256adb914
NIOSを使ってみました(2) - Sim's blog http://blog.goo.ne.jp/sim00/e/35fbcf1fc1bfe67255e371c1ca2c770f
SimさんはQuartus Ⅱ v9.0で行っていますが、私はv13.0を利用したので、ところどころ違うところがありました。例えば、
- sysid_0をsysidにrenameしませんでした(デフォルトでsysid_qsys_0という名前だった)。
- module同士のconnection(配線)は手動で繋ぎました。(繋がないと、下に××モジュールをAvalon-MMに繋がないとダメだよなどととエラーが出てしまいます。)
- addressは、最初はSimさんの例と同じように配置したのですが、結局[System]→[Assign Base Address]で配置しました。
で、最終的にこのような構成になりました。IRQに関しては全く触っていません(なのでjtag_uart_0のIRQが未配線であるWarningが出てる)。
今回作ったNios周りの図 |
Nios II Hardware Development Tutorial
http://www.altera.com/literature/tt/tt_nios2_hardware_tutorial.pdf
Qsys内で間違えてNewしてしまったとき
最初projectを作成したあと、Nios部分を作りこむためにQsysを起動しますよね?ここで、最初からclk_0があるので、変なものを開いたかと思って[File]→[New]してしまうと、projectと関連のないデザインを作ってしまうことになります。これを放置したままでいると、main.vhdでは生成したnios componentを使おうとしているのに、関連性がないからQuartusはniosがどれだか分からないっていう状況になってしまいます。
こういったときは、普通にNiosコア周りを[Generate]まで行い、その後Quartusの方でprojectに、Qsysが生成したNios関連のファイルをポイポイっと追加すると、QuartusはNiosがどれのことか理解してくれます。
.pofと.sof、どっち?
FPGAのAssemblerまでが正常に終了すると、<project root dir>/output_files以下に、生成物が保存されています。Xilinxだと.bitファイルなのですが、Alteraの場合、.pofと.sofという2つのファイルが出来ていました。どっちがどっちなんでしょう?.pofか.sofか |
新人エンジニアの赤面ブログ 『プログラミング?コンフィギュレーション?』 http://bit.ly/1L4Xu1X
Generating Secondary Programming Files http://bit.ly/1L4XSO8
上のリンク先などを参照するに、
.pof → Programmer Object File (EEPROMなど向け)
.sof → SRAM Object File (FPGAのSRAM向け)
のようです。なるほど、名前が違うんですね。
Deviceはどっち?
Programmerで、DE0に書き込もうとすると、JTAGスキャンした後に"Encounter devices with shared JTAG ID for device 1. Please select your device."と言われたりします。どっち? |
その他エラーメッセージ諸々
QsysでのAvalonバス配線忘れのエラー
"**** must be connected to an Avalon-MM master"多分スレーブのAvalon-MMポートが、どこのAvalon-MM Masterポートにも接続されていない。(そのまんま)
sysid_qsys_0のAvalon-MMがどこにも接続されていない。 |
まあ、CPUと周辺ペリフェラルは全てAvalonバスで繋ぐのがNiosらしいので、繋がってなかったらおかしいですよね。
Qsysでのアドレス衝突時のエラー
Error: System.nios2_qsys_0.data_master: onchip_memory2_0.s1 cannot be at 0x11000 (0x10000 or 0x18000 are acceptable)Error: System.nios2_qsys_0.data_master: sysid_qsys_0.control_slave (0x11010..0x11017) overlaps onchip_memory2_0.s1 (0x11000..0x18fff)
"cannot be at <addr>"というエラーが出た時のQsysの画面 |
これは、各ペリフェラルごとにアドレスを決めますが、それが衝突(重なって配置されてしまっている)していることを示すエラーです。これを解決するには、addressを手動修正でもいいですし、[System]→[Assign Base Address]を選ぶと、Qsysが全て自動で配置してくれるみたいです。
Qsysでのclk/resetの配線忘れエラー
Error: System.nios2_qsys_0: nios2_qsys_0.clk must be connected to a clock outputError: System.nios2_qsys_0: nios2_qsys_0.reset_n must be connected to a reset source
上のAvalon-MMバスと同様に、各モジュールにclkとresetを接続する必要があるようです。Qsysを立ち上げた時から存在していたclk_0は、clkとresetのバッファのようなもので、これらの出力を各ペリフェラルなどに接続すれば動きはするみたいです。
.bspのエラー
make[1]: *** [public.mk] Error 1make: *** [../nios_software_test_2_bsp/-recurs-make-lib] Error 2
Qsysでaddressなどを変更したあと、Nios IDEでBuildしようとしたら、このようなエラーが出てしまいました。どうやら、変更した部分がHardware Support Packageかなにかに反映されていないようです…?以下のサイトを参考にしたところ解決しました。
■第1部 第2章|組込みのこと http://ameblo.jp/umigasuki2/entry-11559007850.html
方法としては、
- Nios IDEで、プロジェクトを選択した後、[Nios II]→[BSP Editor]
- BSP Editorが起動したら、[File]→[Open]を選択し、Hardware Support Packageのプロジェクト(<project name>_bsp)のフォルダにある.bspファイルを選んで開く。
- とりあえず右下の[Generate]を押す。
- プロジェクトをリビルドする。
BSP Editor起動直後。このままExitしてはだめ、[File]→[Open]で.bspファイルを開く。 |
BSP Editorで.bspを開いた時の画面。Linkerのaddressが変わるのかな? |
SynopsysについてのCritical Warning
Critical Warning (332012): Synopsys Design Constraints File file not found: 'main.sdc'. A Synopsys Design Constraints File is required by the TimeQuest Timing Analyzer to get proper timing constraints. Without it, the Compiler will not properly optimize the design.Critical Warning (332168): The following clock transfers have no clock uncertainty assignment. For more accurate results, apply clock uncertainty assignments or use the derive_clock_uncertainty command.
最小限のプロジェクトを作成した後、Implementationまで行おうとすると、こんなCritical Warningが出てきました。が、その割には動きます。なんでだ…
CygwinのWarning
0 [main] sh 7836 find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer. Please report this problem to the public mailing list cygwin@cygwin.comNios IDEでprojectをbuildしている時に、Consoleに大量に流れていくエラーです。どうやら内部で回っているらしいcygwinの問題のようで、スルーしていてもbuild自体には問題なさそうです。
成功した場合どうなる?
-----------------------------------------------------------Using cable "USB-Blaster [USB-0]", device 1, instance 0x00
Processor is already paused
Reading System ID at address 0x00001000: verified
Initializing CPU cache (if present)
OK
Downloading 00008000 ( 0%)
Downloaded 1KB in 0.0s
Verifying 00008000 ( 0%)
Verified OK
Starting processor at address 0x00008020
-----------------------------------------------------------
これは[Run As]→[Nios ⅡHardware]に成功した時のConsoleです。System IDがちゃんと認識されました。
Eclipseでdebugすると、以下のようになります。どうでもいいんですけど、EclipseはRun時に流れるConsoleのメッセージがすぐ消えてしまって、なかなか追えないのがイライラします…。
EclipseでDebugしてるときのスクリーンショット |
結論
思ってたよりはつまらずに出来ました。ただ、実は、Niosでやりたいことの一つが、TCP/IPを利用した通信で、どうもNiosで無償で利用できるコアにEthernet(RMIIとか)が無いようなんです。ジーザス。今はSPI通信経由でCC3300やENC28J60を利用しようかと考えていますが…ライブラリの移植にも手間が掛かりそうです。
うーん…。
参考文献
[1] "Cyclone IV Device Handbook", Altera Corporation, Volume 1, December 2013, p.10-4, http://www.altera.com/literature/hb/cyclone-iv/cyiv-51010.pdf
[2] "Cyclone III Device Handbook", Altera Corporation, Volume 1, June 2009, p.12-2, http://www.altera.com/literature/hb/cyc3/cyc3_ciii51012.pdf
[3] "Nios II プロセッサ: 世界で最も汎用性に優れたエンベデッド・プロセッサ", http://www.altera.co.jp/devices/processor/nios2/ni2-index.html, 2015/02/22閲覧
XilinxのFPGA埋め込みコア"MicroBlaze"で利用できる無償IPコアよりは、数は多いと思うんですけれど、Ethernetはないんですよね…
XilinxのFPGA埋め込みコア"MicroBlaze"で利用できる無償IPコアよりは、数は多いと思うんですけれど、Ethernetはないんですよね…