FPGA学習メモ

自分用メモ

VHDLの文法を学ぶための環境構築メモ(Verilog も同じノリでイケるかな?)

このブログを始めたきっかけ

ここの最初に記載。
darushino.hatenablog.jp

はじめに

HDL は、ほかのプログラミング言語よりも学習ハードルが高い印象がありました。
その原因は、環境構築の手間が多いことにあると考えました。Zynq や Quartus を一から導入して、ボードを触りながらトライ&エラーすることは、初学者には負担が大きいそうに思います。文法を勉強するだけならもっと簡単な方法があるのではないかと思い、ちょっと調べてみました。

総論

Windows PC に GHDL と GTKWave を導入することで、HDL で記述した回路のシミュレーションと波形確認ができました。これらツールはダウンロードして PAHT を通すだけで利用できるので、お手軽です。また、VSCode を使っている方は、GTKWave の代わりに、WaveTrace という拡張機能でも波形確認ができそうです。

なお、今回は VHDL しか試していませんが、同じような環境で Verilog も試せそうな気がします。気が向いたら試してみますが、すでに試した方などいたら教えていただけると幸いです。

環境構築~試すまで

機材

今回は、以下の機材に環境を構築しました。

  • Windows10 64bit(メモリやストレージはあまり気にしなくていいと思います。)

ざっくり手順

  • GHDL をダウンロードして、bin フォルダの PATH を通す。
  • GTKWave をダウンロードして、bin フォルダの PATH を通す。
  • 回路とテストベンチを書く。
  • 回路とテストベンチをテストしてコンパイルとかするコマンドを叩く。(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 - Handwritinghttps://www.youtube.com/watch?v=H2GyAIYwZbw 通りに VHDL で回路とテストベンチを書いて、コマンドを実行するだけです。

vcd ファイルを出力したら、GTKWave や WaveTrace で波形を出力してみてください。

結論

GHDL と GTKWave を Windows PC に導入することで、手軽な VHDL 実行環境を構築できました。書籍などでHDL や論理回路の構築を学習する際には、この環境を使い、実際に手を動かしながら動作確認ができると思います。

参考リンク

テスト環境の整備など、もっとしっかりやりたい方は以下が参考になるかもしれません。GHDL や GTKWave のチュートリアルを実践するのもよいでしょう。また、今回 Verilog の環境は試していませんが、おそらく同じようなノリで構築できると思いますのでご自身で調べてみてください。

VHDL お試し手順

カウンタを使うとなんで分周できるのか

このブログを始めたきっかけ

ここの最初に記載。
darushino.hatenablog.jp

つまづいたこと(ではない)

「n bitカウンタを使うと、クロックの 1/2^n倍の周波数まで分周できる」。これが直感的によくわからなかったので、16bit を具体例として考えてみた。厳密に書き下ろすつもりはなくて、あくまで直感的な理解のメモ。

16bit 分周方法

クロックを16bitで最大分周すると、クロック周波数の1/65536(つまり1/2^{16})倍の周波数が得られる。これを実現するには、16bitカウンタ*1を準備して、15bit目を分周後のクロックとして使えばよい。

15bit 目のうごきに着目するとわかりやすい

15bit 目は、0~2^{15}-12^{15}回カウントする間は Lowで、2^{15}~2^{16}-12^{15}回カウントする間は High となる。

元のクロック周波数で1カウントずつしているので、15bit目は2^{16}回カウントするとようやく1周期経過するクロックと考えてよい。周期が2^{16}倍となるので、周波数は元クロックの1/2^{16}倍ということになる。

対処法

対処法ではないけど、一度納得できたのでスッキリ。長年わかったようでわかってないモヤモヤがあった。分周の原理がやっとわかった気がする。

*1:0から15ビット

ノンブロッキング代入とブロッキング代入という初見殺しの基本事項

このブログを始めたきっかけ

ここの最初に記載。
darushino.hatenablog.jp

つまづいたこと(ではない)

ノンブロッキング代入とブロッキング代入は、HDL を扱う上で超重要事項のようです。理解して使わないと意図しない回路が出来上がってしまう。

表記

ノンブロッキングブロッキングのちがい

fpgainfo.blog.fc2.com
ノンブロッキングは同時処理、ブロッキング*1は逐次処理と考えたらよさそう。

www.macnica.co.jp

一斉に論理が更新されるのがノンブロッキング、前の処理が終了するまで待たなきゃいけないのがブロッキング、と捉えてもよさそう。

対処法

コツは以下っぽい。

*1:ブロッキング代入と呼ばれるのは「現在の操作が完了するまで将来の動作がブロックされている」という意味らしい。なるほど。

HDLでバスやポートを昇順に書くか降順に書くか

このブログを始めたきっかけ

ここの最初に記載。
darushino.hatenablog.jp

つまづいたこと(ではない)

バスを表記するとき、降順で書くべきか昇順で書くべきか。

対処法

qa.itmedia.co.jp
より、

信号を束ねて表記する際(PortやBus)には、MSBを先に、LSBを後に表記するからです。
たとえば4ビットバスの場合は[3:0]、16ビット幅の場合は[15:0]のように表記します。
この書き方に合わせるために、downtoを使う訳ですね。

納得。

結論

「基本降順*1で書く」と理解しておく。接続されるペリフェラルバイスのピン配次第ではある。

*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

私の場合、

  • USBブラスターのドライバ再インストール
  • Quartus と NIOS II の PATH 追加
  • コントロールパネルが置かれているディレクト*2直下の "bin32" というフォルダを、PATH に登録されている Quartus のディレクト*3 にそのままコピペ。

*1:FPGA 評価ボードメーカーから提供される、基板のテストアプリケーション

*2:例:C:\DE10_Lite_ControlPanel_V1.0.3

*3:例:C:\intelFPGA\(バージョン)\quartus folder