« 2013年4月 | トップページ | 2013年6月 »

2013.05.31

MITOUJTAGのSPI ROMプログラマを更新

MITOUJTAGのSPI ROMプログラマを更新しました。

今回の更新で、ATMELのAT25DQ321と、MicronのM25PX321に対応することができました。

At25dq321

32MbitのSPI ROMは、FPGAのコンフィギュレーション用に最適なのですが、なかなか入手が難しいのも事実です。SPI ROMのメーカーはすぐに買収されて違う会社名に変わってしまうし、SPI ROMのいいやつはDigikeyなどでいつも売り切れです。

比較的良いSPI ROMに、Winbondというのもありますが、これはDigikeyが日本向けには販売してくれないので、入手が面倒です。

そこで、目を付けているのがAT25DQとM25PXのファミリです。

AT25DQはQuad対応、M25PXはDual対応です。なので、FPGAをより高速にコンフィギュレーションできます。

今回の更新はあくまでも暫定版ということなので、ファイルは、JTAGひろばにアップロードしておきました。いますぐにJTAGひろばからダウンロードできます。

いずれ、様々なSPI ROMデバイスのアドレスマップやコマンド体系をiniファイルとかxmlファイルとかに書いておいて、実行時にそれを読み込むという動作に変えたいと思います。

| | コメント (0)

2013.05.30

MITOUJTAGお客様の声を更新

すごく久々で申し訳ないのですが、MITOUJTAGお客様の声を更新しました。

平成25年分を追記しました。

http://www.tokudenkairo.co.jp/jtag/voice.html#H25

また、特殊電子回路の全製品のお客様の声も更新しました。82番以降が本日追加された分でございます。

http://www.tokudenkairo.co.jp/feedback/page1.html#82

みなさん、ぜひとも暖かいメッセージをお寄せください。皆様からのお便りが何よりの励みになります。

| | コメント (0)

2013.05.29

FX3+Spartan-6のサンプルデザインを更新

特電USB FX3ボードと、それと組み合わせて使うFPGAの設計データを更新しました。

Fx3board

こちらからダウンロードできます。

fx3sample-20130529.zip をダウンロード (12MB)

基本的なFPGAのコアの使いかたは、前回のブログの記事で紹介したとおりなのですが、かなり安定性が向上しています。

また、新機能としては、

  • DDR2 SDRAMに(最大)64MBのデータを送信して、受信することができる
  • FPGA内のBlockRAMを128kB分、バッファ用に割り当ててある
  • FPGA内に「内蔵レジスタ」の作り方のサンプルを入れてある
  • ヘルパーDLLが、MSVCRT100DなどのDLLを必要としない
  • USBWriteDataとUSBReadDataという関数をDLLに追加した

です。

既知の問題としては、

  • 読み出しを行うときには4の倍数の長さを指定しないといけない
  • 稀に、OUT転送で固まる

というのがあります。これもおいおい直していきます。

さて、DDR2 SDRAMに巨大データを読み書きしてみましょう。

Fx3ddr2inout

64MBのデータを読み書きが0.2秒台です。j計算すると、書き込みが336MB/sくらいになっています。

一方、FPGA内蔵のBRAMに読み書きした場合は、

Fx3braminout

350MB/secくらい出ています。

この差は何なのかというと、DDR2 SDRAMを200Mクロック(データレートは400MB/s)で動かしているためです。DDR2 SDRAMは、プリチャージやリフレッシュが入るので常にアクセスし続けることはできません。実際にはバス速度の95%くらいが最大値になります。

Sp6ddr2

つまり、DDR2 SDRAMのアクセス速度がボトルネックになっているのです。

それに対してBlockRAMはFPGA内部のSRAMなのでノーウェイトでアクセスできるのです。よって、このパソコンとFX3との最高速度は350MB/secということになります。

| | コメント (0)

2013.05.27

7シリーズのIDELAYとISERDESの使い方(1)

特電では、高速ADCボードを開発しています。

このADCは12bitの精度で80MHzでサンプリングします。しかもそのようなADCが8チャネル入っています。ADC変換の出力は960MbpsのLVDS信号 8ペアで出てきます。

Lvds

さて、この960Mbps×8組の信号をFPGAでデコードしなければなりません。

