2012年02月23日

Lattice Diamond メモ

MachXO2 の論理合成をするには、Lattice Diamond というツールを使う。

使いこなしているとは到底言えないレベルだが、使い方とか分かったことを忘れないようにメモしていこうと思う。

テーマの選択

    ついでなので、どうやって 使うかを順に説明しておこうかと思う。サンプルとして何を作るかについては、乗算回路にしようと思う。32bit の CPU も作ってみたいのだが、乗算器のない MachXO2 でどれぐらいの規模になるのか見ておきたいのが理由。ちなみに MachXO2 は、LUT4 の代わりに 2b x 2b 乗算器にできる。単純な LUT4 よりは規模を縮小できそうな機能がある。

プロジエクトの生成

    "Start Page" という タブに Open とか New があるので、New をクリック。
    ダイアログが現れるので、例えば

      Project:
      Name: diamond_test1
      Location: D:/diamond/diamond_test1
      Implementation:
      Name: xo2
      Location: D:/diamond/diamond_test1/xo2

    と入力してみる。Next の ソースの追加はスキップ して "Select Device" で LCMXO2-7000ZE-1FTG256C になるように入力する。そうすると 左側の "File List" は次のようになる。

      実際に動かす場合、MachXO2 Breaout ボードなら、LCMX2-1200ZE-1TG144C を選ぶのだが、今回は、入出力を全部ポート に割り当てると 必要ポートが多すぎで Map できないケースが出る。動かすつもりもないので、大きな規模のものに変更。

      ちなみに、後で変更できるので、間違っても気にしなくて良い。



    この時点で作成されたファイルは、diamond_test1 をカレントディレクトリとして

      xo2/diamond_test1_xo2_summary.html
      diamond_test1.lpf
      diamond_test1.ldf
      Strategy1.sty
      diamond_test1.pty


