Lattice FPGA MachXO2でLEDチカチカ

f:id:neurois:20200829185934p:plain:h150:right 以前から秋月電子で600円で買えるLatticeのFPGA、MachXO2(LCMXO2-256HC-4TG100C)が気になっていたので、簡単にLEDチカチカまで試してみた。

回路図

回路図。最小構成にしてある。

f:id:neurois:20200829184442p:plain

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用のパターンがあるので、電源ピンだけ先に配線した。

f:id:neurois:20200829210835p:plain:h200 f:id:neurois:20200829210844p:plain:h200

回路全体。USB-シリアル変換モジュールとの配線にはブレッドボードを使った。一度書き込んでしまえば、あとはブレッドボードの配線は外しても動作する。

f:id:neurois:20200829212246p:plain:h200

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がちゃんと起動するようになる。

f:id:neurois:20200830124235p:plain
Lattice Diamond

プロジェクトの作成

「File」->「New」->「Project」でプロジェクトを作成できる。「New Project」ウィザードが出るので、プロジェクト名と保存する場所を入力する。今回、プロジェクト名は「BlinkLED」としてみた。「Select Device」で「LCMXO2-256HC-4TG100C」を選んで、「Select Synthesis Tool」で「Lattice LSE」を選択する。最後に「Finish」でプロジェクトが作成される。「~.ldf」がプロジェクトの設定ファイルのようだ。

f:id:neurois:20200830132550p:plain

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にできる。

f:id:neurois:20200830144653p:plain:h300

「Tools」->「Spreadsheet View」を開く。ここでピンアサインを設定していく。今回は、rst入力を1ピン、led出力を2ピンにしたいので、下のように設定した。

f:id:neurois:20200830150007p:plain

ピンアサインの設定は「~.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に書き込む。

f:id:neurois:20200830150944p:plain

まず、USB-シリアル変換モジュールとPCをUSB-miniケーブルでつなぐ。

「Tools」->「Programmer」を開くと、JTAGの接続を聞いてくるので、FTDIのデバイスを選択して、「Detect Cable」で「USB2 - FTUSB-1 (Dual RS232 A Location 0001)」の方を選択する。

f:id:neurois:20200830154555p:plain

「Device Family」「Device」「File Name」の項目を正しく設定して、プログラムアイコンをクリックするとコンフィグレーションが開始する。「Status」のところが「PASS」となればOK。

f:id:neurois:20200830154608p:plain

LEDチカチカできた

LEDチカチカできた。コオロギが鳴いてる。

スマホだとなぜか動画が再生できない。わからんち)