« 2014年2月 | トップページ | 2014年4月 »

2014.03.27

ZYNQ搭載のADCボードを作ります

特電もZYNQ搭載のボードを作ります。こんなボードです。

Zyncadc_1

スペックは、

  • ADCは最大100MHz 12bitのものを8ch。
    (拡張コネクタでADC子基板をスタックして最大32chまで拡張可)
  • ZYNQの030を搭載
  • DDR3 SDRAM を512MByte
  • SATAコネクタ搭載(計測データをダイレクトにSSDに保存可能)
  • ギガビットイーサ
  • Power Over Ether (POE)で電源供給可能
  • SD/MMCソケット
  • 拡張コネクタに80本程度のGPIO
  • 6Gbps トランシーバを2ch分
  • 縦88mm

です。

用途は、「人間が近くにいない極限環境における多チャネルの計測」です。そのため、非常にコンパクトに作らなければなりません。

そういう装置を必要とするいくつかの研究所から引き合いがきています。

4月中には1台納品しなければなりません。大急ぎで基板の設計も進めていきます。

Zyncadc_2

本当はUSB3.0やPCI Expressも乗せたかったのですが、よくよく考えてみれば、このボードの本番稼働中は人が近くにいないので省くことにしました。

デバッグ中はUSB3.0があると便利なので、後側のGPIOを使ってUSB3.0 & PCIe子基板を載せられるようにしようと思います。

今回の基板は、超多忙な私に代わって、優秀なスタッフがここまで回路設計してくれました。初めてCADに触ったにしてはすごいと思います。

| | コメント (4)

2014.03.22

XILINX 7 シリーズにおけるMMCM周波数の動的変更

XILINX 7 シリーズには、MMCMといって、従来のPLLやDCMをさらに進化させたクロック生成器が入っています。

MMCMの最大の特徴はなんといっても、分数の分周比や逓倍比が設定できることです。分数といっても1/8単位ではありますが、周波数の選択の幅がとても増えます。たとえば、50MHzから、SXGAのビデオ信号などで使う108MHzを作りたい場合には、M=20.25、D=9.375として、

50MHz×20.25÷9.375 = 108MHz

が生成できます。

HD1080pの148.5MHzを生成したい場合には、

50MHz×37.125÷6.25÷2 = 148.5MHz

とできます。

さて、この2つのクロックを動的に切り替えたい場合、どうしたらよいでしょう?

Clkdrp_1MMCMのパラメータはCoreGenで生成するときに決まってしまっていますが、DRP(Dynamic Reconfiguration Port)というポートを操作すると、分周比や逓倍比を実行時に動的に変えることができます。

MMCMのDRPのポートは右の図をご覧ください。

MMCMには様々な設定項目が入るレジスタがあって、DADDR[6:0]で指定します。DINやDOUTから設定値が出てきて、DWEやDEN、DCLK、DRDYを使って読み書きの指示を与えるようです。

ところが、DADDR[6:0]で内部レジスタのアドレスを指定するのだろうとは思うのですが、レジスタがどうなっているのかはさっぱりわかりません。そこで、まず実際に148.5MHzや、108MHzに設定したMMCMをCoreGenで作り、動かし、レジスタの値を読み出してみることにしました。

Clkdrp_2

DADDR(0)=8480、DADDR(1)=0092、DADDR(2)=0003・・・と何やら読めています。この値を書き込んでやればきっとMMCMが切り替わるのでしょう。

そんなふうに考えていた時期が俺にもありました

実際にはもっと複雑でした。私がたどり着いたのが、XAPP888というアプリケーションノート。このXAPP888では2つのMMCMのコンフィギュレーションを動的に切り替えるというものですが、非常に参考になりました。

XAPP888を読んでわかったことは、

  • 全部のレジスタを操作する必要はない
  • レジスタの値をDOUTから読んで、ReservedなところをMASKして残し、新たに設定する値をORでセットしてからDINに入れる
  • レジスタは0から順番に設定していくのではない

また、各レジスタの設定方法がかなり複雑であり、Lock RegisterやFilter Registerの設定値はテーブルをルックアップして求めなければならないこともわかりました。

結局、CoreGenで1回作って実機で動かして、DRPから読み出した値をVHDLソースにハードコーディングしておいて、それを書き込んだほうが楽という結論にたどり着きました。

そして、どういう順序でどのようにレジスタを設定すればよいかをまとめると・・