幸いなことに、XILINXのFPGAでは、IDELAYとISERDESというコンポーネントがすべてのI/Oピンに入っています。このIDELAYというのは可変の遅延時間を提供するもので、ISERDESというのはシリアル・パラレル変換をしてくれるものです。

これらのコンポーネントを使うことで、XILINX FPGAの全てのI/Oがギガビットクラスの送受信能力を獲得するわけです。

まず、IDELAYによって高速なサンプリングができる理由を説明します。

どんなに高速な信号でも、次の図のように、信号が変化する時間と、安定している時間があります。FPGAのセットアップタイム・ホールドタイムは十分に短いのので、この安定している時間の真ん中でサンプリングすれば良いわけです。

Sampling_point

ところが、実際の回路の場合、入力信号とサンプリングのためのクロックはベストな位置に来ていない可能性があります。

Sampling_point1

そのような場合、やりかたの一つとして、PLLをつかってサンプリングクロックの位相をずらすという方法があります。

Sampling_point2_2

こうすれば、ベストな位置でサンプリングはできます。ただ、信号が8本とかあるときに、すべてのタイミングが一緒にずれてしまうので、信号の到達時間に差があるとうまくいきません。

このような場合、IDELAYコンポーネントを使えば、入力信号を遅延させることができます。

Sampling_point3

IDELAYは各I/Oピンに1つずつ入っているので、信号が8本あっても個別にディレイを調節できるというわけです。

Sampling_point4

次回は、このタイミングの自動調整のやりかたを説明します。

| | コメント (2)

2013.05.24

バウンダリスキャンを活用した高速ADCボードの開発

特電では今、高速ADCボードを開発しています。

Adcboard_4

このボードはSPIのような3線式インタフェースでいろいろな内部レジスタを読み書きできるのですが、FPGAにつないでまず最初に何か動かしてみたいとき、本格的なものを作るよりも手っ取り早く動かしてみたくなります。

そんなときに、MITOUJTAG(みとうジェイタグ)が便利に使えます。

SPIのとりあえずの波形をFPGAで出して、MITOUJTAGのバウンダリスキャンでその端子の状態を見るのです。SPIの信号は通常は数MHzで出しますが、バウンダリスキャンはそもそも遅いので、このときは数百Hzに落として出します。

すると・・・

Adcboard_5

このように、SPIのデータが波形で見えるのです。これをパソコンの画面上で見ながら目で解析すれば、FPGAの中にちゃんとした回路を入れなくても、読みだしたレジスタを調べることができます。

このAD変換ICは、960Mbps×8chのLVDS信号で変換結果を出力してきますが、その信号をMITOUJTAGのバウンダリスキャンで見ると・・・

Adcboard_6

このように見えます。MITOUJTAGのバウンダリスキャンのサンプリング間隔はせいぜい1ms~0.5msくらいなので、サンプリング点とサンプリング点の間に無数の信号があるはずです。非常にまばらな間隔で飛び飛びに取っていますが、信号が動いているか、ということと、だいたいのH/Lの密度くらいはわかります。

興味深いことに、

  • LVDSのPとNの信号は、バウンダリスキャンで見てもだいたい反転した値になっている。同時にサンプリングしているので当然といえば当然だが、すごいこと。
  • この信号は| ̄|___________| ̄|___________ という繰り返しのテストパターンなので、Hの密度は約1割。バウンダリスキャンで疎らにサンプリングした結果もだいたいそうなっている

このようなことが、MITOUJTAGならわかるわけです。

こうしてある程度の動作の目途がたって安心できてから、内部のロジックを本格的に作ればよいので、精神的にとても楽になります。

| | コメント (0)

2013.05.21

USB3.0の速度を決めるのは何か

市販のPCI Express-USB3.0拡張ボードに、特電FX3ボードをつないで速度を測ってみました。

まずは、BUFFALOのIFC-PCIE2U3Sです。これは比較的古いボードで、NECのuPD720200というチップを使っています。

U3pcie

このボードを、手元にあるHP6000というデスクトップマシンに挿して、BulkIn、BulkOutの速度を測ってみました。

まずは、PCI ExpressのGen1のポートに挿してみた場合。Read 111MB/sec、Write 155MB/secくらいしか出ません。

Hp6000pcieg1ifc

