Lattice Diamondの覚書
概要
都合よくLattice社のFPGAボードが手に入ったのでそれに関するもの。具体的には「LatticeDiamond」の基本的扱い方について。
前置きが長い。
前置き
Lattice社のFPGAボードは同社が出している統合開発環境、「Lattice Diamond」を使用して設計、実装を行う。*1しかし、過去に使った身としてはあまり使い勝手のよいものではなく、当時は「これならArduino使うなあ…」というのが本音だった。
なぜ帰ってきたかというと…スイッチング電源回路のPWM出力のため。ArduinoのデフォルトのPWM出力波形は256分周980 Hz程度*2しか出ず、凝ったプログラムを組んだとしても1分周100 kHzが限度であろうという印象を受けた。個人的には256分周200 kHz~は欲しいところである。
そもそも、Arduinoの代表的なもの、Arduino UNO*3は16 MHz程度のクロックしか持たない。ネットの海で見つかる範囲でも1分周60 kHz程度しか出ない。全く足りない。そんなことでFPGAを使うことにした。
まあ、友人から譲り受けたものだ。腐らせるなら使えということだ。
FPGAボード本体は、LCMX02-7000HE 4TG144C。周波数は133 MHzまでは動作確認した。*4それ以上は怖いのでやめた。と思ったがもう1枚あるのでやってもいいかなと今思った。
動作確認は参考サイト*5のコードで行った。LEDが1 clkに1 bitづつカウントアップするVelirog HDLコードだ。VHDLでも良かったのだが、なんとなくVelilog HDLのほうが簡単*6な印象を受けたのでそこを切り口とした。何故なら、HDLの書き方なんぞ当時覚える気がなかった覚えていなかったので、これを元にお得意コピペインストール術をしてVerilog HDLを脳にざっくりインストールするためだ。1日でデコーダとPWM生成器*7が作れたので書くだけならそんな難しい言語ではないと感じた。
本題
今回はLatticeDiamondのプロジェクトの立ち上げから書き込みまで行う。
前提環境
多分Windowsの方が構築が楽だと思う。シリアル通信周りはUNIX系だと権限周りをいじらなければならないので今直ぐ、1 clkでも早く使いたいのならWindowsをおすすめする。
LatticeDiamondはシェアウェアであるが制約付きフリーライセンスが存在する。おそらく書き込みできるチップが制限されているようだ。
ライセンス取得の時、「Node-Locked」と「Floating」があるが、おそらくNode-Lockedがよい。あとNICのMACアドレスを要求される。(勝手にGUID取得してくれよ…)
書き込みの際、評価ボードであれば評価ボードの、書き込み装置であれば書き込み装置のチップのドライバが必要である。
今回はFTDIチップであったのでFTDI社からダウンロードした。これが思い出せずわからず小一時間…。
インストール
日本語を含むパスにするなってばっちゃ*8が言ってた。
LatticeDiamondの扱い方
ここから画像を含めて記載していく。とはいえ、これは自分の為なので他人が読んで云々とかはあまり考えていないかもしれない。
プロジェクト生成
赤線部分をクリックし、プロジェクトを生成する。この際にディレクトリを指定することになるが、例によって日本語を含むパスは良くない。
ここでプロジェクトの名前、実装名を指定する。
プロジェクト、実装に関しては個人利用だったらそこまで重要でない気がするが、一応現段階で筆者が理解している構造を記載する。
プロジェクト
├実装1
├...
└実装n
├HDLコード1
├...
└HDLコードn
実装ごとに書き込み対象は違う。バージョン管理は実装内で行う。あたりではなかろうか。
空欄で問題ない。
Family→Device→Part Namesの順で選ぶと楽。
Part Namesには全部入っているのでこれを選ぶだけでもよいが、目が疲れる。
このままでよい。
設計ツールの選択である。有償ライセンスだと真ん中のものが使える。のか?よくわかっていない。
これで終了。
赤線部分のFileをクリック。
言語を選んで生成。今回はVerilog HDL。
書き込み
コードを書き終えたところと仮定する。
赤線部にSpreadsheet Viewがあるのでクリック。
ピンの設定をする。UPとDOWNがあるが、出力は基本DOWN。入力は立ち上がりと立ち下がり信号、どちらで判別するかで選ぶ。画像なはし。
次にコンパイル。と言っていいのか。まあそれっぽい行為。
上から順に赤いやつだけ通しておけば多分書き込める。(雑になってきたがここらへん本当に覚えていない)
最後に赤線部のProgrammerで書き込んで終わり。通らなかったら何度かCableDetectを繰り返したり変えたりしたら通る。
以上。
あとがき
これで133 MHzのPWM生成機を作ったが、256分周でも500 kHz超えと中々面白い値を出してくれた。ここまでのスイッチングが可能なものは相当に上手く微細化されたドライバICがないと辛いであろうな。
シミュレーションとか、そこらへんの重要な機能はまだ思い出せないので書かないつもり。思い出したら別記事で書くかもしれないが、相当に面倒くさかった気がするので公開しない気もする。
*1:やろうと思えば使わなくてもなんとかなると思うがおそらく相当大変。
*2:"analogWrite()"関数、5,6番pin使用時。
*3:筆者の手元にあるものは"ATmega328"搭載。最近のものはまた変わる気がする。
*4:www.mouser.jp/datasheet/2/225/FPGA-DS-02056-3-4-MachXO2-Family-Data-Sheet-948089.pdf より、133 MHzまでの記載があった。のだが、どうやらもう少し責めれる記述をどこかで見た。
*5:bluefish.orz.hm/sdoc/machxo2_breakout.html#footnote_2
*7:後日記事にする。と言って更新していない記事がある気がする。
*8:Batignolles-Châtillon