« 2010年10月 | トップページ | 2010年12月 »

2010.11.28

MT9T031で綺麗な画像が撮れた

MT9T031CとSpartan-6で作ったCMOSデジカメで、綺麗な画像が撮れるようになりってきました。ノイズの問題や、同期信号が乱れる問題もすべてクリアして、綺麗な絵になりました。
Mt9t031_system

ものすごく綺麗です。それに、このカメラについているレンズが、ピントや絞りが調節できる本格的なものなので、とても楽しいです。

実際の画像は次の絵をご覧ください。クリックで拡大します。2048×1536の迫力のあるサイズです。変な話ですが市販のデジカメ並みの画像です。
MT9T031 SAMPLE

どうでしょう?前に作ったOV7670のカメラとはまったく別格です。
細かいところまでくっきりと映っています。

MT9T031のI2Cレジスタは、ゲイン、シャッター時間、縦横のサイズ、が設定できることがわかりました。それ以外にもいろいろなレジスタはありますが、設定して有意義なレジスタはありませんでした。

QXGA(2048×1536)の画像はあまりにも大きくて、パソコンの画面に表示させることができません。
Mt9t031test

そこで、カメラに内蔵されたスキップ読み出し機能を使います。これは、縦や横の行を等間隔でスキップしながら読みだすことで、画角は同じまま縮小してみることができます。単純に小さなウィンドウを切り出すと、大きな画角のなかの一部分しか見えないのですが、この方法なら全体が見えます。
1:2、1:4などは問題なかったのですが、1:3、1:5、1:6、1:7に設定するのは難しかったです。

下の図は4分の1に縮小して、カメラがどのような絵を見ているかの全体を確認できるようにしているところです。
Downsample_2

このような感じでMT9T031を使いこなすことができるようになってきました。
このシステムはET2010で、Spartan-6ボードのアプリケーションとして展示します。ご自由に遊んでみてください。
MT9T031の使い方にはいろいろなコツやノウハウがあるので、詳しくお知りになりたい方はぜひ特電ブースまでお越しください。

皆様のお越しをお待ちしております。

◆追伸

ちなみに、センサ自体はこんな大きさです。
Bare_sensor

| | コメント (0)

2010.11.26

ET2010に出展します!

特殊電子回路㈱は「組込み総合技術展 ET2010」に出展します。

場所はホールBCD、E-26 ザイリンクス/PALTEK ブースの中です。
そう、XILINXブースです。
ついに、念願のXILINXブースの中での出展ができることとなりました!!

Xilinx_booth

展示内容は主に、Spartan-6 FPGA評価ボードと、Spartan-6 PCI Express FPGA評価ボード(EXPARTAN-6T)の展示とデモンストレーション です。
※もちろん、MITOUJTAGも展示しています。

さて、今回の展示のテーマは誠に勝手ながら、
「Spartan-6についてお客様と語り合う」
とさせていただきました。

Spartan-6は、まだリリースされて間もない、本当に新しいデバイスです。従来のFPGAと比べると機能は格段に向上していますが、その効果的な使い方はあまり知られていないことも多く、情報も少ないのが実情です。
当社は1年以上前からSpartan-6と格闘し続けて、数多くのノウハウを得てきました。

ブログやウェブには決して書けない数々のノウハウや、これってバグ?というような事例もいっぱい発見してきました。

この展示会では、実際にお客様にお会いし、お客様が日ごろからSpartan-6について疑問に思っていることと、当社が独自に研究を積み重ねた結果などを語り合いたいと考えています。

どうか、貴方のお役に立たせてください!
お客様皆様とお会いできることを楽しみにしております。

詳しい情報はこちらのページにございます。
http://www.tokudenkairo.co.jp/event.html

◆P.S.
ちょっとこだわりのパンフレットを作りました。従来他社のようにただの宣伝を並べるのではなく、読んで楽しいパンフレットに仕上がるよう工夫してみました。A4サイズで6ページ4色刷りです。
それほど大したものではありませんが、これ1冊でSpartan-6がちょっと語れるようになれるかもしれません !?
Panf
(クリックしても拡大しません。会場でお配りします。)


| | コメント (1)