次に、同じボードをGen2のソケットに挿してみた場合。Read 207MB/sec、Write 300MB/secと、ほぼ2倍になりました。どんなに頑張っても300MB/secが限度でした。

Hp6000pcieg2ifc_2

次に、RATOC社のREX-PUE3Xという、今週ヨドバシで買ってきたボードです。

Rex

uPD720202というチップが載っているのですが、基板の構造はシンプルになっています。そしてBGAではなくQFNのパッケージになっています。

まずはこのボードをGen1のスロットに挿してみました。速度は、Read 142MB/sec、Write 176MB/secと、先ほどのボードよりは速くなっています。ただ、200MB/secは超えられません。それはPCI Express x1 Gen1の理論上の最高速度が210MB/secだからだと思われます。

Hp6000pcieg1rex_3

このボードをPCI ExpressのGen2のスロットに挿すと・・・、Read 267MB/sec、Write 350MB/secとなりました。

Hp6000pcieg2rex

つまり、PCIe-USB3.0の拡張ボードは、PCI ExpressのGen1のスロットに挿してしまうと、パワーを発揮できないということがわかります。そして、uPD720200よりもuPD720202のほうが15%くらい高速です。

古い拡張ボードは今すぐ捨てて、新しい拡張ボードにしたほうがいいでしょう。PCIe-USB3.0の拡張ボードなんて今時2000円~3000円で売られているわけですし。

最後に、RATOC社のuPD720202を使った拡張ボードを、Xeonマシン(Xeon E3-1275V2)に挿した場合。Read 268MB/sec、Write 361MB/secとなりました。

Xeonpcieg2rex

マシンが速いことに越したことはありませんが、一番効くのがPCIeがGen1かGen2かということ。次はチップの型番です。

 おまけ。 

uPD720202のデータシートはこちら。

http://japan.renesas.com/products/soc/usb_assp/product/upd720202/index.jsp

D720202

uPD720200のデータシートはこちら。

http://japan.renesas.com/products/soc/usb_assp/product/upd720200/index.jsp

D720200

どちらも

System I/F: PCIe Gen2 x 1 Lane
USB ports: 2 ports (SS/HS/FS/LS)
Comply spec to: PCIe 2.0 Base Spec
USB3.0 rev1.0

です。

| | コメント (0)

EZ-USB FX3とFPGAの安定な通信のために・・

このFPGAの回路を作るのに、結構苦労しました。

それは、FX3はバッファの残量を知らせるFLAGというのを出しているのですが、このFLAGの変化するのが実際のデータが入出力されてから3クロック後だからなのです。

次の図はCYUSB3014のデータシートに記載されているタイミングチャートです。

Flag_after

SLWR、つまりデータの書き込みが行われてから、FIFOがいっぱいになっているかどうかがわかるのは3クロック後というわけです。

FLAGは、BulkOUT時にはバッファ内にデータがあるかどうか、BulkIN時にはバッファに受け入れの余裕があるかを示していますが、普通に作ったのではFLAGが下がったときにはすでにデータはないので、FIFOを空読みしてしまいます。BulkINのときにはFIFOがいっぱいなのに数個分のデータを余分に書いてしまいます。

FPGA内で「今までに何個送ったか」を覚えておくような回路も試みたのですが、安定性の面でうまくいきませんでした。

これを解決する方法は、WaterMarkという機能です。いわゆるFIFOのAlmostFullやProgramable Fullのような機能です。このWaterMark機能を使うにはGPIF II Designerを使って、FLAGの出力をWaterMarkに設定します。

Gpifdesigner

そして、ファームウェア内でAPIを呼ぶことで、プログラマブルな値を設定します。

私の設計はFLAGAは普通のFIFOのフラグとして、FLAGBはWaterMarkにしています。

FPGAの中では、FLAGAがHでFLAGBがLのときには「あと少しでいっぱいになるな」と判断して、速度を落としてアクセスするようにしました。

Fx3_bulkin

つまり、FLAGA=FLAGB=HのときにはFIFOにまだ余裕があるので、SLRDやSLWRを下げっぱなしにして全速力でデータを転送します。FLAGB=Lになったらそろそろ枯渇/満杯だと思って、SLRDやSLWRをディアサートして3クロックほど休むようにしたわけです。