DRPレジスタのアドレス 説明

出力108MHz

出力148.5MHz

0x28 PowerReg 9900 9900
0x08 CLKOUT0 Reg1 1104 1082
0x09 CLKOUT0 Reg2 3880 2c00
0x0a CLKOUT1 Reg1 0041 0041
0x0b CLKOUT1 Reg2 0040 0040
0x0c CLKOUT2 Reg1 0041 0041
0x0d CLKOUT2 Reg2 0040 0040
0x0e CLKOUT3 Reg1 0041 0041
0x0f CLKOUT3 Reg2 0040 0040
0x10 CLKOUT4 Reg1 0041 0041
0x11 CLKOUT4 Reg2 0040 0040
0x06 CLKOUT5 Reg1 0041 0041
0x07 CLKOUT5 Reg2 2840 0c40
0x12 CLKOUT6 Reg1 0041 0041
0x13 CLKOUT6 Reg2 0c40 2440
0x16 DIVCLK 1041 0041
0x14 CLKFBOUT Reg1 1249 1491
0x15 CLKFBOUT Reg2 2c00 1880
0x18 Lock Reg1 01f4 00fa
0x19 Lock Reg2 7c01 7c01
0x1a Lock Reg3 ffe9 ffe9
0x4e Filter Reg1 9008 0908
0x4f Filter Reg2 0100 1000

という結果になりました。確かにXAPP888に書かれたビットフィールドの意味と照らし合わせて考えれば妥当なのですが、まぁ、これを自分で計算するのは大変です。VHDLのfunctionにすればよいのでしょうが・・

この値をDRPに書き込んでやれば、周波数は切り替わります。DENやDWE、DRDYの使い方は上の波形を参考にしてください。DWEはDENと共にアサートしないと効果がないようでした。

Clkdrp_3

そして、この値を書き込んでやるステートマシンを作ったところ・・・

Clkdrp_4Clkdrp_5

周波数を動的に切り替えることができるようになりました。

| | コメント (6)

2014.03.17

非同期FIFOでのタイミングエラー

XILINXのCoreGenで非同期FIFOを作って、異なるクロックドメイン間での信号の受け渡しをしようとしているのですが、どうしてもタイミングエラーが出てしまいます。

問題を単純化させるために、入力FDと、FIFOと出力FDのみを配置したデザインを作りました。

Afifo_1

afifoというモジュールは、CoreGenで作った非同期FIFOです。BlockRAMを用いた独立クロックのFIFOを生成させています。

clkgenというのは、50.0MHzと50.2MHzのクロックを生成するモジュールです。

CoreGenで作ったFIFOといえども、このように微妙に異なる周波数のクロックを与えた場合、タイミングエラーが出てしまいます。

Afifo_2

どんなネットでエラーが出ているのかと調べてみると・・

 Slack (setup path):     -1.016ns (requirement - (data path - clock path skew + uncertainty)) 
   Source:               inst_afifo/U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_gc_4 (FF) 
   Destination:          inst_afifo/U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/gsync_stage[1].wr_stg_inst/Q_reg_4 (FF) 
   Requirement:          0.081ns 
   Data Path Delay:      0.740ns (Levels of Logic = 1)(Component delays alone exceeds constraint) 
   Clock Path Skew:      -0.169ns (2.490 - 2.659) 
   Source Clock:         clk50_2mhz rising at 19.919ns 
   Destination Clock:    clk50_0mhz rising at 20.000ns 
   Clock Uncertainty:    0.188ns 

どうやらinst_afifo/U0/xst_fifo_generator/gconvfifo.rf/grf.rf/gntv_or_sync_fifo.gcx.clkx/rd_pntr_gc_4とかいう随分深い階層の中のネットがエラーを出しています。ただ、CoreGenの中の信号なので、ユーザとしては触ることができません。

注目すべきところは上のRequirement:0.081nsというところです。

今回のclkgenは、50MHzと50.2MHzを作っています。50.2MHzというのは50MHz×31.125÷31≒50.202MHzです。2つのクロックのタイミングは近づいたり離れたりしますが、もっとも近いところで0.081nsになるということです。

0.081nsで動くFFなんてありませんからタイミングエラーが出るのは仕方がないのですが、さて、どうしたものでしょう。

TIGというタイミング制約をかけてみます。TIGはタイミング制約を無視するという魔法のコマンドです。UCFファイルにTIGを書けばよいのですが、どうやらクロックに対してかけるものらしく、先にクロックのネットを指定しておきます。