2010.11.25

MT9T031CでUSBカメラを作る

Micron(現Aptina)社のMT9T031CというCMOSイメージセンサでUSBカメラを作ることにしました。MT9T031Cは300万画素のCMOSカメラです。

MT9T031Cの評価基板「MT9T031C12STCH ES」はDigikeyで約3万円で手に入れました。この評価基板を特電Spartan-6ボードにつなぎ、USBでキャプチャできるデジカメを作ることにしました。

作った装置はこのような外観です。大きなレンズがついていて、絞りとピントを調節できる本格的なものです。
Mt9t031c_1

背面には特電Spartan-6ボードがついています。
Mt9t031c_3

真ん中に1枚、万能基板を挟んでいます。
Mt9t031c_2

撮れた2048×1536サイズの画像をSpartan-6につながったDDR2 SDRAMに蓄え、それをUSBで読み出します。各画素は10bitデータですが、パソコンに取り込んでも10bitは表示できないので8bitに切り捨てます。2048x1536×8bitを12fpsで撮るには、約38MBytes/secの転送速度が必要です。特電Spartan-6ボードなら、理論上はコマ落ちせずにパソコンに取り込めます。

実際の絵は本当に綺麗でした。秋葉原で数千円で売っているCMOSカメラとは格が違います。
次の写真は事務所の窓から隣のビルの壁を映したものです。
Mt9t031c_4

手元にある基板とか回路図もこのとおりです。
Mt9t031c_5

問題なのは、撮影の際に手ぶれをしてしまうこと、ちょっと変なノイズが乗っていること、明るいと同期信号が乱れること、パソコンの画面よりも画素数が多いこと、まだ色が出ないこと、データシートが入手できないこと。(Aptinaは、なかなかデータシートが入手できません。)

同期信号の乱れは自動露出調整モードでのシャッター時間と関係していると推測しています。
あと1日くらいじっくり時間をかければ完璧なものができるのでしょうが、とりあえずここまでにしておきます。

綺麗に動いたら、ET2010でデモします。

| | コメント (1)

2010.11.23

Spartan-6のMCBの使い方(2)

MCBを使う場合の、各部のクロック周波数はどうやって設定するのでしょうか?

DDR2/DDR3メモリを400MHzで動かすには、メモリのデバイスにはその半分の200MHzのクロックを与えますが、MCBには400MHzを与えます。MCBはメモリの2倍の速度のクロックが必要です。
このクロックを作り出すにはFPGAの中のPLLを使います。

クロックとリセット信号を司るのが、memc3_infrastructure.vhdです。

memc3_infrastructure.vhdは、Generic文で以下の項目がカスタマイズできるようになっています。つまり、memc3_infrastructure.vhdを直接いじらなくても、上位のソース(ここではmymcb.vhd)から設定できます。

entity memc3_infrastructure is
generic
(
C_MEMCLK_PERIOD : integer := 2500;
C_RST_ACT_LOW : integer := 1;
C_INPUT_CLK_TYPE : string := "DIFFERENTIAL";
C_CLKOUT0_DIVIDE : integer := 1;
C_CLKOUT1_DIVIDE : integer := 1;
C_CLKOUT2_DIVIDE : integer := 16;
C_CLKOUT3_DIVIDE : integer := 8;
C_CLKFBOUT_MULT : integer := 2;
C_DIVCLK_DIVIDE : integer := 1
);

C_MEMCLK_PERIODは入力クロックの周期をps単位で指定します。パラメータの名前は「メモリクロックの周期」ですが、これはCoreGenが生成したファイルに誤りがあるためです。
※本来はメモリクロックの周期する予定だったのでしょうが、memc3_infrastructure.vhdの中を見ると、PLLに入力される元クロックの周波数として使われています。実際にSP601のサンプルとして提供されている回路を見ると、このパラメータはC_INCLK_PERIODに変わっていて、入力されるクロックの周期を指定するようになっています。

C_CLKOUT0_DIVIDE~C_CLKOUT3_DIVIDE、C_CLKFBOUT_MULTがここでの設定の肝となります。

