FPGAにbootcodeやkernelをどう転送するか(SDRAMやUFMとやりとりするには)
いま使用しているDE−10 Liteは残念ながらSRAMを装備しておらず
[方法1]Qsys & System Consoleを使う
Qsys > SDRAM Controller
- bit幅を16にする
- 「wire」を右クリックして「Exported」にする
- メニューの Generate > Show Instantiation Templateの結果をコピーする
Quartusに戻って
- DE10_LITE_Golden_Top.v にペースト
- wireを置き換えていく
参考:
- http://gogofpga.blog.fc2.com/blog-entry-145.html
- ftp://ftp.altera.com/up/pub/Altera_Material/13.0/Tutorials/Verilog/DE2/Using_the_SDRAM.pdf
System Console
あとは適当にデータを読み書きすればよい。
[方法2]DE-10 Lite Control Panelを使う
ここから落とすだけ。
- http://mail.terasic.com.cn/~jmlei/DE10-Lite/DE10_Lite_ControlPanel_V101.zip
- 参考:DE10-Lite Control Panel Install
Questions
Nios 2 を使わずにやりとりできる?(MIPS CPUからSDRAMやUFMをwrite, readできるか)
SDRAM
de10_lite_golden_top.v
のようなテンプレートデザインを使用すると、DRAMピンが露出している。
UFM
- PC --> UFMへのrwは可能っぽいが、CPUから直接は難しい?素直にNiosを使おう。
PCからJTAGで直接書き込みするには?
SDRAM
- System Console > Tcl Console で可能(Avalon MM Bridgeが必要)
UFM
- Qsysで何とかなりそう?
PCからkernel imageを直接SDRAMに転送するのがベストかも
- SDRAMの適当な番地(0x80000 = 8MB)とかにkernelmemfsを転送
- bootcode(カーネル展開コード)をROM(といいつつ実態は回路にする。あるいはUFMにload memory fileを指定してそっちを使っても良さそう)に直接書き込んでおく。リセットしたらここから命令フェッチを始める。
memide.c
を参考に、カーネル本体を物理メモリ --> 物理メモリへ再配置する。
ELFヘッダのパース
- kernelmemfs、こいつをSDRAMにそもそもそのまま配置できるのか?
- 割と余裕でできた。
xv6のfs.imgはルートファイルシステム
kernelmemfsでビルドする場合、出力ファイルにfs.imgがくっついて完成するイメージ。ので特に気にせずELFヘッダに沿ってメモリ展開すれば良さそう。