概要
Chiselを使ってTang Nano付属のLCDを光らせました. メモを残します.
Chiselを使ってVerilogコードを生成して、Tang NanoからLCDに市松模様を出せた(੭˘ ꒳ ˘ )
— イェーイ (@dango_bot) November 11, 2020
Chisel側で単体テストとか書けるので便利。 pic.twitter.com/OCNur9KNUc
はじめに
Chiselはデジタル回路設計用のハードウェアデザイン言語です. 以前チュートリアルを書いたので, そちらをご覧ください.
Chiselを使ってTang NanoでLチカする
LCDはTang Nano FPGA開発用としてSipeedで売られていたものを使いました. 秋月でも売られています.
設定
まず, 最初にSeeed公式がexampleコードを公開しているので, それを見てみました.
https://github.com/sipeed/Tang-Nano-examples
LCDに関するドキュメントも公開されていたのでそちらも確認しました.
https://tangnano.sipeed.com/en/examples/2_lcd.html
VGAを使って画面の制御を行っているので, まずはVGAの信号をChiselで実装しました.
VGAの設定
VGAでは水平同期信号(HSYNC)と垂直同期信号(VSYNC)のタイミングに合わせてピクセルの値をRGBで設定します.
今回は上のドキュメントやコードを参考にタイミングやパラメータなどを合わせました.
Verilogで書かれたコードをChiselに変換するしてるだけなので, 特に説明する箇所はないですが, ポイントとして
- Mux(マルチプレクサ)を使って範囲外のピクセル更新の操作をOFFにする.
- 現在, 更新する座標とRGBの信号線を外に出して, 上位のモジュールに渡す.
という感じです.
LCDのクロック設定(BlackBoxの使用)
次にさっそくLCDの描画を行いたいところですが, LCDにはクロックとして(上記の設定では)33.33MHzを供給する必要があります.
これはTang NanoのIPを利用することで生成できますがChiselからではそういったコードを生成することはできません.(それはそう)
このように特定のVerilogのコードをChiselのプロジェクトで使用したいといったときに使用するのがBlackBox機能です.
これを用いることでVerilogで書かれたコードを隠蔽しつつ, インターフェイスをChisel側に渡すことができます.
まず, IPを用いて以下のようなコードを生成しました. Gowinの生成したコードがなんかいまいちだったのでこちらのコードを参考にしました。
https://github.com/dotcypress/tang-nano-lcd
そしてChisel側でこのようなコードを書いてVerilogのコードを利用します. 入出力のピンの名前を同じにする必要があるのでそこだけ注意です.
LCDの描画
先ほど作成したVGAModuleから得られた座標とRGBのピンを用いてLCDの描画を行っていきます。
今回は単純に市松模様を描画しました。
コードはこんな感じです. (条件分岐はかなり適当です.
ポイントとして
- LCDもFPGAもアクティブローなので, Wrapperを作成し, withClockAndResetで初期化する.
です.
今回の処理ではめんどくさくて下位モジュールと上位モジュールの接続を := で行いましたがバルク接続を使うともっとすっきりします.
(ただ, その場合モジュールのピンを調整しないといけない…)
最後にmainの処理を書いてビルドします.
以下のようなコマンドを実行するとout/ 以下にverilogコードが生成されてると思います. 今回はBlackBoxを使ったので, そのコードも同一ディレクトリーに生成されているのがポイントです.
$sbt 'test:runMain lcd.LCDMain'
今回作成したコードはGitHubに置いてるので必要があれば見てください.
https://github.com/dangorogoro/Tang-Nano-With-Chisel
ピン設定と書き込み
生成したファイル(LCDTopWrapper.vとrpll.v)をGowinに持って行ってビルドします.
ピン配置は以下のように設定しました.
pin | location |
---|---|
io_led_b | 17 |
io_led_g | 16 |
io_led_r | 18 |
io_nrst | 15 |
io_vga_b | 41-45 |
io_vga_clk | 11 |
io_vga_de | 5 |
io_vga_g | 32-34, 38-40 |
io_vga_hsync | 10 |
io_vga_nrst | 14 |
io_vga_g | 27-31 |
io_vga_vsync | 46 |
io_xtal | 35 |
以上の設定をしてビットストリームを作成して書き込むとこんな感じの模様が出てきます.
Chiselを使ってVerilogコードを生成して、Tang NanoからLCDに市松模様を出せた(੭˘ ꒳ ˘ )
— イェーイ (@dango_bot) November 11, 2020
Chisel側で単体テストとか書けるので便利。 pic.twitter.com/OCNur9KNUc
おわりに
Chiselを使ってTang Nanoに繋げたLCDへ市松模様を表示できました. ここには書いてませんが, 開発中はChisel側でテストを書いてデバッグしていたのでとてもスムーズにできました. 今後もいじっていきたいですね.