Spartan-6のPLLは出力を6つ持ちます。このデザインでは0番と1番は高速クロック、2番はユーザクロック、3番はキャリブレーション用クロックに割り当てられています。

C_CLKOUT0_DIVIDEとC_CLKOUT1_DIVIDEは常に1にしておきます。

DDR2メモリの転送速度を400MHzにする場合、DDR2メモリの動作クロックは200MHzです。MCBに与えるクロックは2倍速なので400MHzを与えることになります。FPGAへ入力するクロックが50MHzならば、C_CLKFBOUT_MULT=8にします。FPGA内のユーザロジックを100MHzで動かすならば、C_CLKOUT2_DIVIDE=4に設定します。

Mcb6

キャリブレーション用クロックは100MHz以上でMCBクロックと同期していなければなりません。ここでは、C_CLKOUT3_DIVIDE=4と指定します。

このように、memc3_infrastructureのパラメータを変更することで、MCBの動作速度と供給クロック、ユーザロジックのクロックを個別に設定できます。
この辺の設定は現時点のMIGのGUI画面では設定できないので、ソースを開いて手作業で修正するしかなさそうです。

memc3_infrastructureの入出力ポートを見てみましょう。

port
(
sys_clk_p : in std_logic;
sys_clk_n : in std_logic;
sys_clk : in std_logic;
sys_rst_n : in std_logic;
clk0 : out std_logic;
rst0 : out std_logic;
async_rst : out std_logic;
sysclk_2x : out std_logic;
sysclk_2x_180 : out std_logic;
mcb_drp_clk : out std_logic;
pll_ce_0 : out std_logic;
pll_ce_90 : out std_logic;
pll_lock : out std_logic

);
end entity;

入力クロックに差動クロックを使う場合はsys_clk_pとsys_clk_nから、シングルエンドクロックを使う場合はsys_clkから入力します。

生成されたMCB用クロックはsysclk_2xとsysclk_2x_180から、ユーザ用クロックはclk0から、キャリブレーション用クロックはmcb_drp_clkから出力されます。

| | コメント (0)

Spartan-6のMCBの使い方(1)

Spartan-6には、MCBという、DDR SDRAM(DDR,DDR2,DDR3,LPDDR)にアクセスするためのハードウェアマクロが内蔵されています。この使い方を調べてみました。

MCBは「MCB」という名のプリミティブで提供されますが、普通はこれを直接インプリメントすることはせず、CoreGeneratorで作ったラッパを被せて使います。MCBにはパラメータやポートが非常に多くあり、手動で設定することは困難だからです。

ここではISE12.1を使います。ISE12.2だとなぜか上手く動きませんでした。

ISEを起動したら、New Source WizardからCoreGeneratorを起動して、Memories & Storage Elements中にあるMIGを起動します。MCBのテストなので、ファイル名はmymcbにします。
Mcb1

MIGの画面では、メモリの容量や速度、アドレス線の設定、終端抵抗の設定などができますが、それらはXILINXのドキュメントを参照してください。このブログではXILINXのドキュメントに書かれていないことを書きます。

MIGの設定を最後まで行ったら、Project Managerにmymcb.xcoファイルが登録されています。
Mcb2

普通の感覚なら、このmymcb.xcoをインスタンシエートするような記述をして、次の図のようにプロジェクトに取り込みたいところです。
Mcb3

しかし、MCBではそうはいきません。CoreGenで作ったmymcb.xcoは、クロック入力はFPGA外部からの供給を前提としていて、周波数は200MHzを仮定していて変更できない、という特徴があるからです。
つまり、特定の評価ボードを前提としているようです。

自分で作ったボードで使って、クロックも自由にしたい場合は、mymcb.xcoのしくみを理解する必要があります。
まず、CoreGenで生成したファイルの構造を見てみます。
CoreGenでMIGを実行すると、(プロジェクトのフォルダ)\ipcore_dir\mymcb\user_design\rtlにmymcb.xcoのソース一式が出来ています。
Mcb4

なお、\ipcore_dir\mymcb\にはuser_designというフォルダとexample_designというフォルダがあり、似たようなファイルが入っています。
example_designは、MCBのラッパのほかにテストパターンジェネレータが入っていてエラーの有無をチェックするためのサンプルデザインのようです。user_designにあるmymcb.vhdがmymcb.xcoと等価なファイルです。