その休んでいる間にFLAGAがLになったら、FIFOが枯渇/満杯になったと判断するわけです。

これでうまくいきました。

| | コメント (0)

EZ-USB FX3とFPGAの接続デザインの一新

EZ-USB FX3とFPGAを接続するサンプルデザインを一新しています。

FPGAの中に入れるコアを下のようなモジュールにしました。

entity fx3sfsync is
  Generic (
      FX3_DATABUS_SIZE      : integer := 32;
      USR_DATABUS_SIZE      : integer := 32
  );
    Port (
    -- ezusb fx3 port
      fx3_pclk_op           : out   std_logic;
      fx3_data_bp           : inout std_logic_vector(FX3_DATABUS_SIZE-1 downto 0);
      fx3_flaga_ip          : in    std_logic;
      fx3_flagb_ip          : in    std_logic;
      fx3_sloe_op           : out   std_logic;
      fx3_slrd_op           : out   std_logic;
      fx3_slcs_op           : out   std_logic;
      fx3_slwr_op           : out   std_logic;
      fx3_addr_op           : out   std_logic_vector(1 downto 0);
      fx3_pktend_op         : out   std_logic;
      fx3_reset_bp          : inout std_logic;
  
    -- user interface port (mandantory)
      clk100m_i             : in   std_logic;
      reset_i               : in   std_logic; -- active high

      bulkout_ready_i       : in   std_logic; -- not implement yet
      bulkout_wait_i        : in   std_logic; -- User circuit is ready but nomore data cannot be received.
      bulkout_start_o       : out  std_logic; -- Start timing of bulkout (SOF)
      bulkout_busy_o        : out  std_logic; -- now running.
      bulkout_end_o         : out  std_logic; -- End timing. (EOF)
      bulkout_dvalid_o      : out  std_logic; -- Received data is valid
      bulkout_data_o        : out  std_logic_vector(USR_DATABUS_SIZE-1 downto 0);
      
      bulkin_ready_i        : in   std_logic; -- not implement yet
      bulkin_start_o        : out  std_logic; -- Bulkin start (SOF)
      bulkin_busy_o         : out  std_logic; -- now running.
      bulkin_end_o          : out  std_logic; -- Bulkin end (EOF)
      bulkin_data_i         : in   std_logic_vector(USR_DATABUS_SIZE-1 downto 0);
      bulkin_dreq_o         : out  std_logic; -- Bulkin data request
      bulkin_dvalid_i       : in   std_logic; -- Send data is valid
      bulkin_abort_i        : in   std_logic; -- Abort and send PKTEND

      datalen_o             : out std_logic_vector(31 downto 0);
      addr_o                : out std_logic_vector(31 downto 0);
      flag_o                : out std_logic_vector(15 downto 0);
      debug_o               : out std_logic_vector(31 downto 0) -- for debug
  );
end fx3sfsync;

これじゃわかりにくいので、図にしました。

Fx3core

fx3_*で始まるポートはFX3にそのまま繋ぎます。bulkout_*で始まるポートはBulkOutのときに使い、bulkin_*で始まるポートはBulkOutのときに使います。

動作を簡単に説明すると、BulkOUTのときには、bulkout_startが1クロックアサートされて、PCからBulkOutが発生したことを知らせます。そして、bulkout_dvalidがアサートされている間は、何かしらのデータが送られてきていることを示しています。

Bulkout1

簡単でしょ?

ただ、このままだとユーザ回路の準備が整っていないのにデータが送られてきてしまう可能性があるので、bulkout_waitという信号を用意しています。ユーザ回路がこの信号をアサートすると、コアはデータの出力を止めます。

Bulkout2

ただ、バースト転送は急には止められないので、waitをかけても数個分のデータが出てきてしまいます。

BulkINのときには、bulkin_start_oが1クロックアサートされて、PCからBulkIn要求が発生したことを知らせます。ユーザ回路は、bulkin_dreq_oがアサートされているのを見たら、bulkin_dvalidと共にデータを送ります。

Fx3_bulkin1

もし、FX3が「データをこれ以上送らないでほしい」(つまりFX3内のバッファがFULL)と言っているときには、bulkin_dreq_oが下がるので、ユーザ回路はデータの送信を止めます。

