VHDLの文法を学ぶための環境構築メモ(Verilog も同じノリでイケるかな?)
このブログを始めたきっかけ
ここの最初に記載。
darushino.hatenablog.jp
はじめに
HDL は、ほかのプログラミング言語よりも学習ハードルが高い印象がありました。
その原因は、環境構築の手間が多いことにあると考えました。Zynq や Quartus を一から導入して、ボードを触りながらトライ&エラーすることは、初学者には負担が大きいそうに思います。文法を勉強するだけならもっと簡単な方法があるのではないかと思い、ちょっと調べてみました。
総論
Windows PC に GHDL と GTKWave を導入することで、HDL で記述した回路のシミュレーションと波形確認ができました。これらツールはダウンロードして PAHT を通すだけで利用できるので、お手軽です。また、VSCode を使っている方は、GTKWave の代わりに、WaveTrace という拡張機能でも波形確認ができそうです。
なお、今回は VHDL しか試していませんが、同じような環境で Verilog も試せそうな気がします。気が向いたら試してみますが、すでに試した方などいたら教えていただけると幸いです。
環境構築~試すまで
機材
今回は、以下の機材に環境を構築しました。
- Windows10 64bit(メモリやストレージはあまり気にしなくていいと思います。)
ざっくり手順
- GHDL をダウンロードして、bin フォルダの PATH を通す。
- 私は、Releases · ghdl/ghdl · GitHubの "ghdl-0.35-mcode-windows.zip" を使いました。
- GTKWave をダウンロードして、bin フォルダの PATH を通す。
- 私は、gtkwave - Browse Files at SourceForge.netの "gtkwave-3.3.100-bin-win64" を使いました。
- 回路とテストベンチを書く。
- 回路とテストベンチをテストしてコンパイルとかするコマンドを叩く。(analysis, elaborate, run の順)
ghdl -a --ieee=synopsys hoge.vhd ghdl -a --ieee=synopsys hoge_tb.vhd ghdl -e hoge.vhd ghdl -r hoge_tb --vcd=full_hoge.vcd
- run 時に生成された vcd ファイルを GTKWave などで開き、波形を確認する。
試してみる
GHDL on OS X - Handwriting や https://www.youtube.com/watch?v=H2GyAIYwZbw 通りに VHDL で回路とテストベンチを書いて、コマンドを実行するだけです。
vcd ファイルを出力したら、GTKWave や WaveTrace で波形を出力してみてください。
結論
GHDL と GTKWave を Windows PC に導入することで、手軽な VHDL 実行環境を構築できました。書籍などでHDL や論理回路の構築を学習する際には、この環境を使い、実際に手を動かしながら動作確認ができると思います。
参考リンク
テスト環境の整備など、もっとしっかりやりたい方は以下が参考になるかもしれません。GHDL や GTKWave のチュートリアルを実践するのもよいでしょう。また、今回 Verilog の環境は試していませんが、おそらく同じようなノリで構築できると思いますのでご自身で調べてみてください。
VHDL お試し手順
- https://www.youtube.com/watch?v=H2GyAIYwZbw(英語ですが、動画見てればだいたいわかると思います。)
- VHDLを試してみた。 - 情報系学生ランナーの備忘録
カウンタを使うとなんで分周できるのか
このブログを始めたきっかけ
ここの最初に記載。
darushino.hatenablog.jp
つまづいたこと(ではない)
「n bitカウンタを使うと、クロックの 倍の周波数まで分周できる」。これが直感的によくわからなかったので、16bit を具体例として考えてみた。厳密に書き下ろすつもりはなくて、あくまで直感的な理解のメモ。
16bit 分周方法
クロックを16bitで最大分周すると、クロック周波数の(つまり)倍の周波数が得られる。これを実現するには、16bitカウンタ*1を準備して、15bit目を分周後のクロックとして使えばよい。
15bit 目のうごきに着目するとわかりやすい
15bit 目は、の回カウントする間は Lowで、の回カウントする間は High となる。
元のクロック周波数で1カウントずつしているので、15bit目は回カウントするとようやく1周期経過するクロックと考えてよい。周期が倍となるので、周波数は元クロックの倍ということになる。
対処法
対処法ではないけど、一度納得できたのでスッキリ。長年わかったようでわかってないモヤモヤがあった。分周の原理がやっとわかった気がする。
*1:0から15ビット
ノンブロッキング代入とブロッキング代入という初見殺しの基本事項
このブログを始めたきっかけ
ここの最初に記載。
darushino.hatenablog.jp
対処法
コツは以下っぽい。
HDLでバスやポートを昇順に書くか降順に書くか
このブログを始めたきっかけ
ここの最初に記載。
darushino.hatenablog.jp
つまづいたこと(ではない)
バスを表記するとき、降順で書くべきか昇順で書くべきか。
対処法
qa.itmedia.co.jp
より、
信号を束ねて表記する際(PortやBus)には、MSBを先に、LSBを後に表記するからです。
たとえば4ビットバスの場合は[3:0]、16ビット幅の場合は[15:0]のように表記します。
この書き方に合わせるために、downtoを使う訳ですね。
納得。
*1:downto, [7:0] みたいな感じ
Verilog HDLにおけるassign文の左辺と右辺に関するメモ
このブログを始めたきっかけ
ここの最初に記載。
darushino.hatenablog.jp
つまづいたこと(ではない)
実際つまづいてはいないのだけど、将来慣れてきたころにハマりそうなポイントと思ったのでメモしておく。何が気になったかというと、assign 文の左辺と右辺には明確な意味があるということ。
気に留めたこと
shop.cqpub.co.jp
のP.63リスト2について。
module led_func(input inp, output outp); assign outp = inp; endmodule module TopModule(input sw, output led); wire wsw, wled; assign wsw = sw; assign led = wled; led_func u1(wsw, wled); endmodule
とある。assign 文は、「右辺を左辺に割り当てる」とのこと。なので、左辺と右辺をうっかり入れ替えるとデバイスが動かなくなってしまう。
たとえば、「led = wled」は「FPGAの出力ピンledを内部配線wledに割り当てますよ」という意味となる。これを「wled = led」としてしまうと、「内部配線wledをFPGAの出力ピンledに割り当てますよ」となり、出力ピンとして機能しなくなる(信号の流れる方向がおかしなことになると感覚的に理解)。入力ピンに関してはその逆のことが起こりそうな気がする(信号衝突して、最悪デバイス壊れるとか?)。
いまのところの結論
「FPGAから見た入力ピンは右辺に、出力ピンは左辺に書く」と理解しておく。勉強進めていったらこの理解で不整合が発生するかも。そのときは考え方を改めよう。
"failed to find quartus installation folder" と表示されて MAX10-Lite のコントロールパネルが使えないときの対処法
前置き
FPGA を仕事で使えるようになりたくて勉強を開始しました。だるしのです。
このブログは、学習中に得られた知見をメモっておくための自分用備忘録です。
CQ 出版からよさげな教材が出ていたので、これを進めていきます。FPGAなんぞやを学べればよいので、いまのところザイリンクスでもアルテラでもどっちでもいいです。
shop.cqpub.co.jp
つまづいたこと
MAX10-Lite のコントロールパネル*1を起動したが、"failed to find quartus installation folder" というポップアップが表示されて基板へのアクセスができない。
対処法
以下の手順に沿ったら無事基板にアクセスできるようになりました。
https://www.terasic.com.tw/cgi-bin/page/archive_download.pl?No=293&FID=200aff87041ba08a6d36c06adf88efc6
私の場合、