/home/tnishinaga/TechMEMOスマートフォン用の表示で見る/home/tnishinaga/TechMEMO日々行ったこと、面白かったことを書き留めます。この広告は、90日以上更新していないブログに表示しています。PYNQでLチカ(お正月FPGAあそび)お正月なので普段やらないことをやろうと思い、買ってから2年ほど放置してしまっていたPYNQ-Z1を使ってFPGAを触ってみました。「RISC-Vで遊びたい」という気持ちと「FPGAをさわってみたい」という気持ちがあったので、「PYNQでRISC-Vを動かしてみる」ことを最終目標にしました。これではお正月休みだけでは終わらないので、このお休みの間は「PYNQでChiselを使ってLチカする」のをゴールとしてやってみました。今回はそこで何やったかのメモ的な記事です。私はFPGAもScalaもChiselもほぼ初挑戦です。setupPYNQはDigilent社の作ったFPGAボードです。www.pynq.ioPYNQにはXilinx社のZynqというFPGAが乗っているので、Xilinx社のVivadoという開発環境で開発を行います。以下のサイトからアカウントを作ってインストールします。WebPackライセンスを選択すればいろいろ制限はありますが無料で使えます。japan.xilinx.comインストールが終わったら以下からPYNQ向けのボードファイルをもらってきてインストールします。Lチカ環境設定が終わったので、組み込み版HelloWorldであるLチカをやってみます。PYNQボード向けの入門ドキュメントは少ないので、だいたい同じ構成のZyboというボード向けの初心者用ドキュメントを参考に、一部読み替えつつLチカをしてみます。Logic)が1つのチップに乗っています。今回参考にするドキュメントの例では、PL部に用意したGPIOをPS部のプログラムから制御して、スライドスイッチの状態に応じてLEDを点灯させるというものになります。Zybo向けに書かれたこのドキュメントをPYNQで用いるための変更点としては、PYNQにはスライドスイッチが2つしか無いので、手順4.3で設定するスイッチをswts_2bitsに設定する必要があります。PL部のみでLチカ次にPYNQをPS部を用いず普通のFPGAボードとして利用する方法が知りたいので、以下のサイトを参考にPL部のみでLチカをしてみたいと思います。qiita.comこちらのドキュメントもZYNQ向けなので、「ピンアサインをする」のところでクロックなどが接続されているピンがPYNQと異なります。そのため、以下のマニュアルを参考に変更を加えます。I/O」を読むと、クロックソースとLEDのピン配置が以下の表のようになっていることがわかるので、設定します。M14回路がうまく動けば、1秒ごとにLEDが4つとも点滅します。Chiselを使ったLチカRISC-VのコアはChiselという、ScalaのDSLとして実装された言語を用いて書かれています。このChiselの書き方を学ぶため、まずはこのChiselを使って先程のPL部だけで行うLチカの回路を作ってみたいと思います。Chiselから実際のボード上で動く回路を作るまでの流れが知りたかったので調べてみます。Chiselのコードをビルドすると、中間表現を経由してVerilogのコードが得られます。実際のボード上で動かすためにはこの生成したVerilogをvivadoに取り込んでピンアサインなどを設定してビルドする必要が有るようです。詳細についてはmskysphinzさんのブログ記事が参考になりました(ありがとうございます)。msyksphinz.hatenablog.com次にプロジェクトの開始の際には、chisel-templateというリポジトリをベースに行うのが良いようです。github.comchisel-remplateにはGCDを求める回路が最初から書かれています。最初は簡単のためメソッド名等はそのままに中身だけ書き換えてLチカのコードを書いていきます。src/main/scala/gcd/GCD.scalaVerilogで書いていたLチカのコードをChiselで書き直します。Clockは暗黙の引数として有るようなので、書かなくて良いようです。onoff変数の値をLED4つに反映させる方法がわからなかったので、LED0にだけonoffの値を入れるようにしています。onoff}src/test/scala/gcd/GCDUnitTest.scala回路のテストコードを書きます。サンプルではpokeを使って回路に入力を設定しているものがよく見られますが、この回路は入力がクロックしか無いので、pokeで入力設定を行わなくても良いようです。stepを進めるとクロックが入力されてカウンタが上がっていきます。今回125MHzでLEDの出力を反転させるので、stepで125,000,000進めた後にexpectを使って出力が変わっているかをチェックします。0)}src/test/scala/gcd/GCDMain.scalaそのままもテストはできますがVerilogファイルの出力ができなかったので、chisel-wikiを参考にMainメソッドに1行追加してVerilogのコードをビルドできるようにします。以下のドキュメントを参考に、出力のための処理を追記します。GCD)}テストtutorialのREADME.mdに書いてあるとおりに以下のコマンドを実行するとテストが走ります。Basic'うまくいけばこんな感じのログが出てきます。AMVerilogコードの生成Verilogのコード生成は以下のコマンドで行えました。このコマンドがスマートな方法かはわかりませんが、動いたので良しとしています。どなたか良い方法をご存知の方は教えてください。GCDMain'うまくビルドが終わればbuildstuffディレクトリ以下にGCDMain.vというファイルができているはずです。機械が生成したコードなので、先程の人間の作ったコードに比べるとちと読みづらいです。endendmoduleFPGAでの動作確認PL部でのLチカを参考に、VerilogのコードをコピペしてVivadoでビルドを行います。Chiselはreset用のpinも欲しがるので、私はとりあえずスライドスイッチのついているM20を設定しました。PYNQにうまく書き込めれば、LEDのLD0だけがチカチカするはずです。おもったこと最後に、やってる途中に思ったことをつらつらと。v3を買いました月別アーカイブはてなブログをはじめよう!tnishinagaさんは、はてなブログを使っています。ブログを報告するスターをつけました引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。