Fx3_bulkin2

それから、ユーザ回路側の都合でデータ送信を一旦停止したい場合は、bulkin_dvalidを下げるだけで良いので簡単です。下の図ではランダムなタイミングでWAITをかけています。

Fx3_bulkin3

このような簡単なハンドシェイク型のインタフェースで、EZ-USB FX3と通信ができるようになりました。

パソコン側のAPIは、

int USBWriteData(unsigned long addr,unsigned char *data,int len,unsigned short flag)
int USBReadData(unsigned unsigned long addr,char *data,int len,unsigned short flag)

という2つの関数を用意しています。転送したいデータが格納されたバッファと転送長、それからオプションのデータ(addrとflag)を指定してこの関数を呼び出せば、FPGA内で上の動作が起こります。

転送速度なのですが、普通のパソコンのPCI Express拡張スロットにUSB3.0拡張ボードを接続してつないだ場合は、OUT 111MB/sec、IN 155MB/secくらいでした。

Fx3_speed_32bit

これはおそらくPCI Expressの部分の速度がボトルネックになっていると感じたので、マザーボードから直接USB3.0が生えている比較的最新のPCでやってみたら・・、

Fx332bit380m

OUT 255MB/sec、IN 367MB/secと、満足がいく速度が出ました。

これで、EZ-USB FX3が本当にEasyに使えるようになりました。

次はSpartan-6のMCBとつないでDDR2/DDR3 SDRAMの中のデータをUSB3.0経由で読み書きできるようにしたいと思います。

このサンプルデザイン(FPGAのデータ、GPIF II Designerのデータ、ファームウェア、PCのソフトウェア)は、下記のリンクからダウンロードできるようにしました。

fx3sample-20130521.zip をダウンロード (8.9MB)

ただ、まだドキュメントがありません。ドキュメントの体裁を整えるために1日~2日必要です。もし、すぐに使ってみたいという方はメールください。

【広告】

特電のEZ-USB FX3ボードは下記のリンクからお買い求めいただけます。現在の在庫は残り2台ですので、お早めに!

Tokuden_fx3

https://shop.tokudenkairo.co.jp/shopping/detail.php?shpdi=TKDNFX3

| | コメント (0)

2013.05.14

Artix-7にDDR3 SDRAMコアを入れてインプリ

Artix-7とDDR3 SDRAMを接続するための回路を作っています。

といっても、Artix-7のDDR3インタフェースはソフトコアで動かすので、つまり、ソフトコアを入れたデザインが論理合成と配置配線にとおるかどうかということを検証しています。

まず、ISEでやるとMIGがそのまま作られてしまってわけのわからない内部バスが出てきて大変なので、最初はEDKを使います。

EDKからMicroBlazeを抜くこともできますが、まずはそういうことはせずに普通にMicroBlaze+DDR3のデザインを作りましょう。

最初のデザインがこれです。ロジックの21%消費しています。Artix-7のロジック規模からゲート数に換算すると、だいたい100万ゲートくらいの回路です。ただ、EDKで普通にビルドしてもうまくいきません。

A7mb_1


クロッキングリソースの構造を理解してPARやMAPが通るピン配置を手書きしなければならないのが曲者です。

XPower Analyzerかけてみたら、100MHz動作時で、なんと0.7Wしか消費しないと予測されました。Artix-7クールすぎます。

次に、最大パフォーマンスにカスタマイズしたMicroBlaze 2個と、DDR3コントローラ、SPI、GPIO、EtherなどをXC7A100Tに入れました。これでも全体の50%しか使いません。

A7mb_3

なんでも入っちゃう感じですね。

そして、XPowerAnalyzerで調べてみると・・

A7mb_4


このDual MicroBlazeな構成でも0.8Wしか食わないらしいのです。VCCINT(1.0V)に流れる電流は255mAと、驚くほど低消費電流なのを予想しています。

ZEDBoardのZYNQの中にもArtixが入っていますが、あれがあんなに熱いのはARMの部分が発熱しまくっているからなんだろうと思います。PSを止めて、PLだけで動かすと熱くならないのでわかります。

早くArtix-7だけので試してみたいですね。

この数日間、Artix-7とDDR3の接続方法についていろいろ調べていました。ようやく理解できてきたので、基板の配線を考えてみることにしました。