したがって、user_design以下のmymcb.vhdを除く各種ファイルをプロジェクトに追加することで、MCBをインプリメントでき、なおかつ動作をカスタマイズできます。
・memc3_wrapper.vhd
・memc3_infrastructure.vhd
・mcb_soft_calibration_top.vhd
・mcb_soft_calibration.vhd
・mcb_raw_wrapper.vhd
・iodrp_mcb_controller.vhd
・iodrp_controller.vhd

プロジェクトの階層は以下の図のようになります。
Mcb5

mymcb.xcoをRegenarateすると、上記の各ファイルが再生成されます。
このようにxcoをインスタンシエートするのではなく、xcoによって生成されたVHDLソースをみつけて、それをインスタンシエートするといいでしょう。

| | コメント (0)

2010.11.08

割り込みとDMA対応のPCIeコアをリリース

Spartan-6LXTの内蔵EndPointで、DMAが手軽にできるようにした「DMA IPコア」をリリースしました。
http://www.tokudenkairo.co.jp/sp6/expartan-6t.html

性能は、140~160MBytes/sec出ています。
Dma
あと少しでPCI Expressの限界に届きそうです。スキャッタギャザーに対応させたり、ドライバの中でコピーしないようにすれば、もっと速くなると思います。
真のスキャッタギャザーは実現するのは意外と大変なのですが、そういう速度が出ることを喜んでくれるお客様がいらっしゃったら、すぐにでも取り組みたいと思います。

さて、今回のコアとアプリでは割り込みにも対応しました。コアは最大16種類のユーザ割り込みを扱えるようになっていて、サンプルデザインでは基板上の青いスイッチを押すと、4種類の割り込みが発生できます。
Tkpetest

これからの予定としては、スキャッタギャザーDMAのサポートや、さらなる安定化、ドキュメントの充実、MCB(メモリコントローラブロック)との連携を図っていこうと思います。

           ◆ ◇ ◆

ところで、今回、DMAコア対応をリリースできたこと記念して、
キャンペーンを行うことにしました。

このEXPARTAN-6Tボードは、基板単体の単価は\59,640(税込)です。
それにSpartan-6LXTの内蔵EndPoint Blockを使いやすくするためのDMA IPコアやデバイスドライバなどのライセンスを含めると、\91,140(税込)です。

もし、コアをお買い上げいただかない場合・・・つまり、
EXPARTAN-6Tのボード単体\59,640(税込)には、評価版IPコアがついてきます。
これはDMA IPコアの時間制限版のコアがついてくるということです。
※リセット後60分で動作停止します。再リセットで復帰

EXPARTAN-6Tの\91,140(税込)は、限定版IPコアがついてきます。
これは、DMA IPコアの時間制限がありません。ただし、当社のボードでのみ動きます。

このように、コアの有無という2種類のライセンスで出しています。

比べてみればわかりますが、これは世界的に見ても、かなりお得な価格です。
他社の製品を見てみると、某社のラッパは十数万円、海外の某社のは約24万円です。
特電のはボードにIPコアにサポートまで付いて9万円ですから、相当お得です。

このように、EXPARTAN-6Tには圧倒的な価格メリットがあるのですが、さらに、

評価版IPコアの価格で限定版IPコアを

プレゼントすることにします!!

つまり、約3万円分得しちゃうというキャンペーンです。
(もちろん、現在までにEXPARTAN-6Tをお買い上げいただいた方も対象です。)

といっても、世界中にある既存のIPコアベンダ(古くからあって、目茶高い)から睨まれたり、TPPとか自由貿易がどうとかダンピングがどうと言われても困るので、
現時点から、あと3台限りとさせていただきます。

どうか、ご容赦ください。

早い者勝ちですので、お見逃しなく!!

■追記
11月12日を以って、本キャンペーンは終了いたしました。
完売いたしました。ありがとうございました。


| | コメント (0)

2010.11.04

当社製品の無料モニター様大募集

