以前から秋月電子で600円で買えるLatticeのFPGA、MachXO2(LCMXO2-256HC-4TG100C)が気になっていたので、簡単にLEDチカチカまで試してみた。
回路図
回路図。最小構成にしてある。
MachXO2は不揮発のコンフィグメモリを内蔵していて、JTAGで書き込むことができる。書き込みには秋月電子で売られているFT2232のUSB-シリアル変換モジュールを使った。JTAGピンは4本(TCK、TDI、TDO、TMS)あって、TDI、TDO、TMSは4.7kΩでプルアップ、TCKは2.2kΩでプルダウンするのが良いらしい。また、TCKに10pF程度のキャパシタをつけると書き込みが安定する。
チカチカさせるLEDはFPGAの2ピンに接続した。MachXO2は内部発振器を持っているので、発振器を外付けしなくてもLEDチカチカできる。ただし、クロックの精度はあまり良くない(±5%)。
回路を作る
今回使うFPGA、LCMXO2-256HC-4TG100C。QFP100の変換基板を使ってみた。この変換基板は裏側にVCCとGND用のパターンがあるので、電源ピンだけ先に配線した。
回路全体。USB-シリアル変換モジュールとの配線にはブレッドボードを使った。一度書き込んでしまえば、あとはブレッドボードの配線は外しても動作する。
Lattice Diamondのインストール
LatticeのFPGAをプログラムするにはLattice Diamondというソフトを使う。まずは、Lattice Semiconductorのホームページに行って、右上の「Sign In|Register」からアカウントを作ってログインする。 www.latticesemi.com
ログインしたら「製品」->「Lattice Diamond」のページに行って、「Diamond Base ダウンロード」からLattice Diamondのインストーラをダウンロードする。インストーラを起動して適当にぽちぽちすればインストールされる。
これだけだと「ライセンスファイルが見つかりません」みたいなメッセージが出て起動できないので、フリーライセンスを取得する必要がある。先ほどのページから「ライセンスを取得」をクリック。「ラティスDiamond無料ライセンス」の下の「無料ライセンスを取得する」をクリックする。
「Host NIC (physical address)」を入力する欄が出てくるので、ここに12桁の物理アドレスを入力する。物理アドレスは、Windowsならコマンドプロンプトで
ipconfig /all
とすれば調べられる。その下の「I verify that I am not an employee of...」のチェックボックスに✓して、「Generate License」をクリックする。
すると、「license.dat」というファイルが添付されたメールが送られてくるので、このライセンスファイルを「C:\lscc\diamond\3.10_x64\license」のフォルダに入れる。これで、ライセンスファイルが自動的に読み込まれて、Lattice Diamondがちゃんと起動するようになる。
プロジェクトの作成
「File」->「New」->「Project」でプロジェクトを作成できる。「New Project」ウィザードが出るので、プロジェクト名と保存する場所を入力する。今回、プロジェクト名は「BlinkLED」としてみた。「Select Device」で「LCMXO2-256HC-4TG100C」を選んで、「Select Synthesis Tool」で「Lattice LSE」を選択する。最後に「Finish」でプロジェクトが作成される。「~.ldf」がプロジェクトの設定ファイルのようだ。
HDLで論理回路の作成
「File」->「New」->「File...」をクリック、ファイルの種類を「Verilog Files」として「BlinkLED.v」を作成する。内部発振器はOSCHのインスタンスを作ることで使えて、周波数はOSCH_inst.NOM_FREQで設定する。デフォルトの周波数は2.08MHzで、最大133MHzまで設定できる。今回は16.63MHzにしてみた。24-bitカウンタの最上位ビットをLEDに出力するようにした。だいたい1Hzになるはず。
module BlinkLED( input rst, output led ); reg [23:0] count; assign led = ~count[23]; // internal oscillator, 16.63 MHz defparam OSCH_inst.NOM_FREQ = "16.63"; OSCH OSCH_inst(.STDBY(1'b0), .OSC(clk), .SEDSTDBY()); // 24-bit counter always @(posedge clk or posedge rst) begin if(rst) count <= 24'd0; else count <= count + 24'd1; end endmodule
左側の「Process」タブの「Lattice Synthesis Engine」を右クリック->「Run」で論理合成が実行される。「Done: completed successfully」のメッセージが出ればOK。
ピンアサインの設定
「Tools」->「Package View」を開くと、ピンの配置を確認することができる。ピンにカーソルを合わせるとピンの機能も確認できる。Bottom Viewになっている場合は、右クリックからTop Viewにできる。
「Tools」->「Spreadsheet View」を開く。ここでピンアサインを設定していく。今回は、rst入力を1ピン、led出力を2ピンにしたいので、下のように設定した。
ピンアサインの設定は「~.lpf」ファイルに保存される。中身はこんなかんじ。
BLOCK RESETPATHS ; BLOCK ASYNCPATHS ; LOCATE COMP "rst" SITE "1" ; LOCATE COMP "led" SITE "2" ; IOBUF PORT "rst" IO_TYPE=LVCMOS33 ; IOBUF PORT "led" IO_TYPE=LVCMOS33 ;
書き込み(コンフィグレーション)
左側の「Process」タブの「Export Files」の下の「JEDEC File」に✓を入れてRunすると、「Map Design」「Place & Route Design」「Export Files」の順に実行されて、「~.jed」ファイルが生成される。これをFPGAに書き込む。
まず、USB-シリアル変換モジュールとPCをUSB-miniケーブルでつなぐ。
「Tools」->「Programmer」を開くと、JTAGの接続を聞いてくるので、FTDIのデバイスを選択して、「Detect Cable」で「USB2 - FTUSB-1 (Dual RS232 A Location 0001)」の方を選択する。
「Device Family」「Device」「File Name」の項目を正しく設定して、プログラムアイコンをクリックするとコンフィグレーションが開始する。「Status」のところが「PASS」となればOK。
LEDチカチカできた
LEDチカチカできた。コオロギが鳴いてる。
(スマホだとなぜか動画が再生できない。わからんち)