半日かけて、ようやくArtix-7とDDR3 SDRAM間のパターンが引き終わりました。完全には等長配線にはなっていませんが、電気信号は1cmの長さで60psくらいしか進まないので、1333Mbpsで動かしても大丈夫でしょう。

Artixddr3

こういった配線を考えるときに気を付けなければならないのは、内層のクリアランスというやつです。内層のクリアランスを考えると、0.8mmピッチのBGAパッケージでは、GNDとVCCのビアは隣に置けません。

| | コメント (0)

2013.05.13

Artix-7のBank分け

Artix-7ボードを作ろうとしています。このボードにはDDR3メモリを乗せるつもりです。

そこで気になっているのは、Artix-7のどの端子にDDR3のどの信号をつないでも大丈夫なのかということです。Artix-7にはMCBがなくMIGが生成するソフトコアで作るわけですからどこに配置してもよさそうなのですが、実際にはそうではありません。

各I/O Bankの中は4つのサブグループに分かれていて、DQ[N*8+0~N*8+7]の8bitのデータバスと、DQS/DQSNとDMはそのサブグループの中に属していなければなりません。

で、サブグループは12個の信号があって、そのうちの2個はDQS用(下の図の○のところ)なので、余っているのは2個です。そのうちの1個はDMに使われます。そして、各BankにはDCI用に2個のピンがあります。(下の図の◇のところ)

Artixbank

つまり、(データ8ピン+DQS2ピン+制御用2ピン)*4グループ + DCI2個というわけで、各Bankには50個のピンがあります。

CSG324パッケージでは、各Bankには50個のI/Oしかないので、DDR3メモリを16bit幅で使おうとすると、DDR3へ行く信号が1つのBankでは足りなくなります。すると、隣のBankとくっつけなければなりません。Bank34とBank35はくっつきますが、Bank35とBank14/15/16はくっつきません。

1つのBankに納めるには8bit幅のDDR3でなければなりません。2つのBankを使う(例えばBank34もDDR3で使う)と、Bank34のピンの大半が余ります。IO Bank内は同じVCCIO電圧ですから、Bank34とBank35がすべて1.5Vになってしまって使いにくくなります。

それから、Bank14とBank15はコンフィグ用のピンがあるので、メモリインタフェースには適していません。Bank35にはXADCとかいうアナログ入力ピンがありますが、Bank15にもあるので、まぁ、Bank35のアナログは使わなくてもいいとしましょう。

そういうわけで、CSG324パッケージのArtix-7では8bit幅のDDR3が最適なのだと思います。8bitじゃ少ないという方がいるかもしれませんが、クロック667MHzで動かせば1333MB/secの転送速度になるわけですから、8bitでも十分すぎるといってもいいでしょう。

7シリーズのIOBANKには細かいルールがいろいろあるようで、かなり注意深く作らないと罠にかかりそうです。

| | コメント (0)

2013.05.09

Artix-7ボードの設計を始めました

Artix-7のボードを考えています。こんな感じのボードにする予定です。

Artixboard

特徴

  • XC7A100T-1CSG324Cを搭載
  • EZ-USB FX3搭載
  • DDR2 SDRAMまたはDDR3 SDRAMを搭載(1Gbitくらい)
  • 80ピンまたは100ピン程度のピンヘッダを出す
  • 5cm×7cm程度の手のひらサイズ
  • 10万円以下

とりあえず上記の部品は基板に乗ることがわかりましたので、6層にするか10層にするかという問題が残っています。

Artix-7についていろいろ調べてわかったことは、XC7S***の型番の数字はロジックセルの数を表していて、Spartan-6の型番の数字とほぼ同じです。つまり、XC7A100TというのはXC6SLX100とほぼ同じロジックセル数です。

で、Artix-7とSpartan-6のロジックセルの容量(CLB,LUT,FF)は同じなので、Spartan-6の数字にそのままあてはめて考えることができます。

すると、XC7A100Tというのは500万ゲートくらいになるのではないかと思います。

まだ全然ピン配置とか考えていないのですが、一番大事なのはDDRメモリのポートをどこにするかです。Spartan-6のときはハードマクロのMCBがあったので、どのピンに何をつなぐかは厳密に決められていたのですが、Artix-7ではMIGを使ってソフトコアを作るので、どこに配置することもできそうです。