今回のデザインでは、clk50_0mhzとclk50_2mhzという2つのクロックのネットがあるので、これらの2つのドメインを渡るところはタイミング解析をしないようにさせます。

NET "clk50_0mhz" TNM_NET = TMN_CLK_500;
NET "clk50_2mhz" TNM_NET = TMN_CLK_502;
TIMESPEC TS_CLK_500_TO_502 = FROM "TMN_CLK_500" TO "TMN_CLK_502" TIG;
TIMESPEC TS_CLK_502_TO_500 = FROM "TMN_CLK_502" TO "TMN_CLK_500" TIG;

すると、このように

Afifo_3

タイミングエラーは消えました。

でも、これでよいのかどうかは疑問が残るところです。CoreGenの中で発生しているエラーは消えますが、本当に2つのクロック間で不注意に信号をつないでしまっているところがあったとしても発見できなくなります。

次に、7シリーズのBuildIn FIFOを使ってみます。CoreGenの2ページ目で一番下のチェックボックスを選ぶだけです。

Afifo_5

結果に変化がありました。今まで2つのタイミングエラーがあったのが1つに減ったということです。

Afifo_6

エラーの詳細を見てみると、

 Slack (setup path):     -3.296ns (requirement - (data path - clock path skew + uncertainty)) 
   Source:               inst_afifo/U0/xst_fifo_generator/gconvfifo.rf/gbiv5.bi/rstbt/wr_rst_reg (FF) 
   Destination:          inst_afifo/U0/xst_fifo_generator/gconvfifo.rf/gbiv5.bi/v6_fifo.fblk/gextw[1].gnll_fifo.inst_extd/gonep.inst_prim/gf18e1_inst.sngfifo18e1 (RAM) 
   Requirement:          0.080ns 
   Data Path Delay:      3.057ns (Levels of Logic = 1)(Component delays alone exceeds constraint) 
   Clock Path Skew:      -0.131ns (2.532 - 2.663) 
   Source Clock:         clk50_0mhz rising at 4940.000ns 
   Destination Clock:    clk50_2mhz rising at 4940.080ns 
   Clock Uncertainty:    0.188ns 

なんと、どうやらリセット関係の信号で出ています。ユーザ回路からCoreGenに与えるリセットを削除してみたのですが、CoreGen内部でリセットを作っているらしく、エラーはなくなりませんでした。

結果をまとめると、

  1. CoreGenの非同期FIFOを使っていても、非常に近いタイミングで遷移する2つのクロックが与えられたときにはタイミングエラーが出る
  2. ビルトインFIFOにすれば少しはエラーが減るが、リセットまわりでどうしても出る。

結論としては、

  • タイミングエラーを回避するには、2つのクロック間でTIGをかける

ということになります。これでよいのか!?

| | コメント (0)

2014.03.13

18bit ADC(改)の性能

18bit ADC(改)をついに動かすことができました。

18bitadc_1

まず、無信号時の変換結果です。入力は50ΩでGNDにショートしています。

18bitadc_2

ノイズで揺れていますが、標準偏差を取ってみると約1.3LSBでした。電圧に換算すると42μVです。つまり、18bitのADCで、1.3LSBの性能が出ています。

次にヒストグラムを見てみます。

18bitadc_3 18bitadc_4

このヒストグラムを見ても、ばらつきが1LSB程度であることがわかると思います。

何が言いたいかっていうと、ノイズがすごく少なくて18bit ADCの生の性能が出ているということです。

それから、状態遷移型の発振器で作った約20kHzの正弦波を入れてみました。

18bitadc_5

このように、OPA211とTHS4130で作ったプリアンプは、ひずみも少なく非常に優れた性能を発揮しています。

また、初段アンプをOPA211ではなく、アナデバの差動アンプAD8253に切り替えることもできます。AD8253を使うと、差動入力が使えて、ゲインを1,10,100,1000倍に切り替えられます。

