基板ができたので、LatticeのMACHXO2を実装して動かしてみました。
秋月のFTDI2232D基板をMPSSEにしてMITOUJTAGで接続。
バウンダリスキャンでCPLDが見えました。これが見えると本当に安心します。特に初めて使うICでは本当に安心できます。
EXTESTでLEDを光らせて、とりあえず「生きていること」は確認。
さて、Latticeの開発環境のDiamondというのをダウンロードします。
Diamondは使っている人が少ないのか、あまり情報がありません。
最初にハマったのはライセンスファイルの置き場所です。ライセンスマネージャのようなものが起動してライセンスファイルを指定しても、次の起動時にまた同じ画面になってしまいます。C:\flexlm\license.datに置いたら認識してくれました。
それからDiamondはリモートデスクトップでは動かないようです。会社のPCに入れたのを家から使うことはできません。
MACHXO2は内蔵オシレータを持っています。デフォルトは2.56MHzのようですが、設定で133MHzくらいまでいけるようです。
この使い方ですが、
component OSCH
-- synthesis translate_off
generic ( NOM_FREQ : string := "2.56" );
-- synthesis translate_on
port (
STDBY : IN std_logic;
OSC : OUT std_logic;
SEDSTDBY : OUT std_logic
);
end component;
attribute NOM_FREQ : string;
attribute NOM_FREQ of OSCH_INST : label is "2.56";
で宣言しておいて、
OSCH_INST : OSCH
-- synthesis translate_off
GENERIC MAP ( NOM_FREQ => "2.56" )
-- synthesis translate_on
PORT MAP ( STDBY=> '0',
OSC=> clk,
SEDSTDBY=> open
);
でインスタンシエートすればいいようです。
それから、プリミティブを呼び出すおまじないは、
library machxo2;
use machxo2.all;
です。
周波数は2.08MHz~133MHzですが精度は±5%くらいで、2個のCPLDをならべてLチカすると周期がずれていくのがわかります。
OSCHの使い方は下記のドキュメントを参照してください。
https://www.latticesemi.com/-/media/LatticeSemi/Documents/ApplicationNotes/MO/MachXO2sysCLOCKPLLDesignandUsageGuideJapaneseLanguageVersion.ashx?document_id=48195
一番の懸念だったのは、PROGRAMやDONEなどのコンフィグ用端子をユーザI/Oとして使えるかどうかですが、結論としてはOKでした。
設定箇所はTools→SpreadViewの中のGlobalPreferenceにあります。
デフォルトでCONFIGURATIONがCFGになっていて、内蔵ROMからコンフィグするのだと思われます。これをEXTERNALにしてMASTER_SPI_PORTを有効にするとおそらく外部フラッシュROMになるのだと思われます。
また、PROGRAMNやINITなどの使用はSDM_PORTの中にありました。
デフォルトではDISABLEになっているので、PROGRAMN、DONE、INITはユーザI/Oです。
結論を言うと、内蔵のフラッシュからコンフィグするようにすればPROGRAMN、DONE、INIT、SPI、I2Cの端子はユーザI/Oとして使えます。
また、JTAGの端子(TCK,TMS,TDI,TDO)はデフォルトではJTAG端子ですが、JTAGをDISABLEにすればユーザI/Oとしても使えます。ただし、JTAGをDISABLEにするとJTAGENという端子が出てくるのですべての端子をユーザI/Oにすることはできません。
最大のユーザI/O数は、全I/O数-1本か(JTAG DISABLE時)か、全I/O数-4本(JTAG ENABLE時)となります。後者のほうが使い勝手はよいでしょう。
このCPLDで謎だったのは、カウンタの値をwhen文またはif文でデコードするとカウントアップしなくなることです。
カウンタの値をレジスタにコピーして使うようにしたら問題は起きなくなったのですが、謎です。
もしかすると、内部で値を参照している出力信号に対して外部から誤ってLやHの電圧をかけてしまうと正しく動作しないのかもしれません。そういう間違いはしていないと思うのですが、高い電圧を扱う回路なのでそういうことが起きているのかもしれません。
最近のコメント