Artixboard2

ですが、Bank14とBank15は、コンフィグ関係のピンがあるのでDDRメモリを接続するのには向きません。また、Bankをまたぐとビルドが怪しいので、できれば1つのBankに押し込めたいです。それにAD変換ポートがある場所はアナログ入力にもできるようにしたいし・・

すると、必然的にBank35になるのだと思います。つまり、A1のピンは上の図で右下になります。

Artix-7は、ADCを内蔵していたりDSPブロックが25×18になっていたりと、面白そうな機能がいっぱいあるので、こういう手軽に使えるボードを早く作りたいと思います。

| | コメント (0)

2013.05.08

Xeonマシンの安定稼働

4月15日にで作ったXeonマシンがようやく安定稼働するようになってきました。

IntelのS1200KPというマザーボードと、Xeon E3-1265V2の組み合わせだったのですが、いままで、起動して数分立つと、ブルー画面にもならずに突然止まるという現象に悩まされてきました。

Xeonitx1


OSのインストール直後はちゃんと動いているのですが、デバイスドライバを入れたりWindows Updateをかけると、ある時点で突然、動かなくなります。

メモリを取り換えてもダメ。OSを入れ替えてもダメ。BIOSの設定をいろいろいじってもダメ。何をやってもうまくいきませんでした。

CPUの挿し方が悪いのかと思い、CPUをとりはずしてふーっと息を吹きかけて戻すと、なぜかうまく動くではないですか!!おおっ、これが原因だったかと思い、ヒートシンクを締め付けると再びハング。

何でしょうね、これ・・

あるとき、ヒートシンクを取り外していて、気が付きました。このマシンはMini-ITXの筐体に入れているので、薄型のヒートシンクを取り付けているのですが、このヒートシンクを取り付ける金属のねじがマザーボードのパターンをショートしていたのです!

Xeonitx2

この部分なんて、特にヤバそうな感じがします。

Xeonitx3_2

これが原因で、CPUの速度がTurboBoostにならなかったり、TurboBoostから戻らなくなったり、突然ハングしたり、不可解な現象がいろいろ起きていたようです。

そういうわけで、このヒートシンクにワッシャをはめて絶縁したら、ちゃんと安定して動作するようになりました。

しかし、困ったことが起きたのです。このマシンはMini-ITXの筐体に押し込んでいるので、ヒートシンクの羽にSSDを固定していたネジが当たって、割れてしまったのです。

Xeonitx4


せっかくベンチマークテストをして楽しもうとしていた矢先にこのアクシデント。

このようなファンでは十分な冷却効果が見込めず、CPUを100%使うようなベンチマークを実行するとCPU温度が100℃を超えてしまいます。

代えのヒートシンクを購入して交換したところ、ベンチマークを実行しても温度は80℃前後までで収まるようになりました。

壊れたヒートシンクでXILINXのISEを実行すると75℃くらいだったのが、60℃前後に下がりました。ISEは4コアまでしか使わないらしくCPUをトータルで30%前後しか使いません。まぁ、これで十分なのですが。

それと、2008年の時点でCore2で40分かかっていたデザインの論理合成が7分でできました。ものすごいCPUパワーとSSDの威力を実感しています。

これでEDKを気兼ねなく使えそうです。

| | コメント (0)

いちごを育ててます

なひたふは最近、作物を育てるのにはまっています。

今年はベランダのプランターでイチゴが収穫できました。

Ichigo1

3月のまだ寒い時期に咲いていた花は全然身がつかなかったのですが、4月になって暖かくなったころに咲いた花は、だんだん身が大きくなるものが出てきました。ある程度暖かくないと結実しないうえに、花粉をまんべんなくつけてやらないと丸い実にならないので大変です。

まんべんなく花粉をつけてやった花は、こんなかわいい実に育ちました。

Ichigo2

味はちょっと酸っぱいです。スーパーで売っているイチゴには到底及びません。やはり寒い時期じゃないと甘くならない!?

こんな感じのイチゴがトータルで10個くらい収穫できそうです。でも、また花が咲き始めたのでもう少し採れるかも。