性能と仕様をまとめておきます。

  • ADC … AD7986   18bit
  • チャネル数 … 2CH
  • サンプリング速度 … 2MHz
  • 入力フルスケール ±4.096V
  • 分解能 … 1LSB = 31.25μV
  • ノイズ … 約1.3LSB
  • 入力インピーダンス … 50Ωまたはオープン (OPA211またはAD8253)
  • 入力方式 … シングルエンド、または差動(AD8253使用時)
  • プリアンプのひずみ率 … 約(-100dB (約0.0005%) (OPA211使用時)
  • プリアンプゲイン … 1,10,100,1000倍に切り替え可 (AD8253使用時)
  • DAC 16bit,1MHz,2ch。±2.5Vフルスケール。

ようやく満足のいく性能が出たのですが、ここに至るまでにとても苦労がありました。まず、今回は手作業ではんだ付けをしたのですが、結構はんだ付けミスが多く、原因究明に無駄な時間を使ってしまったこと。次に、Digikeyに注文したTHS4130の袋に別の部品が入っていて、気付かずに実装していたこと。

あと、はっきり実感したことは、4層基板で作った本機は、2層基板の試作品よりもノイズがはるかに小さいということです。電源回路やDACからのノイズの混入も観測できないほどでした。電源専用プレーンの効果を実感しました。

来週中には第1ロットの量産試作を始めたいと思います。この基板は原価がとても高いので一度にたくさん作れません。少しずつ製造していこうと思います。

| | コメント (0)

2014.03.12

18bit ADCボード(改)に実装してみた

先日、出来上がってきた18bit ADCボードの基板に部品を実装しました。

Np1067a_1

金きら金です。

最初の1台は手作業で付けました。だいたい4時間くらいかかりました。

Np1067a_2

今夜、Artix-7ボードを乗せて動作確認をすることにします。

さて、試作機で出た性能が出るでしょうか?

| | コメント (2)

2014.03.11

究極のRX62Nボードの新ロットにAlliance MemoryのDRAMを使ってみた

今なお売れ続けている不朽の名機(?)、究極のRX62Nボードの新しいロットが出来上がってきました。

Np1040b_1

回路自体は前回と同じですが、SDRAMにAlliance Memory Inc.社のAS4C4M32S-7BCNを使用しています。

前回まではMicronのMT48LC4M32B2B5-7を使っていたのですが、どうやら入手が難しくなってきたようです。MicronのStatusでは「Contact Factory」となっているので、もしかするとSDR SDRAMはこれからますます入手が困難になるのかもしれません。

そんな中、突如としてあらわれたのがAlliance Memory Inc.。アメリカの会社のようです。ホームページのトップのところに、「Manufacturer of Legacy Memory SRAM, DRAM, AND SDRAM ICS」と書かれているので、各社がやめてしまったレガシーなメモリICを作ってくれるということでしょうか?何ともありがたい。

こちらのページを見ると代替品のリストのようなものもあります。

http://www.semiconductorstore.com/cart/pc/viewPrd.asp?idproduct=49129

恐る恐る実装してみたのですが、問題なくメモリテストも通りました。

Np1040b_2

こういう会社があって本当に安定供給してくれるなら、心強いです。

安心してDRAMが使えます。

| | コメント (0)

2014.03.10

IntelのUSB3.0ホストでもCypressのEZ-USB FX3がちゃんと動くようになった

1月末に「USB FX3がBulkInでハングアップする」という記事を書きました。

状況を簡単に説明すると、特定のマシンでは、

  • USB3.0 HighSpeedモードで通信していて
  • BulkInのリクエストを出してから、125us以上経過するなど、NACKが返ったと思われる状況

の場合にEZ-USB FX3がその後ハングしてしまうというものでした。

つまり、「INをNACKで応答して、待たせることができない」のです。だから、USB3.0カメラを作るような場合は、新しいフレームが来るまで待つことはできないし、USB-JTAGを作る場合もJTAGの処理が完了するまで待つことができません。

これはかなり不便でした。

その後いろいろ調べていくうちに、この現象はインテルのUSB3.0ホストを使った場合にのみ発生することがわかりました。Artix-7ボードをお買い上げいただいたお客様で、同様の現象が発生している方に問い合わせてみたところ、問題が生じているのはインテルのUSB3.0ホストチップだけで、ルネサスのUSB3.0チップでは起きていないということがわかりました。

今日、ファームウェアを修正してこの問題の対策をしました。

結果は快調です。いままでEZ-USB FX3-JTAGが動作しなかったマシンでも快適にUSB-JTAGが使えるようになりました。INパケットを何秒待たせてもハングアップすることはなくなりました。

USB3.0-JTAGとしても、計測用としても、問題ない動作ができるようになりました。

Fx3jtag_1Fx3jtag_2

新しいファームウェアは、こちらからダウンロードできるようにしました。

ファームウェアの書き換え方法は過去のブログの記事をご覧ください。

どうか快適なUSB3.0機器開発をご堪能ください。

| | コメント (1)

2014.03.07

Spartan-6やArtix-7ボード用の拡張ベースボードを販売開始します

お待たせしました。「FPGA拡張ベースボード」を販売開始します。

Np1066a_1_2

このボードは、特電Spartan-6ボードや、Artix-7ボードの拡張用のベースボードで、以下のような特徴を持っています。

  • 100BASE-TXのLAN (PHY搭載)
  • ディジタルビデオ出力(HDMIコネクタ)
  • MMC Micro / SDMicroカード用スロット
  • USB-UART
  • ユニバーサルエリア
  • Arduino互換の形状

つまり、家庭用テレビにHDMIで画像を出力したり、MicroBlazeを使った実験や検証を行うためのボードです。(一応、Artix-7 MicroBlaze Linuxの起動まではできています)

Np1066a_2

FPGAボードと重ねると重厚な雰囲気になります。手のひらで握ってちょうどよいサイズです。

Np1066a_3

さて、気になる価格ですが・・・

拡張ボード単体では税込6,300円です。

ちょっと高めと感じるかもしれません。

でも、ご安心ください。

Spartan-6ボードとセットでお買い上げのお客様は1,050円引きで、Artix-7ボードとセットでお買い上げの客様には3,675円引きで提供させていただきます。

Artix-7ボードとセットでお買い上げの方には、このボードの価格は、なんと!2625円になるわけです

これだけじゃありません。

そして、Spartan-6またはArtix-7とセットでお買い上げの方には、ビデオ出力やMicroBlaze Linuxのサンプルプロジェクトも提供します。

サンプルデザインというサポートが付いてくるので、とてもお得なのです。ハードウェアの部品代原価しか考えられない方にはこのお得感はわからないかもしれません。

ご注文はオンラインショップから承ります。ぜひとも、Artix-7やSpartan-6の機能拡張をお楽しみください。

P.S. 赤字覚悟の価格で提供しているので、いつまでこの価格で続けられるか保障できません。24台限定生産です。突然の価格改定もあり得ますので、お早目にご注文ください。

| | コメント (0)

2014.03.05

ようやく終わった仕事

昨年9月に某社資材部から極めて失礼な2名の方が来てから、この会社の仕事は完全にやる気がなくなっていたのですが、追加製造の依頼があって作業していた分がようやく終わりました。「今日ですべてが終わる♪」っていう歌詞がグルグル回りながら作業していました。

部品を集めていた1月は、Digikeyの在庫切れも多く大変でした。大容量コンデンサとか、DC-DCとか、ディスコンや長期の在庫切れになっていた部品が数多くありました。

この仕事の何が嫌だったかというと、仕様書にある信号名が暗号みたいな頭文字で、信号の意味を聞いてもはっきり教えてくれないし、基板の名前も「数字」だし、最終的に何を作っていたのかわからないままだったことです。コネクタの入出力に何がつながるのかも、結局最後までよくわかりませんでした。

さて、先月末に納品したものの、追加仕様が反映されていないとかで物が戻ってきたのですが、資材部から商社経由で来たメールのタイトルが「着荷取消に関して」とかいう妙に嫌な言い回しでした。資材部はどうして「修正依頼」とか「改修依頼」とか普通に言えないのでしょう。

極めつけは、納品物が送り返されてきたとき「着払い」だったこと。着払いで返送するならあらかじめ言っておいてほしいものです。

何を作っているのかわからないほどつまらないことはありません。ようやく終わったので、今月はより面白くエキサイティングな仕事に時間を使うことができるようになるでしょう。

| | コメント (0)

2014.03.04

18bit ADCボードができあがってきた

本日、18bit ADCボードができあがってきました。

4面づけです。

Np1067a_1

長期的な安定性を考えて金フラッシュ仕上げにしています。

Np1067a_2

最初の1枚はすぐに実験したいので、今週中に手半田で作ってみて、特性を測ってみたいと思います。

Np1067a_3

| | コメント (0)

2014.03.03

新しいスタッフ

本日、事務をやってくれる新しいスタッフが入りました。

最近忙しさが極まっていたので、とても嬉しいです。

会計もでき、Illustratorで綺麗な絵を描ける方なのでとても期待しています。

| | コメント (1)

« 2014年2月 | トップページ | 2014年4月 »