FPGAで遊んでみた
みなさんお元気ですか?おいらは冬の寒さに負けて引きこもりがちです*1*2。引きこもると電子工作したくなるよね!という訳でちょっと前にFPGAで遊んでみたのを忘備録として書く*3。
回路とか
写真と回路図。回路図は書かずに作っちゃった*4ので実物を見て起こした。
使ったFPGAは秋月に600円で売ってるこれ↓。安いし外付け部品要らないし3.3V単電源で良いし*5手軽に始めるのに良いと思う。
書込みはJTAGを使うけど秋月のこれ↓とかで書き込める*6。FTDIのICの内のMPSSEってのに対応してるやつならJTAGが出せる*7ので行けるっぽい。
ちょっとだけ回路の工夫した点を書いておく。まずMachXO2に5Vをぶち込んじゃうのはかわいそうなので、AE-FT2232のVCCIOAに3.3Vを供給しておいた*8。
あとプルアップ/プルダウン抵抗は、MachXO2の中のデフォ設定と逆に引っ張らないといけないやつもあるらしくて、めんどいので全部2.2kΩと十分小さくした*9。
自分の場合はこれで普通に書き込めたので回路はこれで行くことにした。
ソフトとか
ここにインストールから書込みまで丁寧な解説があったので参考にした*10。
遊んでみる
とりあえず Hello World としてカウンタを書いてみた*11。動画*12とブロック図とソースコード。
わーい!FPGAでカウンタできた! pic.twitter.com/xffruaXSUv
— TEFSOM (@Si_SJ_MOSFET) 2020年11月9日
module Counter( input wire CLK, input wire RST, output wire[6:0] Qout ); reg[31:0] Count; always@(posedge RST, posedge CLK) begin if(RST) Count <= 32'h00000000; else Count <= Count + 32'h00000001; end //assign Qout[6:0] = Count[6:0]; //for test bench assign Qout[6:0] = Count[31:25]; //for blinking LEDs endmodule module top( input wire RST, output wire CLK, output wire[6:0] Qout ); defparam OSCH_1.NOM_FREQ = "133.00"; OSCH OSCH_1(1'b0,CLK,); Counter Counter_1(CLK,RST,Qout); endmodule
シミュとか
ところでHDLといえばシミュレーションしつついじりたい気がするのでその方法をメモしておく*13。
1.テストベンチを用意する
まず適当に書いて保存する。
`timescale 1ns/1ps module top_tb; reg RST; //input wire CLK; //output wire[6:0] Qout; //output top top_1(RST,CLK,Qout); task reset; begin RST = 1'b0; #10; RST = 1'b1; #10; RST = 1'b0; end endtask initial begin reset; #10000000; $finish; end endmodule
でSynthrsisには関係無いけどProjectとしては一緒にしておきたいので、File → Add → Existing File... でInput Filesに追加して、右クリックしてPropertiesからInclude for Simulation に設定した*14。
2.シミュの設定をウィズさんにしてもらう
最初に書いたtopのモジュールには、クロックとしてOSCHっていうMachXO2特有のモジュールも使っていて、全体をシミュレーションするにはそれのシミュ用ライブラリとかもちゃんと読み込まないといけないので、一旦おとなしく設定用ウィザードを使う。
図の赤丸部分を押下 → Next → Project name を適当につけてNext → Next → Source Files: に、1.で保存したテストベンチを、add simulation source file(s) してNext → Simulation Top Module: がテストベンチのモジュール*15になってることを確認してNext → Finish、で以下のように波形が見れるはず。
あと毎回この設定をしないといけないのかよめんどいなと一瞬思ったけど、Script Files ってとこにspfっていうファイルができているので、それをダブルクリックしてSkip to End すれば良いっぽい。めでたし、めでたし。
これでとりあえず一通り遊べるようになった。ちょいちょい遊んで更新したい*16。以上!
*1:寒さ以外にも最近流行りのアレとかもあるし
*2:てか前回の記事見たら暑いとか書いてて草。半年も放置しちゃった。月一くらいで書けたらいいな。
*3:というよりもう忘れちゃったので自分用に思い出しつつメモっておく
*4:UEWで一本ずつ配線してくと回路図書かなくても作れちゃうけど、しばらくして脳内から回路図が揮発すると「なんだこのもじゃもじゃは?」ってなるので、良い子は面倒くさがらずに回路図書きましょう
*5:水晶振動子とかコンフィグ用メモリとか色々載っててIOとコアで電圧が違ってて1万円以上するガチ評価ボードとかLチカだけして積むには高すぎるし使い倒す腕もまだ無い
*6:お高い謎の純正書込み器とか要らないのは良い
*7:JTAG以外も色々出せるらしいのでその内何か作ってみたい
*8:AE-FT2232のVCCIOAの電圧設定ジャンパがデフォで5V供給になってるので抜くのをお忘れなく
*9:これが詳しくて参考になった。
Macnica, Lattice-XO2基板設計時資料:
https://www.macnica.co.jp/business/semiconductor/articles/XO2_BoardDesign_rev06.pdf
*10:自分も前から気になっていたけどソフトめんどそうと思ってたところでこの記事を見つけてとても助かりました
*11:しょぼくても自分で書いたのが動くと楽しい
*12:まだピンヘッダを生やす前だ
*13:適当に我流でやったのを思い出しつつ書いた
*14:デフォでInclude for Synthrsis and Simulation になってるのをSimulation に変更した
*15:1.のテストベンチだとtop_tb
*16:PWMとかエンコーダとか既に遊んだのでその内記事書くかも