ランナーが出てきたかと思えば、また花が咲いたり、イチゴの気持ちはよくわかりません。来年はビニールハウスを作るか暖かい風を送るかして冬の時期に実をつけさせてみたいと思います。

さて、今日、2~3週間かけて設計していたADC/DACボードをようやく出図しました。

Tkdnadc

スペックは

  • ADC 12bit 80Msps×8ch もしくは14bit 65Msps×8ch
  • DAC 14bit 125Msps×2ch
  • 絶縁型DC-DC電源でアナログ部は完全分離
  • アナログコネクタはSMAまたはLEMOを選択可
  • メザニンコネクタでZedBoardやSP601、SP605などと接続可
  • 基板サイズは12cm×12cm

です。金曜日に生基板が出来上がってきます。それから大急ぎで実装です。

Tkdnadc2

AD変換したデータは960MbpsのLVDS×8本になって出力されて出てきます。それだけで7.6Gbpsの帯域があるわけです。LVDSのこの高速信号をZYNQのISERDESでデコードするわけですから、考えただけで楽しくなります。

| | コメント (0)

2013.05.01

SST社のフラッシュROM

SST社の(パラレル型)フラッシュROMはちょっと変です。

普通、この手のフラッシュROMにはIDCODEやCFIコードというのがあって、CPUやFPGAのバスに何がつながっているかを自動的に調べることができます。

CFIコードには、書き込み時の電圧や書き込み・消去時間などのパラメータや、セクタ構成などが書かれていて、そのデータシートを持っていなくてもROMライタが書き込みできるようになっています。そういう重要なデータなので、どのROMのCFIコードも同一の手順で読み出しができるというわけです。

具体的に言うと、CFIコードを読み出すには、ROMの55h番地に98hを書き込んで、メモリの10h番地からの数百バイトを読み出せばよいのです。もしフラッシュROMが16bit接続ならば0098hを書き込み、32bit接続ならば00000098hを書き込めばよいのです。

つまり、目の前に謎のフラッシュROMがあっても、55h番地に98hを書き込めば、そのIDCODEやセクタ構成が読みだせるのです。それがCFIです。

しかし、SST社のROMは違います。
特にSST39VF1601、SST39VF1602、SST39VF3201、SST39VF3202。

こいつはCFIを読むために、5555番地にAAhを書いて、2AAA番地に55hを書いて、5555番地に98hを書かないといけません。つまり3ステップいるわけです。

Sst39vf_1

具体的に見て見ましょう。

例えば、アドレス27hに16と書かれています。これはROMのサイズを示します。2の24乗ということで、このROMのサイズは16Mバイトというわけです。それから、アドレス28hの01は16bitのバス幅専用であることを示しています。8bitとの切り替えはできません。

こういった感じでROMの書き込み方法が調べられます。

問題はアドレス2C以降に記述されたセクタ構成です。SST39VF3201のは次のように書かれています。

Sst39vf_2

MaxBlockが2なので、4096バイトのセクタが1024個と、65536バイトのセクタが64個あるということを示してしまっています。

おそらく、SSTの人は、次のように言いたかったのかもしれません。

Sst39vf_4

1つのブロックを大きなサイズで消去することもできるし、小さな単位で消去することもできるよ・・と。しかし、上のCFIのコードを解釈すると、こんな感じになってしまいます。

Sst39vf_3

つまり、メモリのサイズが容量をオーバーしてしまうのです。

こんな特徴を持つSST社のROMですが、MITOUJTAGではどう扱えばよいのか悩み中です。とりあえず、SST社のROMを(ベンダIDで識別して)見つけたら、ブロック1の情報は無視するのが良いかなと思っています。

◆ 追記

① この記事を書いてみたら、1年前にも同じようなことで悩んでいました

② XILINXのアンサーにもこんなのがあります。

③ JEDECの規格書JEP137Bを読んでも、SSTのこの仕様については書かれていないようです。つまり標準ではなさそう。

④ アルテラフォーラムというところによると、SST社のフラッシュはCFIインタフェースは持っているが、富士通とAMDとインテルとシャープが作ったCFI規格には従っていないということ。

⑤ 他にも4kセクタの扱いについてLinuxやブートローダの話題がいくつか

みんな苦労しているんですね。

| | コメント (0)

« 2013年4月 | トップページ | 2013年6月 »