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を置き換えていく
参考:

f:id:varmil:20171205172440p:plain

System Console

あとは適当にデータを読み書きすればよい。

f:id:varmil:20171205172550p:plain

[方法2]DE-10 Lite Control Panelを使う

ここから落とすだけ。

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に転送するのがベストかも

  1. SDRAMの適当な番地(0x80000 = 8MB)とかにkernelmemfsを転送
  2. bootcode(カーネル展開コード)をROM(といいつつ実態は回路にする。あるいはUFMにload memory fileを指定してそっちを使っても良さそう)に直接書き込んでおく。リセットしたらここから命令フェッチを始める。
  3. memide.cを参考に、カーネル本体を物理メモリ --> 物理メモリへ再配置する。

ELFヘッダのパース

  • kernelmemfs、こいつをSDRAMにそもそもそのまま配置できるのか?
    • 割と余裕でできた。

【ELF形式】ELFヘッダ(2) - ゆずさん研究所

xv6のfs.imgはルートファイルシステム

kernelmemfsでビルドする場合、出力ファイルにfs.imgがくっついて完成するイメージ。ので特に気にせずELFヘッダに沿ってメモリ展開すれば良さそう。