特殊電子回路では、当社製品の無料モニター様を募集することにいたしました。
当社製品を無料でお貸し出しさせていただきます。
1~2週間と短い期間ですが、思う存分お試しください。

対象の商品と募集人数は、
・MITOUJTAG BASIC評価版+Pocket JTAG Cable・・・2名様
・特電Spartan-6評価ボード(TKDN-SP6-16または45)・・3名様
・特電Spartan-6 PCI Express評価ボード(EXPARTAN-6T)・・2名様
です。

Trial1Expartan6t

お申込みは平成22年11月4日(木)から11月10日(水)まで受け付けております。
原則として先着順ですが、人数が多い場合は抽選とさせていただきます
無料でご応募いただけます。

詳しくはこちらのページをご覧ください。

http://www.tokudenkairo.co.jp/trial.html

貸出中による品切れも予想されますので、お申込みはお早目にお願いします。
多くの皆様からのご応募をお待ちしております。

| | コメント (0)

2010.11.03

Spartan-6LXTと特電PCIeコアでDMA

Spartan-6LXTの内蔵PCI Expressコアを、特電PCIeコアでラッパすることによって、割り込みとDMA転送までできるようになりました。

ちょこっとDMAの速度を測りたかっただけなのに、DMAを実現するには割り込みをやらなければならなくて、その前にBAR0空間の各種レジスタをしっかり作りこんだり、コンプリーションを受け取れるようにしたりしていたら、いつのまにか完全な形で移植していました。

やっぱり全部作らないと、ちょこっとした実験もできませんでした。

そして、気になるその速度は・・・
波形で測定したところでは、Writeは336ns間に64バイト送れていたので約190MBytes/secでした。
Dmawr1
Dmawr2

Readは608ns間に128バイト受け取れていたので、約210MBytes/secでした。
Dmard1
Dmard2

しかし、これはデバイスとパソコン間の理想的な伝送速度です。実際には割り込み(DMAの完了を知らせる)のオーバーヘッドに加え、デバイスドライバの中でのデータのコピーなど様々な要因で遅くなります。

アプリケーションのレベル(DLLの呼出)で測ったところでは、Read(IN方向)が141MBytes/sec、Write(OUT方向)が160MBytes/secでした。
Dmardwr

USB2.0の4~5倍は速い。まずまずの成績といえるでしょう。

Readは210MBytes、Writeは190MBytes出ていたので、Spartan-6の内蔵EndPoint BlockはPCI Express x1の性能を最大限に生かせるということがわかりました。つまり、あとはドライバとOSの問題です。

これを理想的な速度に近付けていくには、真のスキャッタギャザーDMAをサポートしなければなりません。今はCommonBufferという方式でDMAをしています。CommonBufferだとデータのコピーが発生するので、速度低下の原因になります。ユーザがmallocしたバッファの論理アドレスめがけて直接DMAをできるようにしないといけませんね。
また、Windowsの1ページ分(4096バイト)の転送を行うたびに割り込みをかけているので、それが速度低下の大きな原因です。だから、FPGAの中にあらかじめ転送先アドレスと長さのテーブルを送っておくようにしないといけないのでしょう。
そういう改良は後のお楽しみとして取っておくことにして、近々このデザインをリリースしようと思います。

このデモは、特電Spartan-6ボードだけではなく、XILINXのSP605などでも動くようにしようかなと思っています。また、ET2010では某社のブースの中で展示します。
お楽しみに。

◆P.S.
主な実験環境はこのマシンです。Mini-ITXのAtomマシンです。Mini-ITXのケースにボードがささらないので、マザーボード剥き出しで実験しています。

マザーボードに延長ケーブルボードをさしてPCI Express External Cableを引き出して、EXPARTAN-6Tに接続しています。こうすると、パソコンとPCI Expressボードが別電源になって、パソコンの電源をOFFにしてもFPGAのデータが消えないので開発には便利です。
Pcieext

このAtomのマシンではRead・Writeともに130MBytes/secくらいが限度でした。ただ、PCI Expressの波形的にはWrite 190MBytesとRead 210MBytesが出ているので、ドライバのオーバーヘッドが原因なのでしょう。

| | コメント (0)

« 2010年10月 | トップページ | 2010年12月 »