ソースコードの追加

    "Input Files" を右クリックして、ソースコードを追加していく。新規ファイルは New を選ぶ。のでトップレベルから。

      module mult_test (
      input [31:0] DataA
      , input [31:0] DataB
      , input Clock, ClkEn, Aclr
      , output [63:0] Result
      );

      wire [63:0] Result;

      `define USE_PMI
      `ifdef USE_PMI
      pmi_mult #(.pmi_additional_pipeline(0)
      , .pmi_dataa_width(32)
      , .pmi_datab_width(32)
      ) MU (.DataA(DataA[31:0])
      , .DataB(DataB[31:0])
      , .Clock(1'b0)
      , .ClkEn(1'b1)
      , .Aclr(1'b0)
      , .Result(Result[63:0])
      );
      `else
      assign Result = DataA * DataB;
      `endif
      endmodule

    この内容を mult_test_pmi.v で生成すると、"Input Files" に xo2/source/mult_test_pmi.v が追加される。

    さて、pmi というのは、Parameterized Module Instantiation の略で、プリミティブのようなもの。ただし、定義したファイルを 追加しないといけない。

    Diamond をインストールするディレクトリは、lscc/diamond/1.4 のような階層になっているが、そこから pmi_mult.v を検索すると ...

    ./examples/MachXOBoard-SWDemo/Demo_MachXO2_Control_SoC/LatticeMico8_v3_1_Verilog/models/pmi/pmi_mult.v
    ./ispfpga/verilog/data/pmi/pmi_mult.v
    ./cae_library/simulation/verilog/pmi/pmi_mult.v

    の 3 つが見つかる。ispfpga と cae_library/simulation の 2 つは同じもので最新版。examples/MachXOBoard-SWDemo/Demo_MachXO2_Control_SoC に Mico8 が付属するのだが、最新版ではなく、pmi_mult.v も少し古い。(Mico8 自体を最新版にしても pmi は古い)

    ispfpga のやつを Add することにしよう。"Exsiting File" で 追加するのだが、"Copy file to ..." のチェックボックスにチェックする。

論理合成

    `define USE_PMI をコメントにして合成してみる。

    "Process" のタブを選んで実行していくと次のような画面になる。
    (実際に動かす場合は、JEDEC file にチェックして作成する。その後は、Tools の Programmer で)



    出来たところで、Map の Design Summary を見てみると次のようになった。

    Design Summary
    Number of registers: 0
    PFU registers: 0
    PIO registers: 0
    Number of SLICEs: 581 out of 3432 (17%)
    SLICEs(logic/ROM): 581 out of 858 (68%)
    SLICEs(logic/ROM/RAM): 0 out of 2574 (0%)
    As RAM: 0 out of 2574 (0%)
    As Logic/ROM: 0 out of 2574 (0%)
    Number of logic LUT4s: 36
    Number of distributed RAM: 0 (0 LUT4s)
    Number of ripple logic: 563 (1126 LUT4s)
    Number of shift registers: 0
    Total number of LUT4s: 1162
    Number of PIO sites used: 128 out of 207 (62%)

    581 スライスも使っている。1200ZE なら全部で 640 スライスしかないから、これでは使い物にならない。

    次に `define USE_PMI を有効にして再度 合成してみる。

    Design Summary
    Number of registers: 0
    PFU registers: 0
    PIO registers: 0
    Number of SLICEs: 64 out of 3432 (2%)
    SLICEs(logic/ROM): 64 out of 858 (7%)
    SLICEs(logic/ROM/RAM): 0 out of 2574 (0%)
    As RAM: 0 out of 2574 (0%)
    As Logic/ROM: 0 out of 2574 (0%)
    Number of logic LUT4s: 64
    Number of distributed RAM: 0 (0 LUT4s)
    Number of ripple logic: 0 (0 LUT4s)
    Number of shift registers: 0
    Total number of LUT4s: 64
    Number of PIO sites used: 64 out of 207 (31%)

    64 スライスと規模が小さいのだが、PIO を 64 しか使っていない。どうも 16bit 乗算までで .pmi_dataX_width になにを書いても良いというわけではないようだ。失敗。

    失敗はしたが、16bit 乗算はどうも 64 LUT らしい。2b x 2b が 1LUT なら 4b x 4b が 4LUT 、8b x 8b が 16LUT となって 16b x 16b は 64LUT 。そうであれば、うまく作れれば 32b x 32b は 256 LUT 。ただし今のところうまく作れない。

    実際にうまく作れたとしても、1 クロックで 32bit 乗算をするのが現実的なのかどうか... やはり 乗算器がある FPGA に乗り換えるのが現実的に思える。MachXO2 で、なんとかするとしても テストぐらいにしておいた方が無難そうだ。

      MachXO2 Breakout ボードは気軽に使えて便利なのだ。使えるものなら使いたい。TQFP 144 の 1200ZE と 7000ZE ならピンコンパチだと思うので、載せ替えが可能なはず。載せ替え出来れば 回路的には余裕。ただ性能が出せないので、テストぐらいしか使えないと思う。テストなら無理して 最適化する必要もないし、すなおなコードで十分。

    大体分かったので、今回はこれぐらいにしておこう。

プロジェクトのtarball

    ところで、一旦 合成すると非常に多数のファイルが作成される。Make clean 相当のことをして 再現するのに最低限のファイルのみにして tarball にしたいのだが、どうしたら良いのだろう?
    一応 *.* xo2/source xo2/*.html でファイルを指定すると ...

      Strategy1.sty
      diamond_test1.ldf
      diamond_test1.lpf
      diamond_test1.pty
      xo2/source/
      xo2/source/mult_test_pmi.v
      xo2/source/pmi_mult.v
      xo2/diamond_test1_xo2_mrp.html
      xo2/diamond_test1_xo2_pad.html
      xo2/diamond_test1_xo2_par.html
      xo2/diamond_test1_xo2_summary.html
      xo2/diamond_test1_xo2_synplify.html

    これを違うディレクトリにもっていって Project を Open することは出来た。

    ただし、Input Files は、再指定しないといけない。( xo2/source にあるファイルを全指定するので、楽ではある)。あと、html ファイルは、summary 以外 report では、見ることができない。ブラウザなどで見ないといけないのだが、最後の状態が残っているので セーブする意味はあるだろう。

      追記:
      reportview.xml も 作成されていたので、これも セーブ。あと xo2/*.prf (Preference File) もセーブすれば良いみたい。


    ところで、Implementation とは何だろう? プロジェクトに対して右クリックで "New Implementation" を Add できるから 、いくつもの バージョンを持てるようだ。ただ、lpf とかは共有しているから 『同じハードウェアに対するもの』 というのが前提らしい。

    さらに言うと、同じトップディレクトリに 多数のプロジェクトを置いたらどうなるのだろう?

    Strategy1.sty は共有されるが、一応は置くことができる。Implementation を同じにしても プロジェクト名+Implementation で主なファイルが作られているから 整合性は問題なさそう。

    こういうことを前提にして、どうプロジェクトを組み立てたら良いか考えてみよう。

プロジェクトの構成

    いま、MachXO Breakout ボード と MachXO2 Breakout の 2 つのボードを持っている。それぞれに対して、rtavr の バリエーションがいくつか考えられる。(ただし ソースコードは共有)。また、全然違うソースのテスト用コードがある。

    ひとつの Top ディレクトリに 構成していくとするならどうしたら良いか。今の案を書いてみる。

    • まず、Top に rtavr と rtavr_tools のソースコードを展開する。いくつかの例外を除いて、この ソースコードを Copy せずに 使うことにする。

    • 例外とは、Include するファイル。rtavr だと rtavr_defs.v , rtavr_common.v , rom_data.mem の 3 つ。これらは、Implementation/source にコピーして使う。

        注意) Include するパスは、ソースを Add する前に 定義しておかないと面倒なことになる。Implementation名の Properties で 指定しておく。

        あと、ソースと同じディレクトリにあるファイルの方が優先されるので、都合が悪い場合は、ソースの方もコピー指定が必要。

    • プロジェクト名は、ボード名を元にしたものにする。この先に Implementation をぶらさげる。( Implementation はボード名が違えば 別名になるようにする。)

    とりあえず ...

    (Project) (Implementation)
    MachXO2_Breakout --- rtavr_isp_xo2
    +- test_hdl_xo2

    MachXO_Breakout --- rtavr_isp_xo
    +- test_hdl_xo

    こういう風に構成できるようにしてみよう。



    お、なんかできた。Implementation は、いずれか1つを Active にして使うようだ。

    ソース(rtavr-0.9.5.tar.gz , rtavr_tools-0.6.tar.gz) を除いて tarball にしてみたところ 4MB になった。これを違うマシンの パスが違うディレクトリに作成しなおしても 大丈夫のようだ。

    ただ、調子に乗って Implementation を作ってしまうと tarball が どんどん大きくなってしまう。

      プロジェクト名.*
      reportview.xml
      Strategy1.sty
      インプリテーション名/*.prf
      インプリテーション名/*.html
      インプリテーション名/source

    だけをセーブすると 100KB 程度と随分小さくなった。再ビルドも出来るみたいだし、プロジェクトのバックアップは これのみにしよう。

  • rtavr_diamond-sample.zip (2012/2/25 更新)

    プロジェクトのサンプルを ここに置いておく。(動かすためのものではなく、論理合成の確認用として) 今の最新版の rtavr と rtavr_tools も入れてある。

Warningのチェック

    例えば rtavr_isp_xo2 を合成すると Synthesis Design だけでも 相当な Waring が出る。これをチェックすることにした。

    まず、連鎖的に Waring になるものがある。とりあえずそれを除いて整理してみる。

      s/".*\\rtavr-0.9.5\\/"/
      /enable tied to GND/d
      /Undriven input .*, tying to 0/d
      /Found undriven nets .*, mapper will optimize them/d

    こんな sed スクリプトで、何種類かのものを削除。あとファイルのパスが長すぎるので 相対パスに変換。


      @W: MT420 |Found inferred clock xo2_isp|CLK0_OUT_inferred_clock with period 1000.00ns. Please declare a user-defined clock on object "n:CLK0_OUT"


    クロックの定義が必要らしい。JTM08_007(Spreadsheet ViewでのConstraint設定),JTM08_010(タイミング制約および検証に関する注意事項) を読んでも正直良く分からない。

      とりあえず、PLL 出力で位相差がある場合は、ちゃんと計算してくれることは分かった。ただ、この Warning が出るということは、周波数は計算してくれないようだ。全部に 同じ周波数を設定してやれば良いのだろうか?

      さて、CLK0_OUT_inferred_clock とは何だろう? コード上は、CLK0_OUTで 余計なサフィックスは付いていない。しかも、"n:CLK0_OUT" という別の名前が出ている。これで随分混乱している。

      いろいろやってみると、Spreadsheet View を使うと設定したものを 制約ファイル(lpf) に書いてくれる。あと、Synplity Pro と LSE では、設定が違うようだ。

      ちなみに、Spreadsheet View は、Translate Design が終わらないと設定変更できない。また、制約ファイル(lpf)は、 # でコメントを書けるようだ。

    なにをやっても埒があかない。ひょっとして、制約は基本 LSE 用であって、Synplity Pro 向けでは制限があるのかも。

      追記: JTM08_005(SynthesisのStrategy設定と制約記述) の 30p あたりから説明があった。少し分かってきているが、当面 LSE を使うつもり。

    クロックに関係する他の Warning で要チェックなもの。

      @W: MT462 :"soc\rtavr_rom_4p.v":110:16:110:67|Net RTAVR.ROM.CLK_B appears to be an unidentified clock source. Assuming default frequency.
      @W: MT462 :"soc\rtavr_rom_4p.v":156:18:156:31|Net RTAVR.ROM.CLK_L appears to be an unidentified clock source. Assuming default frequency.
      @W: MT462 :"soc\rtavr_sram.v":80:20:80:57|Net RTAVR.RAM.CLK_90_270 appears to be an unidentified clock source. Assuming default frequency.

    これらは、特殊なことをしているので、クロックとして認識されてしまう。READ と WRITE でタイミングを変えたり、 1クロックに 2 回アクセスしていたりする。

      @W: CG532 :"isp_sample\isp.v":215:4:215:10|Initial statement will only initialize memories through the usage of $readmemh and $readmemb. Everything else is ignored
      @W: CG532 :"soc\rtavr_rom_4p.v":283:2:283:8|Initial statement will only initialize memories through the usage of $readmemh and $readmemb. Everything else is ignored

    rom では、$readmemh 使っているのだが、まだ出る。rom_data.mem のサイズが違うのかとも思ったが合っていた。要調査。

    isp では、initial 文を register の初期値に使っていた。

    reg r_cs = 1'b0;

    の記述方法で書き換えると消えはする。

      @W: FX474 |User specified initial value found in some of the sequential elements in the design. Applying an initial value to a register may not deliver the best synthesis results. For example, registers with initial values may be preserved and retiming/pipelining may not be performed. To improve synthesis results you may want to remove the register initialization from the RTL code

    この諭すような、Waring は何なのだろう? とりあえずパス。

    これでもまだ多数の Warining が残る。だが、かなりの部分は規模を減らすオプションの結果。

      `define IOR_SPHBITS 2 // SPH bits 1-8 (-15 slices)

    例えば、スタックポインタの上位ビットを定数化するオプションを入れると ...

      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[2] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[3] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[4] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[5] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[6] is always 0, o
      ptimizing ...
      @W: CL189 :"soc\rtavr_ior_ps.v":403:4:403:9|Register bit r_sph[7] is always 0, o
      ptimizing ...
      @W: CL279 :"soc\rtavr_ior_ps.v":403:4:403:9|Pruning register bits 7 to 2 of r_sp
      h[7:0]
      @W: CL246 :"soc\rtavr_ior_ps.v":56:18:56:22|Input port bits 15 to 10 of SP_IN[15
      :0] are unused

    これだけの Warning になるのだ。この手のものは、フル機能にすることでのみ Waring が消える。

    面倒だが、上の sed スクリプトを増強して、分かっているものを消していくのも手か。


      s/".*\\rtavr-0.9.5\\/"/
      /enable tied to GND/d
      /Undriven input .*, tying to 0/d
      /Found undriven nets .*, mapper will optimize them/d
      /rtavr_ior_ps.*Pruning .* r_sph/d
      /rtavr_ior_ps.*Register bit r_sph.[0-7]. is always 0, optimizing/d
      /rtavr_ior_ps.*Input port bits [0-9]* to [0-9]* of SP_IN.[0-9:]*. are unused/d
      /rtavr_ior_usart.*Pruning bit [0-9]* of rx_ps.* -- not in use/d
      /rtavr_ior_usart.*Pruning bit [0-9]* of tx_ps.* -- not in use/d
      /rtavr_ior_usart.*Pruning bits [0-9]* to .* rx_data.* -- not in use/d
      /rtavr_ior_usart.*Pruning bit [0-9]* of tx_data.* -- not in use/d
      /rtavr_ior_usart.*Pruning register bit 1 of r_count_max_x/d
      /rtavr_ior_usart.*Pruning register rx_parity/d
      /rtavr_ior_usart.*Register bit UPE is always ., optimizing/d
      /rtavr_ior_usart.*Register bit r_count_max_x.1. is always ., optimizing/d
      /rtavr_ior_usart.*Removing register 'RXB8' because/d
      /rtavr_ior_usart.*Removing register 'TXB8' because/d
      /rtavr_ior_usart.*Input WE_ubrrl is unused/d
      /rtavr_ior_usart.*Input WE_ucsrc is unused/d
      /rtavr_ior_usart.*Input WE_ubrrh is unused/d
      /rtavr_ior_usart.*Input XCK_IN is unused/d
      /rtavr_ior_usart.*Input XCK_DDR is unused/d
      /rtavr_ior_timer0.*Pruning register bit.* of r_prescaler/d
      /rtavr_ior_timer0.*Input WE_ocr0b is unused/d
      /rtavr_ior_timer0.*Input WE_ocr0a is unused/d
      /rtavr_ior_timer0.*Input WE_tccr0a is unused/d
      /rtavr_ior_port.*Input WE_pin is unused/d
      /rtavr_ior_port.*Input DI_pin is unused/d
      /rtavr_ior_spi.*Input SS_DDR is unused/d
      /rtavr_ior_spi.*Input MISO_IN is unused/d
      /rtavr_ior_spi.*Pruning register r_count_en/d
      /rtavr_ior_spi.*Pruning register r_ps/d
      /rtavr_ior_spi.*Input WE_spsr is unused/d
      /rtavr_rom_4p.*Pruning bit.* of r_addrb/d
      /rtavr_rom_4p.*Input port bit.* of ADDRA.* is unused/d
      /rtavr_rom_4p.*Input port bit.* of ADDRB.* is unused/d
      /rtavr_rom_4p.*Input OEA is unused/d
      /rtavr_s1_decode.*Pruning register r_wdr/d
      /rtavr_sram.*Pruning bit.* of r_addrb/d
      /rtavr_sram.*Input port bit.* of ADDRB/d


    十分ではないが、だいぶ見やすくなった。

      @W: CL157 :"soc\rtavr_ior_ms.v":71:18:71:20|*Output DDR has undriven bits -- simulation mismatch possible.
      @W: CL157 :"soc\rtavr_ior_ms.v":72:18:72:21|*Output PORT has undriven bits -- simulation mismatch possible.
      @W: CL246 :"soc\rtavr_ior_ms.v":73:18:73:20|Input port bits 15 to 0 of PIN[23:0] are unused
      @W: CL118 :"soc\rtavr_rom_4p.v":163:1:163:2|Latch generated from always block for signal r_doa[15:0]; possible missing assignment in an if or case statement.

    残ったのには、こんなものがある。チェックしていかないと。

    上 3 行の port 関係だが、

    // external I/O
    , output [23:0] DDR
    , output [23:0] PORT
    , input [23:0] PIN

    パラメータにこういう定義をしておいて、PORTC/PORTB/PORTA に割り当てている。PORTB/PORTA を有効にしていないので、ビット 15 - 0 が未定義のまま。上位レイヤーも 未定義な bit は使わない。

    これでも良いかということにしたのだが、論理合成では問題ないものの、Active-HDL でまずいかも ... ということか。
    下のやつは、これ。

    `ifdef ROM_USE_LATCH
    `ifdef SYS_DRIVEN_CLK4PH
    wire CLK_L = CLK_180 | OEB;
    `else
    wire CLK_L = CLK | OEB;
    `endif

    always @(ROM_DO_AB or CLK_L)
    begin
    if(~CLK_L) r_doa <= ROM_DO_AB;
    end
    assign DOA = r_doa;
    `else

    ROM_USE_LATCH というローカル define を有効にしていて、正に ラッチを作ろうとしている。遅延の最適化がそうした理由だった。まぁ目的どおりだから良いのかな?

LSEに切り替え

    デフォルトが Synplify Pro だったので、そちらがお薦めなのかと思って使っていたが、残念なことに良くわからない。 Tools に Synplify Pro for lattice なんてのがあって、これを立ち上げると、Diamond と同じような window が出てくる。Synplify Pro 専用の制約ファイル(sdc)なんてのもあるようだし、上記の "n:CLK0_OUT" とかは、その制約ファイルで使うものらしい。

    お気軽に使うのなら、LSE の方が良さそうに思えてきたので、合成ツールを 切り替えることにした。


      Preference Summary

      FREQUENCY NET "CLK_INT" 2.080000 MHz (0 errors)
      FREQUENCY NET "CLK_IN0" 24.000000 MHz (0 errors)

      FREQUENCY NET "CLK0_OUT" 33.000000 MHz (4096 errors)
      4096 items scored, 4096 timing errors detected.
      Warning: 12.772MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK90_OUT" 33.000000 MHz (1024 errors)
      2395 items scored, 1024 timing errors detected.
      Warning: 14.775MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK180_OUT" 33.000000 MHz (1726 errors)
      4096 items scored, 1726 timing errors detected.
      Warning: 15.232MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK270_OUT" 33.000000 MHz (737 errors)
      4096 items scored, 737 timing errors detected.
      Warning: 19.077MHz is the maximum frequency for this preference.

      FREQUENCY PORT "EXTOSC" 24.000000 MHz (0 errors)
      Report: 150.150MHz is the maximum frequency for this preference.

      PERIOD PORT "TOP_TCK" 0.100000 nS (1 errors)
      0 items scored, 1 timing error detected.

    LSE を使ったらクロックの設定が認識された。33 MHz にしてみたが、それは無理そうだということも分かった。まぁ HE と中身が同じなら 4 グレードレベル程度まではオーバクロック出来そうな気もするが。

    ちなみに Strategies を Space に変更した上で、GPR_16 を有効にして スペースを稼ぐ設定にしたから最遅
    という条件。

      "CLK0_OUT": 18.491MHz is the maximum frequency

      4 グレードの HC でやってみたらこうなった。ざっと 1.5 倍か。

      strategies を Strategy1 に戻し、GPR_16 も無効にすると 20 MHz ぐらい。

      FREQUENCY NET "CLK0_OUT" 22.000000 MHz (0 errors)
      Report: 25.938MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK90_OUT" 22.000000 MHz (0 errors)
      Report: 28.073MHz is the maximum frequency for this preference.

      REQUENCY NET "CLK180_OUT" 22.000000 MHz (0 errors)
      Report: 32.356MHz is the maximum frequency for this preference.

      FREQUENCY NET "CLK270_OUT" 22.000000 MHz (0 errors)
      Report: 29.255MHz is the maximum frequency for this preference.

      さらに、22 MHz で制約を変更すると 25.9 MHz 。

rtavr_diamond-sample.zip(2012/2/25 更新) を試す

    大分脱線してしまったが、すぐ試せるものをリリースできるかどうかは、重要だ。それにクロックも。どれぐらいで動くものなのか知らないと動かすのが難しい。

    さて、上記のものを展開して、MachxO2_Breakout.ldf を open すると test_hdl_xo2 がターゲットの インプリメンテーションになっている。

    project の JEDEC File にチェックを付け、ダブルクリックをすると ... なにやら出来上がる。

    で、programmer で書き込みしようとすると、xcf ファイルがないと言われてエラーになる。この場合は、Scan 実行すると xcf ファイルが生成されて オペレーションが出来るようになる。(Check XCF File だったかも)

    動かしてみると ... LED0/1 と LED 2-5 が 1 秒毎ぐらいで点滅し、LED 2-5 の点滅が遅れて ずれるために光が流れるような動きをする。これが予定通りの動き。

    warning について

    沢山 warning が出るのだが、

      OSCH 'osc_internal' has mismatching FREQUENCY preference value of 2.08 MHz and NOM_FREQ value of 24.18 MHz.

    まず気になるのはこれ。24.18 MHz だと 1 秒ぐらいの点滅間隔なので、コードに書いた NOM_FREQ が有効のようだ。

    2.08 MHz というのは、デフォルトで勝手に設定される。Spread sheet View の Timing Preferences で NET "CLK" を modify するか、制約ファイル(lsf)に

    FREQUENCY NET "CLK" 24.180000 MHz ;

    を追加するかすれば、直るはず。


      ERROR - <E0055> Port 'TXD' is unconnected.
      ERROR - <E0055> Port 'RXD' is unconnected.

    なんてエラーが出る場合がある。これは、rtavr と同じ制約ファイルを使っているため。# でコメントすれば一応は出なくなる。ただ、インプリメンテーションを変更する毎にいちいち編集はしてられない。

    さて、

      WARNING - trce: Output clock frequency on pin CLKOP of pll is 12.0 MHz, whichwith divider 16, requires internal VCO frequency to be 192.0 MHz ( 12.0 MHz x 16), outside VCO valid range [400, 800] MHz.

    この手の warning がやたら出てうるさい。


      FREQUENCY NET "CLK" 24.180000 MHz ;
      FREQUENCY NET "CLK_IN0" 24.000000 MHz ;
      FREQUENCY NET "CLK0_OUT" 24.000000 MHz ;
      FREQUENCY NET "CLK90_OUT" 24.000000 MHz ;
      FREQUENCY NET "CLK180_OUT" 24.000000 MHz ;
      FREQUENCY NET "CLK270_OUT" 24.000000 MHz ;
      FREQUENCY PORT "EXTOSC" 24.000000 MHz ;
      FREQUENCY PORT "TOP_TCK" 0.100000 MHz ;

    まずは、制約ファイル。一応近い値にしてやる。これだけだと 400 MHz 以下なので、too_test.v の

    , .CLKOP_DIV(32)
    , .CLKOS_DIV(32)
    , .CLKOS2_DIV(32)
    , .CLKOS3_DIV(32)

    CLKOP_DIV 等の値を全部 2 倍の 32 にすると 見事消えてくれる。

    これで、Warning は随分見やすくなる。

      WARNING - synthesis: logical net 'TXD' has no load
      WARNING - synthesis: input pad net 'TXD' has no legal load
      :
      WARNING - map: input pad net 'TXD' has no legal load
      WARNING - map: input pad net 'RTS' has no legal load
      WARNING - map: input pad net 'DTR' has no legal load
      WARNING - map: input pad net 'RXD' has no legal load
      WARNING - map: input pad net 'CTS' has no legal load
      WARNING - map: IO buffer missing for top level port TXD...logic will be discarde
      d.
      :

    これは、top モジュールの引数に書いてあるのに使っていないため。エラーになることはないので無視。

      WARNING - synthesis: logical net 'clk_count1_113_add_4_1/CI' has no driver
      WARNING - synthesis: logical net 'clk_count1_113_add_4_1/S0' has no load
      WARNING - synthesis: logical net 'clk_count2_114_add_4_25/CO' has no load

    これは、加算器のキャリー関係。明示的に記述もしてないし、勝手に作られて、勝手に消される。これも無視。/CI /CO /S0 /S1 あたりが対象。

    こうやって直していくのは良いのだが ... インプリメンテーションを変更した時どうするのが良いのだろう?

    lpf ファイルは、複数持てる。で、インプリメンテーション同様に 1 つをアクティブにするという使いかたをする。よく分からなかったのだが、JTM08_002(プロジェクト管理) 29p あたりに書いてあった。

付録

    どこでどんなファイルを使っているか、抜けはあると思うがまとめてみた。

    synpwrap: Synthesize Design (Synplify Pro)
    MachXO2_Breakout_test_hdl_xo2_synplify.tcl
    MachXO2_Breakout_test_hdl_xo2.srf
    synlog/MachXO2_Breakout_test_hdl_xo2_premap.srr
    synlog/MachXO2_Breakout_test_hdl_xo2_fpga_mapper.srr
    MachXO2_Breakout_test_hdl_xo2.srm

    edif2ngd:
    MachXO2_Breakout_test_hdl_xo2.edi
    MachXO2_Breakout_test_hdl_xo2.ngo

    ngdbuild:
    MachXO2_Breakout_test_hdl_xo2.ngo
    MachXO2_Breakout_test_hdl_xo2.ngd

    synthesis: Sythesize Design (LSE)
    MachXO2_Breakout_test_hdl_xo2_lattice.synproj
    MachXO2_Breakout_test_hdl_xo2.ngd

    map: Map Design
    MachXO2_Breakout_test_hdl_xo2.ngd
    MachXO2_Breakout_test_hdl_xo2_map.ncd
    MachXO2_Breakout_test_hdl_xo2.prf
    MachXO2_Breakout_test_hdl_xo2.mrp

    mpartrce:
    MachXO2_Breakout_test_hdl_xo2.p2t
    MachXO2_Breakout_test_hdl_xo2.p3t

    MachXO2_Breakout_test_hdl_xo2.pt
    MachXO2_Breakout_test_hdl_xo2_map.ncd
    MachXO2_Breakout_test_hdl_xo2.ncd

    par: Place & Route Design
    MachXO2_Breakout_test_hdl_xo2.p2t
    MachXO2_Breakout_test_hdl_xo2_map.ncd
    MachXO2_Breakout_test_hdl_xo2.dir
    MachXO2_Breakout_test_hdl_xo2.prf

    # Dumping design to file MachXO2_Breakout_test_hdl_xo2.dir/5_1.ncd.

    trce: Place & Route Trace
    MachXO2_Breakout_test_hdl_xo2.pt
    MachXO2_Breakout_test_hdl_xo2.twr
    MachXO2_Breakout_test_hdl_xo2.ncd
    MachXO2_Breakout_test_hdl_xo2.prf

    iotiming: I/O Timing Analysis
    MachXO2_Breakout_test_hdl_xo2.ncd
    MachXO2_Breakout_test_hdl_xo2.prf

    bitgen: Export Files (JEDEC File)
    MachXO2_Breakout_test_hdl_xo2.t2b
    MachXO2_Breakout_test_hdl_xo2.ncd
    MachXO2_Breakout_test_hdl_xo2.prf (Preference File)
    MachXO2_Breakout_test_hdl_xo2.jed

参考資料

  • Lattice Diamond 1.3 マニュアル

    JTM08_001 インストールとライセンス設定
    JTM08_002 プロジェクト管理
    JTM08_003 GUIのカスタマイズと環境設定
    JTM08_004 デザインフローとRun Mangerによる並列処理
    JTM08_005 SynthesisのStrategy設定と制約記述
    JTM08_006 Translate DesignのStrategy設定と注意点
    JTM08_007 Spreadsheet ViewでのConstraint設定
    JTM08_008 Package Viewによるピンアサイン
    JTM08_010 タイミング制約および検証に関する注意事項
    JTM01_009 SSO Analyzerユーザーマニュアル
    JTM08_012 Map DesignのStrategy設定と注意事項
    JTM08_015 Map Traceとシミュレーション
    JTM08_013 Place & Route DesignのStrategy設定と注意事項
    JTM08_016 Place & Route TraceとI/O Timing Analysis
    JTM05_001 Power Calculatorユーザマニュアル
    JTM08_018 シミュレーション・ユーザガイド
    JTM08_014 書き込みデータ生成


  • file:///C:/lscc/diamond/1.4/docs/webhelp/eng/start_page.htm オフラインドキュメント(1.4)
posted by すz at 23:48| Comment(0) | TrackBack(0) | MachXO2

2012年02月22日

MachXO2のクロック

MachXO2 Breakout ボードを使ってみて覚えたことをメモしておこうと思う。

内蔵オシレータ

    MachXO2 は、MachXO と同じくオシレータを内蔵している。MachXO2 から良くなったのは、周波数を設定できること と 精度が規定されたこと。

    MachXO は、18 〜 26 MHz と なっているだけで とりあえずクロックが使えれば良いという用途でしか使えなかった。

    MachXO2 では、133 MHz を 1 , 1.5 , 2, 2.5 ... 62 で分周した周波数を出力可能。64 通りの設定がある。精度は±5% で、あまり良いわけではないが、それでも 目安にはなる。

    分周比は、1 〜 16 の範囲では、0.5 刻み。16 〜 32 は 1 刻み、32 〜 62 では 2 刻み。

    OSCH #(.NOM_FREQ("24.18")) osc_internal
    (.OSC(CLK_INT), .STDBY(1'b0));

    こんな風に使う。NOM_FREQ の値は、TN1199 の表に書いてあるものと同じでないといけないことになっているが、本当かどうか 未確認。

PLL

    PLL は、EHXPLLJ というのを使うのだが、

      f = CLKI/CLKI_DIV(1-40) x CLKFB_DIV(1-40) x CLKOP_DIV(1-128:default 8)

    の周波数が VCO の周波数になる。実際に合成して Warning を見ると、VCO 周波数は、400 〜 800 MHz の範囲でないといけないらしい。... が、多分間違いで、データシートを見ると 200 〜 800 MHz の範囲。CLKOP_DIV が 8 なら CLKOP の範囲は、 25MHz 〜 100 MHz ということに。

    CLKOP の出力は

      f = CLKI/CLKI_DIV(1-40) x CLKFB_DIV(1-40)

    だが、CLKOS, CLKOS2, CLKOS3 は、

      f = CLKI/CLKI_DIV(1-40) x CLKFB_DIV(1-40) x CLKOP_DIV(1-128:default 8) / CLKOSn_DIV(1-128:default 8)

    になるようだ。

    あと、これらは、ENCLKOSn を 1 に設定してやらないと出力されない。

    (いろんな使い方をして構わないが) 基本 四相のクロック出力をするときに使う。その場合は、CLKOSn_DIV の値は、CLKOP_DIV に一致させる。

    位相は、CLKOSn_FPHASE パラメータで 0-7 を指定する。45°単位。

    さて、 ちゃんと記述しても Waring が出る。

      WARNING - par: Output clock frequency on pin CLKOP of pll is 100.0 MHz, which with divider 16, requires internal VCO frequency to be 1600.0 MHz ( 100.0 MHz x 16), outside VCO valid range [400, 800] MHz.

    こんなメッセージ。ここの 100.0 MHz は、制約による指定で、

    FREQUENCY NET "NET名" 24.0 MHz

    というのを制約ファイル(.lpf) に記述することで指定する。

    あと、正しいレンジは、200 - 800 MHz のようなので、400 MHz を切る設定をしても良さそうなのだが、Warning を消すのは難しいかも知れない。

    ついでに書いておくと、MachXO や LatticeXP2 も PLL を持っている。MachXO では、EHXPLLC LatticeXP2 では、EHXPLL1 というのを使うらしいのだが、MachXO2 のものほど 高機能ではない。

PLLの動作確認


    OSCH #(.NOM_FREQ("24.18")) osc_internal
    (.OSC(CLK_INT), .STDBY(1'b0));

    DCMA clk_selector (.CLK0(CLK_INT)
    , .CLK1(EXTOSC)
    , .SEL(1'b0) // 0: CLK0 1: CLK1
    , .DCMOUT(CLK_IN0)
    );

    EHXPLLJ #(
    .CLKI_DIV(24)
    , .CLKFB_DIV(24)
    , .CLKOP_DIV(16)
    , .CLKOS_DIV(16)
    , .CLKOS2_DIV(16)
    , .CLKOS3_DIV(16)
    , .CLKOP_FPHASE(0)
    , .CLKOS_FPHASE(2)
    , .CLKOS2_FPHASE(4)
    , .CLKOS3_FPHASE(6)
    ) pll
    (.CLKI(CLK_IN0)
    `ifdef SYS_DRIVEN_CLK4PH
    , .CLKOP(CLK0_OUT)
    , .CLKOS(CLK90_OUT)
    , .CLKOS2(CLK180_OUT)
    , .CLKOS3(CLK270_OUT)
    , .ENCLKOS(1'b1)
    , .ENCLKOS2(1'b1)
    , .ENCLKOS3(1'b1)
    `else
    , .CLKOP(CLK_IN)
    `endif
    );

    完全には正確ではないのだが、こんな感じで使ってみた。

    それぞれのクロックに カウンタを付けて、1 秒程度おきに点滅させてみたところ、おなじ周期で点滅した。ただし、PLLの出力が (CLK_IN0に対して) ずれていく現象になった。

    原因は PLL の ロック が外れまくるため(のはず)。内蔵オシレータを基準クロックに使うのは、さすがに無理があるようだ。ただ、水晶なら問題ないとして、セラミック発振子を使ったり RC 発振だとどうなるのだろう? いずれ実験してみたい。

    ちなみに DCMA (Dynamic Clock Mux) は、おまけ。ドキュメントに書いてあったので使ってみただけ。

PLLの出力周波数の設定

    切りの良い周波数を 出力するのに

      CLKI_DIV : 入力周波数と同じにする。(1-40)
      CLKFB_DIV:出力周波数と同じにする。(1-40)
      CLKOP_DIV: 出力周波数 x CLKOP_DIV が 200 (400?) を超えるように 8/16/32 .. から選ぶ。

    基本の考えかたを、こんな風にしようかと思う。そうするなら、入力周波数は、切りが良ければなんでも良い。ただ応用できる範囲を広げるには、5x4 MHz とか 6x4 MHz とかが良さそうな気がしている。

PLL周波数をユーザ回路で変更

    MachXO2 だとこれが出来る。

    lscc/diamond/1.4/cae_library/synthesis/verilog/machxo2.v に EHXPLLJ に定義がある。インターフェイス仕様は WISHBONE。ドキュメントは、TN1199(J) の付録 D 。

水晶発振器

    MachXO2 Breakout ボードには、5mm x 7mm のオシレータのパターンもある。

    EXTOSC 27 PL9A_PCLKT3_0
    EXTOSC_EN 32 PL10A

    クロック出力だけでなく、Enable ピンにも接続されている。(R54 でジャンパされている)。

    回路図には、CB3LV-3C の 50MHz が記載されているが、消費電流が 40mA と大きく、±50ppm と精度もいまいち。16mA で ±10ppm の ASYMB の方が良いかも。

    秋月だと 『クリスタルオシレーター 40MHz』というのがある。いつなくなるかも分からないが ..

    J4

    (EXTOSC)PL9A 27 (33) (34) 28 PL9B
    GND (35) (36) GND
    (EXTOSC_EN)PL10A 32 (37) (38) 33 PL10B
    PL10C 34 (39) (40) 35 PL10D

    この信号は、20x2 のコネクタにも出ている。場所は、内側の 左(J4) の下。

    ユニバーサル基板を載せるのなら、こちらを使っても同等になる。その場合は、DIP 品(3.3V)が使える。といっても秋月でも 300円

その他の発振回路

    例えば、(EXTOSC)と (EXTOSC_EN) は、GND を挟んで配置されているのだが ... ここに 水晶とか セラミック発振子を付けて発振させられないかと思っている。単なるインバータなら 簡単に実装できるが、なんとかなるものなのか? 入出力にはいろんな設定があるので、設定次第なのかも知れない。

    追記: オシレータが入手できたので、(EXTOSC)と (EXTOSC_EN)を使っての実験はヤメ。

    J2
    (1)(2)
    NC VCCIO0
    PT17D/DONE 109 110 PT17C/INTn
    PT17B 111 112 PT17A
    GND GND
    PT16D 113 114 PT16C
    PT16B 115 117 PT15A
    PT15D/PROGn 119 120 PT15C/JTAGen
    GND GND

    J2 左側の外側上あたり。PT17A と PT16C が良さそうな。

      設定できるのは、プルモード、ヒステリシス、クランプ動作 あと ドライブ強度。これらは、制約ファイル(.lsf) にも記述できるし、プリミティブもあるようだ。

      それに加えて DELAYE とかのプリミティブもある。なにがどう使えるかは良く分からない。

      追記:



      こんな回路で、XIN , XOUT にインバータを入れれば良いらしい。水晶+コンデンサをセラミック発振子に変えても良い。

      村田製作所の FAQ 『発振回路部の各部品の役割について教えてください。』を見ると、R1(1M) は、帰還抵抗で C-MOS ICでは100k〜10MΩ (通常1MΩ) とのこと。『大きすぎると帰還量が減って動作点が不安定になり、小さすぎるとゲインの低下や、電流の増大につながります』と書いてあるから、入れないと発振が不安定になるかも知れない。

      XOUT 側 帰還抵抗 R1 と 水晶(セラミック発振子)の間に抵抗を入れる場合がある。『負荷容量とローパスフィルタを形成し、高域のゲインを低下させることで、高周波の異常発振を抑えられます。』なんて説明があるが、通常不要らしい。もともと数十Ωが入っているようなものだし ... それにドライブ強度の変更で調整できるかも。

      ... というわけで FPGA でも 単なるインバータ + この回路で良さそうだ。(1M は省略しないこと)

      さて、『セラミック発振子 40MHz (YIC社)』というのは、使えるのだろうか? 周波数が高めで AVR とかでは使えないが FPGA なら丁度良いかも知れない。

      最も 『クリスタルオシレーター 40MHz』なんてのもあるのだが ... いつまでもあるとは限らないし、水晶発振子やセラミック発振子の回路も押さえておきたい。

      ちなみに、安い YIC社のやつは、8,12,16,20,25,32,40,48 MHz と各種ある。PLL が使えそうだからなんでも良さそうだが ...

      いつか実験しよう。

      RC発振器(1)



      シュミットトリガ入力 と オープンドレイン出力がある MachXO2 だとこういう回路もあり?
      (シュミットトリガ入力 = HYSTERESIS : LARGE ?)

      R1 = 10k , C1 = 20pF ぐらいで数MHz ?

      原理は、コンデンサに充電されていって 入力の電位が上がってくると 出力が L になって コンデンサが放電される。ただ 0 になる前に Hi-Z に戻る。入力の波形はのこぎり波(に近い三角波)。シュミットトリガ入力 でないと 波高が 0 だから使えない。

      RC発振器(2)



      むしろオープンドレイン出力を使わないこっちのが普通?

      こっちの原理は、入力 L のときは、 充電で H になると反転して 放電。入力の波形は三角波。こっちも、シュミットトリガ入力必須。

      出力強度を変えたり、 HYSTERESIS : SMALL にすると周波数が変わるはず。

      いずれにしてもあまり高い周波数向けではないような.. それに定数が分からない。

    ところで、 PL9A は、PCLKT3_0 というクロック入力用 ピンが割り当てられている。こういったピンは、他にもあって 1200 の LQFP144 は、

    PT12B_PCLKT0_1 128
    PR5C_PCLKT1_0 92
    PB9A_PCLKT2_0 49
    PB11A_PCLKT2_1 55
    PL9A_PCLKT3_0 27
    PL5A_PCLKT3_1 19
    PL3A_PCLKT3_2 5

    という割り当てになっている。

    これらのピンは、外部回路と同期を取るのに重要そうだが、PLL にクロックを供給するだけなら、これを使う必要はないはず。たまたま DCMA を使ってみたが、DCMA は、PLL にクロックを供給できる。DCMA の入力は、general routing が使えるみたいだから、要はなんでも良いみたいだ。

    RC発振器は、単なるインバータで良かったはず。そういえば、フランクリン発振器もそう。

四相クロックについて

    普通 四相クロック が欲しいなら PLL で良いわけだが、内蔵オシレータをクロック元にすると PLLのロックが外れることが頻繁に起きる。通信でこういうことが起きると少々具合がわるい。分周して 四相クロックを作る方法も 検討しておこう。


      reg [3:0] r_clk_0 = 4'b0110;
      reg [3:0] r_clk_90 = 4'b0011;
      reg [3:0] r_clk_180 = 4'b1001;
      reg [3:0] r_clk_270 = 4'b1100;

      always @(posedge CLK_IN0) // CLK4X
      begin
      r_clk_0 <= { r_clk_0[2:0] , r_clk_0[3] };
      r_clk_90 <= { r_clk_90[2:0] , r_clk_90[3] };
      r_clk_180 <= { r_clk_180[2:0] , r_clk_180[3] };
      r_clk_270 <= { r_clk_270[2:0] , r_clk_270[3] };
      end

      wire CLK0_OUT = r_clk_0[3];
      wire CLK90_OUT = r_clk_90[3];
      wire CLK180_OUT = r_clk_180[3];
      wire CLK270_OUT = r_clk_270[3];

    Xilinx だとこんなコードが良さそう。SRL16 を使っていることになるから 4LUT しか消費しないんじゃないかと思う。

    だが、Lattice では、SRL16 相当の機能はないようだ。MachXO2 では、カウンタとか 比較機能を持っているから素直なロジックのコードが良いのかも知れない。

      reg [1:0] r_clk_cnt = 2'b00;
      reg [3:0] r_clk_out = 4'b1100;

      always @(posedge CLK_IN0) // CLK4X
      begin
      r_clk_cnt <= r_clk_cnt + 1;
      r_clk_out[0] <= (r_clk_cnt == 0) | (r_clk_cnt == 1);
      r_clk_out[1] <= (r_clk_cnt == 1) | (r_clk_cnt == 2);
      r_clk_out[2] <= (r_clk_cnt == 2) | (r_clk_cnt == 3);
      r_clk_out[3] <= (r_clk_cnt == 3) | (r_clk_cnt == 0);
      end
      wire CLK0_OUT = r_clk_out[0];
      wire CLK90_OUT = r_clk_out[1];
      wire CLK180_OUT = r_clk_out[2];
      wire CLK270_OUT = r_clk_out[3];

    あと POWER ON RESET 関係。すこし遅延させたい。


      reg [15:0] reset_sft = 16'h0000;
      always @(posedge CLK)
      begin
      reset_sft <= { reset_sft[15-1:0] , 1'b1 };
      end
      wire RESET = reset_sft[15];

    Xilinx だと 16bit まで 1 LUT だから、こんなのもアリだと思うのだが、他は具合がわるい。


      reg [3:0] reset_cnt;
      reg r_reset;
      always @(posedge CLK)
      begin
      if (reset_cnt == 4'b1111)
      r_reset <= 1'b1;
      else
      reset_cnt <= reset_cnt + 1;
      end
      wire RESET = r_reset;

    素直な コードだとこう?

    ところで、MachXO2 だと、シフトを使った コードはどちらも期待どおりにならない。初期値の設定がどうやっても出来ず、最終的に 定数 になるようだ。Synplify Pro も LSEも同じ。

    上記の reset_cnt のコードだと Synplify Pro は定数でないものを合成してくれる。が、LSE はダメ。


      reg [15:0] reset_sft = 16'h0000;
      reg r_reset = 1'b0;
      always @(negedge CLK_IN)
      begin
      if (r_reset != 1'b1)
      begin
      r_reset <= 1'b1;
      reset_sft <= 16'h0000;
      end
      else
      reset_sft <= { reset_sft[14:0] , 1'b1 };
      end
      assign RESET = reset_sft[15];

    このコードだと Synplify Pro は定数でないものを合成してくれる。が、LSE はダメ。
    r_reset を使わずに、( reset_sft != 16'hFFFF) なんて条件を使うと、Synplify Pro でもダメ。

    Warning をしっかり見ないと 期待どおりかどうか分からない。

    WARNING: Register r_reset_11 is stuck at One

    LSE だとこういうエラー に注意。

    ちなみに、こういうコードは、クロックや RESET 自体の生成にしか重要でないように気をつけてはいるのだが...

参考資料
posted by すz at 22:53| Comment(0) | TrackBack(0) | MachXO2

2012年02月07日

MachXO2 1200ZE Breakout ボード

2572円と安価に買える FPGA ボードについて。

    追記: 2012/10/8 なんと秋月で取り扱い開始! 2600 円也

    追記: 2013/4/26 LCMXO2-7000HE-B-EVN にグレードアップ。チップ置換であとは同じ。秋月では 3000 円。

     ユーザーズガイドの回路図すら直してない。VCCIO4,5 が VCCIO3 のままになってる。



簡単な説明

    FPGAは、Lattice 社の MachXO2 1200ZE 。価格は $29.99。発表は 2012/1月

    このボードには、FT2232H が載っていて、非常に安易に使える。USB に接続するだけだ。Lattice 社の合成ツール Diamond でもサポートしていて、ビルドしてから、2オペレーションで書き込みが可能。

      (1) Tools→Programmer を選ぶと ダイアログが出る。
      (2) (一回設定した後は) Download ボタンを押す。

    FPGA に接続されているデバイスは、JTAG と シリアル と LED x 8 。

      5mm x 7mm のオシレータのパターンもある。(スタンバイモードがある) ASYMB 24 MHz あたり を Breakout ボードと同時に買っておくのが良さそう。ただし、300 円ぐらいであまり安くないので、後でマルツで買うのも良いかも。
      ちなみに、回路図に載っているのは、CB3LV-3C の 50MHz。

    製品 URL : MachXO2 1200ZE Breakout Board Evaluation Kit Resources

MachXO 2280 Breakout ボード との違い

    MachXO 2280 Breakout ボード もまた、同価格で安価に入手できる。こちらの方が規模が大きく、使えるピンの数も多い。ただし、EBR RAM は、9kb がたったの 3 つ。MachXO2 1200ZE は、7 つあり プログラムに使えるメモリを 4KB は割り当てられる。

    MachXO2 1200ZE Breakout ボード の方は、FT2232H の機能を流用しやすくなっている。JTAGENB ピンが コネクタに出ているので、Disable すれば JTAG ボードとして流用可能。Serial ( BDBUS0-6) も ジャンパすれば FPGA で使える。

    ちょっと FPGA を試してみるとかといった使い方には向いていそうだ。

      追記:JTAG として使えないようにするには、config で JTAG_PORT を DISABLE に設定する。その場合 JTAGENB ピンが専用ピンになり、H レベルにすることで、JTAG が使えるようになる。

      要するに JTAG 関係のピンを全部 HI-Z にして、 JTAG_PORT を DISABLEにした config データを書き込めば、JTAG を外部回路用に引き出せる。JTAGENB ピンを H レベルにするスイッチを付けて ON にすれば再度JTAG を使用できる。

      (追記2)JTAG コネクタは、Lattice 用 8pin タイプ

      (1) (8)
        3V3 TDO TDI NC NC TMS GND TCK

      こうなっている。 デジタルデザインテクノロジー No.1(ISBN:9784789849401 : ググるとまだ売っている)の XP2 基板 に接続する場合は、(1) を 除いて 接続すれば良さそう。

      追記(注意): 1200ZE は、低消費電力向けチップで、スピードグレードは 、1 。HC あるいは HE が最大周波数 150 MHz のところ ZE は、60 MHz 。趣味の範囲できっちり守るべきかどうかは分からないが、あまり高速で動かすものではないのは確か。

      追記: BDBUS のシリアルを使うには、裏面の R14〜R21 をジャンパするか、そのパターンを使って引き出す。割り当ては、

      R14 BDBUS0 TXD
      R15 BDBUS1 RXD
      R16 BDBUS2 RTS
      R17 BDBUS3 CTS
      R18 BDBUS4 DTR
      R20 BDBUS5 DSR
      R21 BDBUS6 DCD


MachXO2 7000 が購入可能になっている。

    思いのほか安くて驚いた。TQ144 の LCMXO2-7000HE-4TG144C が 1239 円。4000 までは EBR SRAM が少なく面白くないのだが、これは 9kb の EBR SRAM が 26 個付いている。

      Spartan-6 LX9 も 1346 円と同じような価格。こちらは 18kb の ブロック RAM が 32 個。規模も大きいんだろう。そういえば MachXO2 は 乗算器もない。いままで 1200 しかなかったのが、7000 になって喜んでみたが、実は大したことはないのかも。

      ちなみに、MachXO2 1200 は、Spartan-3A 50 より規模が小さい。50A は、704 スライスだが、1200 は、640。50A のブロックRAM は、18kb x 3 で 1200 の 9kb x 7 と同じようなもの。
      MachXO2 7000 は、3442 で 400A の 3584 スライス と同じぐらい。400A のブロックRAM は、18kb x 16 なので、9kb x 26 の 7000 はちょっと少ない。

    TQ144 の 7000ZE とか 7000HE とかを MachXO2 1200ZE Breakout ボード のチップと入れ替えられると便利なような気がするのだが ...

    外すのは、SMD取り外しキット:1575円を使うとして ... さて。

    追記: BSDLファイルを比べてみたが、載せ替え自体は可能なようだ。

      4000/7000 2000 1200
      30 VCCIO3 VCCIO3 VCCIO3
      7 VCCIO4 VCCIO4 VCCIO3
      16 VCCIO5 VCCIO5 VCCIO3

      15 v NC NC
      17 v NC NC
      31 v NC NC
      63 v NC NC
      87 v v NC
      89 v v NC
      103 v NC NC
      129 NC NC NC

      電源,NC の違いは、こう。2000 以上はバンク 4,5 があるが、VCCIO3 が割り当てられている。あと、1200 は、NC が多いため、載せ替えると使えないピンが出てくる。ちなみに信号名の割り当ては違うが、ピン番号で指定するからあまり関係ない。機能のピンの割り当ては同じようだが未検証。JTAG や I2C は同じだったが、他は見てない。

      ところで、HC の BSDL ファイルしかないが、HE,ZE も信号線は同じなんだろう。HC はレギュレータ付きだが、HE,ZE との違いは良く分からない。(レギュレータ用のピンが見つからない。むしろ HE,ZE 用に見える。) まぁ 7000HE,7000ZE の載せ替えは可能そうだ。

      ついでなので、機能のピンの割り当てに付いても調べた。

      4000/7000 2000 1200

      5 PCLKT5_0 PCLKT4_0 PCLKT3_2
      6 PCLKC5_0 PCLKC5_0 PCLKC3_2
      19 PCLKT4_0 PCLKT4_0 PCLKT3_1
      20 PCLKC4_0 PCLKC4_0 PCLKC3_1

      104 R_GPLLC_IN
      105 R_GPLLT_IN
      106 R_GPLLC_FB
      107 R_GPLLT_FB
      111 R_GPLLC_MFGOUT2
      112 R_GPLLT_MFGOUT2

      2000 以上は、バンクの関係でクロック入力の名前が変わった。あと、4000/7000 は PLL が増えた。

      違いは、これだけ。これなら、ターゲットデバイスを変更するだけで 1200 用の コードもそのまま動く。

      追記: HC と HE/ZE の BSDL ファイル がリリースされていたので比較してみた。

      どうも電源ピンの定義は同じようだ。違いは ID 。

      device code 0x012B 2043 -- 1200ZE/HE
      device code 0x012B 3043 -- 2000ZE/HE
      device code 0x012B 4043 -- 4000ZE/HE
      device code 0x012B 5043 -- 7000ZE/HE

      device code 0x012B A043 -- 1200HC
      device code 0x012B B043 -- 2000HC
      device code 0x012B C043 -- 4000HC
      device code 0x012B D043 -- 7000HC

Lattice (MachXO2) がお気に入りの理由

  • 開発ツールが小さい

    小さいといっても Lattice Diamond は、1.7GB もあるのだが ... それでも Xilinx の ISE なんかと比べるとはるかに小さい。使い勝手も良いみたいだし、気に入っている。

  • Digikey で買える

    Digikey で買えないものは候補にならないのだが、幸い購入可能。電子工作レベルで使える TQFP 100 や 144 品の種類も豊富にあるのが良い。

    TQFP 100 だと、2000 まで 、144 では 7000 まで。

  • お手軽

    FLASH を内臓しているし、レギュレータや 内臓クロックもあるので、チップ単体で 動かすことも可能。

    開発ツールもあわせて、総じてお手軽に使えるというのが良い。

    ついでに書いておくと ライセンスキーは、Mac アドレスに対して発行される。この Mac アドレスは、USB Wifi ドングルのものでもよい。要するに インターネットカフェのようなところでも実行が可能なのだ。プログラムも小さめなので、インストール時間は短めで 実際に 利用可能。

      内蔵クロックは、133 MHz を 1 , 1.5 , 2, 2.5 ... 62 で分周した周波数を出力可能。64 通りの設定がある。精度は±5% だそうで、あまりあてにできないが、とりあえずは便利に使える。MachXO も 持っているのだが、周波数は設定できず 20MHz (18 MHz - 26 MHz) 。( MachXO2 で設定できる近い周波数は 19.00 Mhz ?)

        分周比は、1 〜 16 の範囲では、0.5 刻み。16 〜 32 は 1 刻み、32 〜 62 では 2 刻み。

      ちなみに Breakout ボードには、3.3v 5mmx7mm のオシレータも載せられるようになっている。PLL もあるので、周波数を変換することも出来る。

  • 残念な点

    残念な点としては、規模が小さいこと。ブロックメモリも少ない。自作コアだと 1200 でようやく載るレベル。

    内臓の ハードマクロ の I2C /SPI/ TIMER を生かせば、結構規模を節約できそうだが、専用設計になってしまうのでちょっと面白くない。

    ただ、TQFP 144 に限ると規模の大きいものの品種は限られる。Spartan-6 LX9 , Lattice XP2-8 , MachXO2 7000 ぐらいか。それ以下だと XP2-5 , Spartan-3E 250E , MachXO2 4000 。Spartan-6 LX9 使えば良いのだが、xilinx の ISE が嫌なら MachXO2 7000 とかも良いかなという感じ。

  • 参考 文献

自作コアと MachXO2

    以前 AVR互換COREを作成したのだが、MachXO2 でとりあえず 合成できるところまで確認して 凍結していた。

      AVR互換CORE といっても、互換なのは、米粒AVR の ATtiny10 系統。Mega や Tiny 互換ではなく、AT90S の AVR とも互換ではない。

    最後のバージョンは、rtavr-0.9.3.tar.gz

    README を読み返すと

    (4-A) クイックビルド 『WebPACK ISE』

    以下に 3 種類の 標準的な構成を示します。

    (1) rtavr を top-layer にした 最小構成

    configs/50A/rtavr_defs.v と configs/rtavr_common.v , soc/*.v
    および、tests/tbi_001/rom_data.mem を使い 『WebPACK ISE』を使用して
    Implement します。

    この構成は、USART および SPI を含み実用的なものでありながら、
    XC3S50A で Implement 可能なように しています。

    なお、USART , SPI については、レジスタの定数化により機能を縮小
    しています。 使用する機能に適合しない場合は、rtavr_defs.v を
    編集する必要があります。

    と書いてあるが、MachXO2 では、configs/1200HC/rtavr_defs.v を使用することで 一応合成できるようになっている。できるのは 50A と同等の機能なのだが、MachXO2 では、ROM_PSEUDO_DP が define されて DUALPORT の ROM を使わないようにしている。DUAL PORT を使うと ROM データの READ で 8bit の 別ポートを使うが、define すると 16bit の ROM からデータを読み込むようになり、規模が少し増える。

      こうした理由は、Diamond が DUALPORT ROM を推論してくれないため。最新版の 1.4.1 でも試したがだめだった。

    で、できたものは、ちょっとのデバッグで動くような気がしているが、試していない。

    デバッグするためのツールを作成している段階で放置していたのだった。MachXO2 1200ZE Breakout ボード を reference として使うことにして 作成を再開したい。

PORTの実装

    実は、PORT の 入出力の動的変更がうまく行っていない(かも)
    Lattice のリファレンスデザインを見ると

    inout sda_pin;
    wire scl_pin;
    assign sda_pin = sda ? 1'bz : 1'b0;

    こんな感じで記述されていた。データバスも近い記述で 1'bz の部分が出力データで可変になっている。

    現在のコードをこれに準じた記述に変更したほうがよいかも。ただし、プルアップ/プルダウンを 制御するのは無理そう。制御用の線を割り当てて 信号線と 抵抗でつなぐしかないか。

rtavr 更新

  • rtavr-0.9.4.tar.gz
  • rtavr_tools-0.5.tar.gz

    ここで書くべき内容ではないのだが、XO2 Breakout ボードに対応したものを作って更新した。

    ... といっても対応しただけで、内容的には進展なし。

    rtavr の方は、JTAG ポート経由でアクセスできる 2 つのポートがあるのだが、ここに ISP と SPI(SLAVE) を接続。あと USART の TXD/RXD を シリアルに接続。LED の D1/D2 に PORT を接続。

    これが動けば結構すごいと思うのだが、残念ながら規模を見るのが目的のもので、動作は期待できない。

    device utilization summary: XO2
    PIO (prelim) 14/108 12% used
    14/108 12% bonded
    SLICE 590/640 92% used
    OSC 1/1 100% used
    JTAG 1/1 100% used
    EBR 6/7 85% used

    規模的には、Spartan-3A 50A より少し余裕がある感じ。 synplify Pro を使っているのだが、Xilinx の標準ツールより効率が良い?

      上記は、Diamond 1.1 の結果。1.4 だと 612 SLICE (95%) を消費している。

      あと、

    ISP は、attiny10 系のものをベースに簡易化したもので、ROM の読み書きだけができる機能。(ツールは未対応)

    rtavr_tools の方は、JTAG 経由の通信が本当にできるかのテストなど。JEDEC ファイル の書き込みとかベリファイも仕込んであるが、未テスト。MachXO2 はちょっと複雑で 大分デバッグが必要そう。セキュリティ関係の機能もあるので不用意にテストすると 書き込めなくなる恐れがあり、デバッグも慎重にやる必要がある。

      progname : [rtavr_tool.exe]
      cbl_name = mpsse
      cbl_type = ft245r
      port = ft0
      bitclock = 115200.000
      baudrate = 115200
      ispdelay = 0
      rtavr_tool.exe: BitBang OK
      rtavr_tool.exe: drain OK
      open OK
      bitclock = 102400.000
      ft245r: bitclk 102400 -> ft baud 38400
      ft245r: bitclk 102400 -> ft baud 38400
      load_conf LCMXO2_1200
      -- device_type 12b2
      -- sucsess
      -- device_id 012b2043
      cmd> spi_test
      spi_test -- sel_chan test
      spi_test -- spi_echo test1
      30 00 (00)
      31 30 (18)
      32 31 (18)
      33 32 (19)
      34 33 (19)
      5535 3455 (1a2a)
      aa5536 35aa55 (1ad52a)
      37 36 (1b)
      38 37 (1b)
      39 38 (1c)
      ff 39 (1c)
      ff ff (7f)
      spi_test done
      cmd>

    spi_test で 入力データを echo back させるぐらいは出来ている。といっても、rtavr の SPI と同じコードではなく簡易なものでのテスト。すり合わせも出来ていないので、rtavr の方で動くことは期待できない。

    まぁ、いまのところはこんな感じ。

SVF ファイルについて

    忘却が激しいのでメモ。

    SVF ファイルとは、コンフィグする際のシーケンスが記述してあるもので、これを解析してツールの機能を作ろうとしている。

    論理合成して作成されるのは、JEDEC ファイルで、SVF ファイルを作成するには、ispVM を起動する。SVF アイコンで SVF ファイルに変換するのだが、さまざまなオプションがある。Flash に対して Erase/Write/Verify の組み合わせがあるし、background モードというのもある。

    それに加えて SRAM への直接 Write という機能もある。Flash を汚さないし便利そうな気がするのだが、JEDEC ファイル を bit ファイルに変換しないといけない。変換は UFW アイコンで行う。

      ちなみに、Flash のデータは圧縮されている。SRAM へ直接書きこむデータはたぶん圧縮されていない。伸張ロジックを知っていないと JEDEC ファイルを書き込むようには出来ない。

      あと、EBR RAM は SRAM に含まれているのかどうか? EBR RAM は Flash からのロードしかできないような気がするのだがどうなんだろう?

      ちなみに、MachXO や XP2 は、Flash 用と同じデータを SRAM に書き込める。

    注意) 上記は、Diamond 1.1 での話。1.4 を試してみると ... Diamond に ispVM は組み込まれなくなった。ispVM は別のソフトとしてインストールすることができる。Programmer を動かすと xcf ファイルが作成されるようなので、これを ispVM で Open すると上記のオペレーションが出来るようになるようだ。

Lattice Mico8 について

    Lattice だと Mico8 / Mico32 という 2 つの IP プロセッサがある。このうち 8bit の Mico8 は、結構 AVR に近い感じ。驚いたことに gcc も移植されている。

    Mico8 は、レジスタ数 32 のタイプと 16 のタイプがある。16 のタイプは MachXO2 で 262 LUT で組めるそうだ。(32 は 313)

      自作コアの RTAVR は レジスタ数 16 だが configs/core_test で core のみ生成すると 660 LUT 。(GPR_16 というシュリンクオプションなしだと 690)。結構頑張ったつもりなのだが...

      まぁ、Mico8 の方は パイプラインプロセッサでないし、命令も 18 bit 使っていたり、AVR のような 特殊な命令コードないしで、差が出るのは仕方がない。

    ところで、Mico8 のアドレス空間は 8bit しかない。16bit あるいはそれ以上の空間にアクセスするには、Page Pointer というのを使うそうだ。要するにバンク切り替え。

    プログラム空間は、12bit ある。18bit x 4K であり 8KB の AVR Tiny などと同じぐらい。ただし、プログラム空間のメモリをデータとして使うことはできない。

    実をいうと、自作AVRコアは、gcc が使え、FPGA メーカを選ばない (規模が小さい)8bit のプロセッサを目指した。Mico8 で gcc が使えるのを知っていたら、違うものを作っていたかも知れない。まぁ、FPGA メーカが作るコアは、自社のデバイスに最適化するから 他社のデバイスに移植するようなものではない。移植性が特徴として残っているから これで良かったとは思うのだが...

MachXO2 Breakout ボードのピン配置

    J4 J3
    (1)(2) (1)(2)
    3V3 VCCIO3 1V2 VCCIO1
    3V3 NC 1V2 NC
    PL2A 1 2 PL2B (TXD)PR10C 74 73 PR10D(RXD)
    PL2C 3 4 PL2D (CTS)PR10A 76 75 PR10B(RTS)
    PL3A 5 6 PL3B GND GND
    PL3C 9 10 PL3D (DCD)PR9C 78 77 PR9D(DSR)
    GND GND PR9A 82 81 PR9B(DTR)
    PL4A 11 12 PL4B GND GND
    PL4C 13 14 PL4D PR8C 84 83 PR8D
    GND GND PR8A 86 85 PR8B
    PL5A 19 20 PL5B GND GND
    PL5C 21 22 PL5D PR5C 92 91 PR5D
    GND GND PR5A 94 93 PR5B
    PL8A 23 24 PL8B GND GND
    PL8C 25 26 PL8D PR4C 96 95 PR4D
    GND GND (LED D2)PR4A 98 97 PR4B(LED D1)
    (EXTOSC)PL9A 27 28 PL9B GND GND
    GND GND (LED D4)PR3A 100 99 PR3B(LED D3)
    (EXTOSC_EN)PL10A 32 33 PL10B (LED D6)PR2C 105 104 PR2D(LED D5)
    PL10C 34 35 PL10D (LED D8)PR2A 107 106 PR2B(LED D7)

    内側の2 列分の信号配置。

    5cm x 5cm で基板を作れば 使えるかと思ったのだが、コネクタ間の間隔は 5cm を超えていた。あと、内部機能との重複が多い。重複を退けると 37 pin 。SRAM には十分だが、SDR SDRAM 16bit には少し足りない。(1200ZE では、全然高速に動かせないのでオーバースペック)

      追記: 37 pin では、4Mbit (16bit幅) の CY7C1041DV33(10ns) の駆動は無理だった。一応訂正。

      追記: シリアルのピンは、実際には接続されていない。抵抗パターンが 7 つ並んでいる所があるのだが、そこをジャンパする必要がある。


    J2 J5
    (1)(2) (1)(2)
    NC VCCIO0 NC VCCIO2
    PT17D/DONE 109 110 PT17C/INTn +-PB20D 71 69 PB20B-+
    PT17B 111 112 PT17A (R39) +-PB20C 70 68 PB20A-+ (R37)
    GND GND +-PB18D 67 62 PB18B-+
    PT16D 113 114 PT16C (R35) +-PB18C 65 61 PB18A-+ (R33)
    PT16B 115 117 PT15A GND GND
    PT15D/PROGn 119 120 PT15C/JTAGen +-PB15D 60 58 PB15B-+
    GND GND (R31) +-PB15C 59 57 PB15A-+ (R29)
    PT15B 121 122 PT15A GND GND
    (SDA)PT12D 125 126 PT12C(SCL) +-PB11B 56 54 PB11D-+
    PT12B 127 128 PT12A (R41) +-PB11A 55 52 PC11C-+ (R40)
    GND GND GND GND
    PT11D/TMS 130 131 PT11C/TCK +-PB9B 50 48 PB9D-+
    PT11B 132 133 PT11A (R38) +-PB9A 49 47 PB9C-+ (R36)
    PT10D/TDI 136 137 PT10C/TDO GND GND
    GND GND +-PB6D 45 43 PB6B-+
         PT10B 138 139 PT10A (R34) +-PB6C 44 42 PB6A-+ (R32)
    PT9D 140 141 PT9C GND GND
    PT9B 142 143 PT9A +-PB4D 41 39 PB4B-+
    GND GND (R30) +-PB4C 40 38 PB4A-+ (R28)

    外側の2列はこんな感じ。(SDA),(SCL) は、外部抵抗でプルアップされている。こちらは、JTAG 関係を除いて 48 pin 分。

      訂正: 一番右の J5 は、全て差動受信用に 100 Ωのターミネータを入れられる(抵抗は空きパターン)。あるいは、10kΩとか入れて動的プルアップに流用するとかも可能。といっても 小さいのでハンダ付けはなかなか厳しい。

    EXOSC , EXOSC_EN は、5mm x 7mm のオシレータのパターンにつながっている。スタンバイモードがある ASYMB 24 MHz とか CB3LV-3C が digikey で買えるので、Breakout ボードと同時に買っておくのが良さそう。ただし、300 円程する。

    PLL があるので、発振周波数は、割りとなんでも良い。PLL は、EHXPLLJ というのを使うのだが、基本的に

      f = CLKI/CLKI_DIV(1-40) x CLKFB_DIV(1-40) x CLKOP_DIV(1-128:default 8)

    の周波数が VCO の周波数になるようだ。実際に合成して Warning を見ると、VCO 周波数は、400 〜 800 MHz の範囲でないといけないらしい。... が、多分間違いで、データシートを見ると 200 〜 800 MHz の範囲。CLKOP_DIV が 8 なら CLKOP の範囲は、 25MHz 〜 100 MHz ということに。

    CLKOP の出力は

      f = CLKI/CLKI_DIV(1-40) x CLKFB_DIV(1-40)

    だが、CLKOS, CLKOS2, CLKOS3 は、

      f = CLKI/CLKI_DIV(1-40) x CLKFB_DIV(1-40) x CLKOP_DIV(1-128:default 8) / CLKOSn_DIV(1-128:default 8)

    になるみたい。ただし、あくまで基本で、もっと多彩な機能がある。

これで何をしたいのか?

    MachXO2 breakout ボードは、1200ZE で高速でもなく、規模も小さい。自作AVRコアのテストには便利だから、当面その目的で使うつもりなのだが、実用として考えたときにこれで何が出来るのだろう?

    だいたい 100 pin の 1200 は、1 個 630 円ぐらい。( 256 まで規模を落とすと 365 円 まで下がる。) 随分安くなったものだが、AVR と比べると大分高い。32 bit の Coretex-M0 や PIC32 などと比べると価格差が大分小さくなるが、今度は実現できる機能差が大きい。

    ついでに書いておくと 100 pin だと 2000 がある。こちらは少しだけ高くなって 875 円。あと、144 pin だと単価が上がる。1200 で 751 円、2000 で 991 円。

    さて、こういう条件なのだが ...

  • とりあえず、MachXO2 Breakout ボードを使う方向で考えてみる。安く手に入るし、USB インターフェイスが付いているので、ソフトをなんとかすれば、HOST との通信ができる。シリアルだと最大 12Mbaud までだが、MPSSE だと 30Mbps (3.75 MB/sec)。接続されている範囲では、これが最高速度。(実は Fast Serial の方が速くできるかも知れないのだが、あまり使われているようには思えないし、とりあえず無視)

  • 開発専用だと、作ったモジュールの単体テストとかには便利そう。そういえば、FPGA 同士で通信するモジュールを作りたかったのだった。この場合 いったん外に出して外側で接続すれば、単体テストはできそう。

  • 秋月の480x272 LCD とかのインターフェイス。PC から垂れ流した データをそのまま表示してもなんとか見えそう。ただ帯域が少々足りない。キャラクタディスプレーとかだと内蔵 RAM でもいけるから、端末にするのも一興か。

  • ロジアナも工夫次第。圧縮して 内蔵 RAM をバッファにするとかすれば、測定対象次第で結構取り込めるかも。外付け RAM を付ければ良いのだが、ZE で遅いので 苦労しがいがない。内蔵だけで工夫するのが楽しそう。

  • チップ単体で使うにしても HOST との通信はクリアしておきたい。USB だと SPI で扱える MAX3421E とか SL811HSTが有名だが、1000 円ぐらいする。これなら USB が付いた MCU の方が安いと思える価格。作れるものなのかどうか分からないが、複数チャネルが扱える (12Mbps)USB コントローラなんてのが作れると良さそうな気がする。

Mouser で、WLCS-25 (1200ZE) が 出ている

    在庫 0 だが、1個単位で買える。20 個なら単価 400 円。これを使えば 24 pin DIP (とか)の モジュールを作れそう。最も、基板をなんとか出来たときの話。25 pin とは言え 0.4mm ピッチの BGA だから 趣味のレベルでは難しい。BSDLファイルを見ると、JTAG 4 , GND 2 , VCC 2, VCCIO0,VCCIO2 の 10 pin を除く 15 pin が 入出力に使える。JTAGENB もあるし、config 用の PROGRAMN/INITN/DONE もあるから 正確ではない。あと I2C,SPI のハードマクロの PIN も 。

    1.2V レギュレータ 載せた上で 24 pin ナロー DIP のモジュールとか、誰か作らないかなぁ ... と思ってみたり。


    こんなの(8ビット双方向ロジックレベル変換モジュール)があると 嬉しいような ...

      1 2 3 4 5
      A PT17C/INITN PT15D/PROGRAMN PT12D/SDA TCK TDO
      B PT17D/DONE PT15C/JTAGENB PT12C/SC TMS VCC
      C PT16A VCCIO0 GND VCCIO2 TDI
      D VCC PT12A/PCLKT0_1 GND PB6D/SPISO PB6C/MCLK
      E PB20D/SISPI PB20C PB11A/PCLKT2_1 PB9A/PCLKT2_0 PB4C

      とりあえず、ピン配置を作ってみた。(行と列は逆かも) 。外側の 16 ピンだけで なんとかならないかと思ったが無理。やっぱり 4 層基板 + 極小スルーホールでないと。

    ところで、これの最高周波数は 133 MHz になっている。最も遅いのは、1200ZE 100pin C の 104 MHz 。あと スピードクラス 4 の I は、550 MHz 。60 MHz/150 MHz というのは、実用回路の目安?

    追記: Aliexpress の基板作成サービス

      Aliexpress にも 基板作成サービスをしているところがある。

      Loision's PCB factory だと、4 層基板のサービスがある。Min. Hole Size: 0.2mm, Min. Line Width: 4MIL だそうで、 WLCS-25 のモジュール基板を作成できるかも知れない。
      基板さえ作ることが出来れば、ホットプレート・リフローとかの方法でハンダ付けは可能そう。

      ITeadStudio でも 4層基板 を扱っている。5cm x 5cm (10pcs) で $65 。2層 $9.9 なのと比べると大違いだが これでも安いのかも。ただ、ここだと Hole の最小サイズは 0.3mm で 0.4mm ピッチの BGA のパターンは無理。

Synplify Pro と LSE

    論理合成エンジンに Synplify Pro と LSE が選べる。デフォルトは、Synplify Pro だからそのまま使えば良さそうなのだが、ちょっと 気持ちが悪い Warning がある。

      Initial statement will only initialize memories through the usage of $readmemh and $readmemb. Everything else is ignored

    というもので、どうも initail 文は、$readmemh とかを使わないケースでは意味がないらしい。では、初期値は 0 固定なのか? ... というと良く分からない。まぁ、rtavr 本体は、GPR(汎用レジスタ) と RAM データの初期化にしか使っていないので良いのだが、isp.v の状態変数は、initial 文を使っている。初期値は 0 に統一しているので 0 固定なら問題ないのだが、気になる。

    LSE を使ってみると、そういう Warning は出ない。ただ、同じものを合成しても Synplify Pro は、612/640 スライスだったのが、LSE では、617/640 スライスとちょっと増える。Diamond 1.1 を使っていたときは、Synplify Pro は 590/640 スライスで、LSE はさらに規模が小さかった。増えるのはバグ修正が理由だとすれば、Diamond 1.1 は、結構バグがあったのかも。

    ただ、それでも XilinX の Spartan-3A より効率が良く、704 スライスの 50A より回路が入るようだ。

      Number of ripple logic: 81 (162 LUT4s)

    ひょっとすると、リップルモードの言うのが肝なのかも。LUT4 の代わりに、2bit カウンタとか 2bit 加算回路、乗算回路として使えるようになっている。

    GPR_16 というシュリンクオプションなしで合成すると 規模が 30 ほど増えるはず(24 スライス分 分散 RAM に 余計に使用する)なのだが、ためしにやってみたら Synplify Pro で 623/640 , LSE で 639/640 と なんとか収めて来た。ひょっとしたら余分な LUT が最適化(遅延低減)のために使われるのかも知れない。

MachXO2 Breakout ボードと 秋月 C 基板

    MachXO2 Breakout ボードと 秋月 C 基板を現物合わせしてみたところ、長辺 を横にして、外側の 1 列づつ まで覆えた。ただし、短辺のスルーホールは 17穴なので、20x2 コネクタ全部は使えない。 あと、外側だとギリギリなので、13 穴しかない。

    3V3 電源 は、上にしか出ていないので、1 番 PIN まで上に寄せて 装着することになりそう。そうすると使えないピンが出てきて面白くない。ここは、B 基板を使うのが良いのかも知れない。

    あと両脇について。両脇は C 基板がかぶさるので、上方向にピン/フレームを出すのはどうかと思う。横方向外側に出した方が良さそう。

    内側 の方は、フレームで良さそう。ちなみに、2 列のフレームを使っても全部のピンを接続する必要はない。80ピン 全部 接続する と外すのに随分力がいる。適当に間引いた方が良いと思う。

rtavr 更新

  • rtavr-0.9.5.tar.gz
  • rtavr_tools-0.6.tar.gz

    PLL を組み込んで 四相クロック化。rtavr_tools の方も PLL を組み込んだテスト回路にした。

    四相クロック化をすると何故か随分と規模が減った。Synplify Pro で 623/640 だったのが、 572/640 まで減った。これは、GPR_16 というシュリンクオプションなし。

    LSE でも 639/640 だったのが、607/640 に。

    以前は、2 倍クロック + ロジックで生成した 標準クロック。それを元にして、さらにタイミングを作っている。それ以外に シフトレジスタ x 4 を使った擬似四相クロック のモードもある。

    たぶん 四相クロック が一番すなおで、実際のクロックラインが少ないんだろう。... ということで納得しておこう。

追記 dealextreame の基板
posted by すz at 17:54| Comment(0) | TrackBack(0) | MachXO2