« 2015年5月 | トップページ | 2015年7月 »

2015.06.30

Cosmo-Zで長時間のプレトリガ機能を開発

ZYNQ搭載のADCボード「Cosmo-Z」をデータロガーとして使う場合の、長時間のプレトリガ機能を開発しました。

下の図は、100MHzで5000万ポイントをサンプリングした0.5秒間の波形を示したものです。

オレンジ色の波形が立ち下がるところでトリガをかけていますが、10msのプレトリガ期間があるので、トリガ前も後もちゃんと取れています。

Cosmozlong

このようなことをするために、ZYNQにつながったDDR3メモリを長大なリングバッファにしています。

Ringbuf_2

Cosmo-Zには1GBのDDR3メモリが乗っていますが、そのうち512MBがFPGAのPLが自由に使える領域(いわばDMA領域)です。これを大きなリングバッファとして使っていて、トリガが入った前も後も取れるようにしているわけです。

使い方は簡単。Cosmo-ZのLinuxにログインして、

/cosmoz.elf capture 49000000 trig=long ch=x45 pre=1000000 file=file.dat

と入力します。

49000000が記録データ数で、pre=1000000がプレトリガデータ数を示しています。

この機能がどういう用途を想定しているかというと、たとえば自然現象など、いつ起きるかわからないイベントを24時間365日監視して、その前後の情報が必要になる場合です。

雷の波形の観測とかにも使えるかもしれません。

| | コメント (0)

2015.06.21

FPGAや回路設計をしてくれるスタッフ(社員・アルバイト)募集しています

特殊電子回路では、一緒に働いていただけるスタッフを募集しています。

募集人数は2~3人です。

今、特殊電子回路㈱では、いろいろな研究所や大学からたくさんの物理計測関係の仕事をいただいていて、慢性的に人手不足です。

一例を挙げると、

  • 量子コンピュータのレーザ制御用と思われるADC/DAC
  • 宇宙線検出のためのFPGAの回路設計とファームウェア開発
  • 重粒子線の被ばく量の測定装置
  • 新しい材質の半導体の物性測定のためのADC
  • 某加速器で使われるテスト用治具
  • 潜水艦・・

案件の内容は、具体的な研究所がわからないようにカモフラージュしていますが、このような内容の仕事の引き合いがたくさんあります。

本当は全部受注したいのですが、全部受注してしまうと弊社の処理能力をオーバーしてしまいます。

そこで、少しでも手伝ってくれる人がいると、とても助かります。

仕事の内容は、回路を設計し、基板を設計し、FPGAを設計し、ソフトウェアを開発し・・という普通の内容なのですが、もちろん、全部できなくても構いません。一部分だけでもやってくれると助かります。

まずは、やりたいことやできることなど、お話しを聞いて回路設計ができるのか、FPGAが設計できるのか、ソフトウェアを開発できるのか、それともMITOUJTAGの開発をしてくれるのか、どんな仕事をお任せできるかを考えたいと思います。

では、どういう人を希望しているかというと、

アルバイトさんは、

  • 大学生・大学院生で、物理が好きな人
  • 大学生・大学院生で、FPGAをガリガリやりたい・学びたい人
  • 大学生・大学院生で、計測制御用のソフトを作ってみたい人

という人です。とにかく、明るくて勉強する気がある人であって、自分で何かFPGAとか、マイコンでオリジナルなものを作ったことがあれば大歓迎です。

Kyujin_banner

正社員・契約社員は、

  • 大学院時代に、研究よりも装置を作っている方が好きだったという人
  • 非常勤の職員を繰り返していて、そろそろ落ち着きたい
  • 新卒で普通にどこかの会社に就職したけど、自分のやりたいことじゃないと思って2~3年で辞めて、本当に打ち込める仕事を探している人
  • 電子回路関係の仕事をしたいという気持ちと実力は人一倍あるのだけれども、様々な事情により一度現場を離れてしまった。少しずつ復帰していきたいという方

これらの条件はORです。1つでも当てはまる人はぜひ、特電で一緒に働いてください。

正社員・契約社員は人生がかかってくるので、まずはメールなり直接会っていろいろお話しましょう。

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

決して急ぎはしません。急いで募集するとたいてい良い結果にならないからです。

緩~く、長い期間で募集しますので、我こそはと思う人は是非、お話しだけでもしてください。

| | コメント (3)

2015.06.20

Kintex-7でDDR3 SD-DIMMを使う

いま受託でやっている仕事で、Kintex-7にDDR3のSO-DIMMをつないで読み書きしようとしています。

ISEとCoreGenの環境でやっているのですが、なかなかうまく動いてくれません。

CoreGenでSODIMMを選択すると、なぜか最後までインプリメントが通らないで、とりあえず単一のDDR3メモリを選択して、SODIMMの8分の1だけ動かそうとしています。

まず最初の設定画面。AXI4を選択しておきます。

AXI4を使わないapp何とかという信号を操作する使い方だと、最高性能が出せるけどポートは1つだし自分でユーザクロックとの同期とかしなければならず、面倒です。

AXI4にするとその辺の面倒なことは全部コアがやってくれます。

K7ddr3_1

次。ここが肝心。

まず、ここで設定する速度はDDR3メモリに行くクロックの速度。ここで800MHzと指定したらDDRのレートはクロックの倍の1600Mb/sになります。とりあえず控えめの500MHzにしました。これならDDRメモリのレートは1Gb/sになるはず。

4:1という設定は重要ですが、このままにしておきます。

K7ddr3_2

その次の設定画面。

データバスの幅はDDR3メモリの幅の8倍だから、これでよい。この画面では特に変更なし。

K7ddr3_3

次の設定画面。ここが超重要!

Input Clock Periodというのは、おそらくコアのsys_clkのクロックのことですが、これをメモリクロックの4分の1にします。4分の1というのは、前の設定で4:1にしたから。

DDRのレートはクロックの倍だから、メモリの速度が1000Mb/sなら、ユーザインタフェースの速度は8分の1になって、データバスは8倍の幅になる、と考えるとつじつまが合います。

この関係をstrictに保たないと、何だかAXIコアが途中で止まってしまうようです。

(AXIコアが途中で止まるという現象で2週間ほど悩みました)

それ以外の設定は特に変更なし。

K7ddr3_4

その次の設定も重要。ClockをNoBufferにしたのは、自分で作ったデザインの中にあるMMCMからクロックを供給するためです。基板上のオシレータからMRCCのピンを通して直接MIGのコアに入れるならば設定は変わってくるでしょう。

IO Power ReductionはOFFにすると、エラーが出て途中で止まる。

XADCを使うと、FPGAの温度を測って、再キャリブレーションとかデータアイの中央に合わせるだとか、そういうことをやってくれるらしい。でも、現在の基板でXADCはVREFPをGNDにつないでしまったのでXADCが使えないので、これはOFFにする。

※XADCをDisableにすると、device_temp_iという信号を自分で与えなければならなくなる。とりあえず2509という数値を12bitで与えることにしている。これは40℃前後を示す値だったはず。

K7ddr3_5

インプリメントするときは、こんな感じ。

	inst_axi_ddr : axi_ddr3 port map (
		ddr3_dq         => ddr3_dq,
		ddr3_dqs_n      => ddr3_dqs_n,
		ddr3_dqs_p      => ddr3_dqs_p,
	-- Outputs
		ddr3_addr       => ddr3_addr,
		ddr3_ba         => ddr3_ba,
		ddr3_ras_n      => ddr3_ras_n,
		ddr3_cas_n      => ddr3_cas_n,
		ddr3_we_n       => ddr3_we_n,
		ddr3_cs_n       => ddr3_cs_n,
		ddr3_reset_n    => ddr3_reset_n,
		ddr3_ck_p       => ddr3_ck_p,
		ddr3_ck_n       => ddr3_ck_n,
		ddr3_cke        => ddr3_cke,
		ddr3_dm         => ddr3_dm,
		ddr3_odt        => ddr3_odt,
	-- Inputs
	-- Single-ended system clock
        sys_clk_i       => clk125m,
        clk_ref_i       => clk200m,        
		ui_clk          => ui_clk,
		ui_clk_sync_rst => ui_clk_sync_rst,
        mmcm_locked     => mmcm_locked,
		aresetn         => aresetn,
		app_sr_req      => app_sr_req,
		app_sr_active   => app_sr_active,
		app_ref_req     => app_ref_req,
		app_ref_ack     => app_ref_ack,
		app_zq_req      => app_zq_req,
		app_zq_ack      => app_zq_ack,
	-- Slave Interface Write Address Ports
		s_axi_awid      => ddr_axi_awid,
		s_axi_awaddr    => ddr_axi_awaddr,
		s_axi_awlen     => ddr_axi_awlen,
		s_axi_awsize    => ddr_axi_awsize,
		s_axi_awburst   => ddr_axi_awburst,
		s_axi_awlock    => ddr_axi_awlock,
		s_axi_awcache   => ddr_axi_awcache,
		s_axi_awprot    => ddr_axi_awprot,
		s_axi_awqos     => ddr_axi_awqos,
		s_axi_awvalid   => ddr_axi_awvalid,
		s_axi_awready   => ddr_axi_awready,
	-- Slave Interface Write Data Ports
		s_axi_wdata     => ddr_axi_wdata,
		s_axi_wstrb     => ddr_axi_wstrb,
		s_axi_wlast     => ddr_axi_wlast,
		s_axi_wvalid    => ddr_axi_wvalid,
		s_axi_wready    => ddr_axi_wready,
	-- Slave Interface Write Response Ports
		s_axi_bready    => ddr_axi_bready,
		s_axi_bid       => ddr_axi_bid,
		s_axi_bresp     => ddr_axi_bresp,
		s_axi_bvalid    => ddr_axi_bvalid,
	-- Slave Interface Read Address Ports
		s_axi_arid      => ddr_axi_arid,
		s_axi_araddr    => ddr_axi_araddr,
		s_axi_arlen     => ddr_axi_arlen,
		s_axi_arsize    => ddr_axi_arsize,
		s_axi_arburst   => ddr_axi_arburst,
		s_axi_arlock    => ddr_axi_arlock,
		s_axi_arcache   => ddr_axi_arcache,
		s_axi_arprot    => ddr_axi_arprot,
		s_axi_arqos     => ddr_axi_arqos,
		s_axi_arvalid   => ddr_axi_arvalid,
		s_axi_arready   => ddr_axi_arready,
	-- Slave Interface Read Data Ports
		s_axi_rready    => ddr_axi_rready,
		s_axi_rid       => ddr_axi_rid,
		s_axi_rdata     => ddr_axi_rdata,
		s_axi_rresp     => ddr_axi_rresp,
		s_axi_rlast     => ddr_axi_rlast,
		s_axi_rvalid    => ddr_axi_rvalid,
		
	-- System reset - Default polarity of sys_rst pin is Active Low.
	-- System reset polarity will change based on the option 
	-- selected in GUI.
		init_calib_complete => init_calib_complete,
		device_temp_i       => conv_std_logic_vector(2509,12),
		sys_rst             => sys_rst_n
	);

リセットが2つありますよね。sys_rst_nは、コアのリセット。aresetnはAXIのリセットです。

sys_rst_nを解除してからしばらく(16クロックでいいという話があるが、私はms単位待たせている)経ってからaresetnを解除します。

クロックはui_clk。ユーザ側ステートマシンはui_clkで動くようにする。ui_clkの速度は、メモリクロックの4分の1。つまり、↑の設定では125MHzになります。

これで何とかDDR3メモリが動くようになりました。

Kintex_ddr3

でも、XORSHIFTを使って作った乱数を読み書きしてみると、たまにリードエラーが発生しています。

K7ddr3_6

よく見ると、バースト的にエラーが発生していて、以下の特徴があります。

  • AXIの次のバーストサイクルにはエラーを持ち越していない。直っている。
  • リフレッシュと関係がありそう
  • XORSHIFTはずれていない。つまり、AXIのRVALIDやWREADY,WVALIDなどの問題ではない

K7ddr3_7

書き込むアドレスが、AXIコアの中で変わってしまっているのかもしれません。

まだまだ道は長そうです。

◆追伸

続きはメーリングリストで流しました

| | コメント (0)

2015.06.19

持ち運び便利なミューオン検出器

プラスチックシンチレータとフォトマル、そしてデータ処理用のCosmo-Zを1つのチューブに入れています。

2つのプラスチックシンチレータが同時に信号を出せば、その方向から飛んできたということがわかるというものです。

そこで、内径90mm、長さ600mmのアクリルのパイプを買ってきて、中にフォトマルの筒を入れ、真ん中にCosmo-Zのデータ処理装置を置きます。

Csztube_1

中心部はこんな感じ。真ん中にZYNQがいます。

Csztube_2

ここまでやって、帰りの時間になったので家に持ち帰って続き。

アクリルチューブ1本にまとめた結果、可搬性がよくなりました。これなら自転車で持って帰れます。途中でパトカーに遭遇しましたが、職務質問されることもなく、自転車のかごに入れて持ち運んでいても問題なしでした。

電気系統の配線を行いました。ACアダプタ1つで動きます。

Csztube_3

では、実験開始。

Csztube_4

ちゃんと、ミューオンだか何だかのパルスが見えてきました。

Csztube_5


ただ、直径80mm程度のプラスチックシンチレータを20cm離れた距離に置いているので、同時に光る頻度はそれほど多くないように感じます。(立体角計算しろ!>>自分)

| | コメント (0)

2015.06.18

Cosmo-Zとフォトマルをチューブに入れる

Cosmo-Zとフォトマルを長さ60cm、直径9cmのチューブに入れてみました。

Pmttube


USSボイジャーのワープコアみたいで、なかなかいい感じです。

静電気が少し心配ですが、こすらなければよいのでしょう。

来週中には、これを背中に担いで、地下鉄の駅へミューオンを測りにいってきます。

| | コメント (0)

2015.06.17

特電のWebサイトを更新しました

特電のWebサイトを大規模に更新しました。

まずは、更新前のサイトをご覧ください。

Webpage05

↑本当にひどいページですね

これは、今年の5月にどこぞのコンサル会社のページをまねて、澄ました感じのトップページにしたのですが、それが大間違いでした。

すっきりしていたほうがいいだろうと思って、トップページに、JTAG、計測関連製品、FPGAボード、設計サービスの4つのカテゴリのボタンを置いて、その下に製品ごとの細かいジャンプページを置きました。

その結果、目的の製品にたどり着けない、という失敗の典型例でした。アクセスは下がる一方でした。

すかした感じで綺麗にしても、ダメ。

Webコンサル会社や、人材紹介会社のように、扱うサービスが1~2種類なサービス業というところを真似たのが失敗の原因でした。業種に応じて最適なトップページの構造も相当に違うものです。

そこで、作り直したのが現在のページです。

中で誰かが活動していることを思わせるような活き活きとしたデザインにしました。

どんな製品を扱っているのか、どんなスタッフがいるのか、そういうことがトップページの中だけでわかるようにしました。また、このブログの更新情報も自動的に「社長ブログ」の欄に出るようにし、動的な更新がされるようにしました。

新しくなった特殊電子回路株式会社のWebサイトにどうぞお越しください。

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

Webpage06

| | コメント (0)

2015.06.16

PCI Express & FPGA 光リンクボードの設計(3)

今日もスタッフの せもぽぬめ さんが、Artix-7の乗ったPCI Expressボードを設計してくれています。

回路CADを初めて触って、4日目でここまで来たというのはすごいと思います。

Np1078_1

スペックもだいたい固まってきて、

  • FPGAはXC7A100T-2FGG484C
  • SFP+のモジュールを2個搭載 (3Gbps)
  • PCI Express Gen2 ×1
  • SATA I/II/IIIを1ch
  • USB3.0
  • DDR3メモリ 256MBくらい
  • ピンヘッダでGPIOを60本
  • 5V単一電源で動作
  • 汎用入出力の同軸コネクタを4本(ECL規格)
  • 真ん中で折れば、PCI Expressのロープロファイルに納まる。

というものです。

Artix-7だから、作ればすぐに動きます。難しいことを考えなくても大丈夫です。

ZYNQではないので、ソフトウェアは必要なく、純粋な回路だけで動きます。

パターンを引くにはあと2週間くらいかかるかなと思います。

| | コメント (0)

2015.06.15

Cosmo-Zのパルス計測機能を開発

最近、地震や火山の噴火が多いですよね。Cosmo-Zはミューオンを使って地面の中を観るための装置なので、早く現場で使っていただけるよう、開発を急いでいます。

本日、ついに大きな進歩がありました。

Cosmo-Zにパルス計測機能を付けたのです。

いままではただのオシロのように、波形を波形のままログするだけでした。これだと毎秒100MBでサンプリングしていると、すぐにメモリもバッファもいっぱいになってしまいますので、イベントが発生したときだけ記録する、あるいは発生したイベントの特徴だけを記録していくようなモードが求められていました。

 

 

そこで、パルス波形の情報をパケット化することにしました。

Cosmoz_pls_packet

 

次の図をご覧ください。これは、光電子増倍管からの波形を重ね合わせて描いたものです。光電子増倍管からの波形は負のパルスで、数μ秒で減衰する波形なのですが、大きいものや小さいもの、いろいろな軌跡があります。

Cosmoz_plsview


 

これを重ね合わせて描いてみると濃いところや薄いところが見えてきます。

パルスの大きさは完全なランダムなのではなく、何らかの理由があるからです。

そこで、横軸に「パルスの高さ」を、縦軸に「発生した頻度」を取ってヒストグラムを作ってみました。

Plshcount0

ちょっと左側の部分を拡大してみます。

Plshcount

このようにスペクトラムが得られました。

現在はまだスペクトラムの描画はPCでやっていますが、ZYNQのARMでもできるはずです。次はスペクトラムの描画までZYNQにやらせたいと思います。

| | コメント (0)

2015.06.12

回路マンガ「おれデバ ~俺のデバッグが・・」を更新しました

本日、回路マンガ「おれデバ ~俺のデバッグが・・」を更新しました。

FPGAが乗った動かないボードを、はたして動くようにできるでしょうか?

↓のページで全編読むことができます。

http://www.tokudenkairo.co.jp/manga/index.html

Oredebug_008

お楽しみに!

| | コメント (0)

2015.06.11

PCI Express & FPGA 光リンクボードの設計(2)

特電スタッフの せもぽぬめ さんが、Artix-7の乗ったPCI Expressボードを設計してくれています。

Expartix7

↑Artix-7版、PCI Expressボード

このボードは当初、Artix-7のGTP搭載版で作ろうとしていて、

  • 「SFPが10Gbps対応だから、Artix-7よりKintexのほうがいいよね」
  • 「Kintex乗せるんだからZYNQのほうがいいよね」
  • 「ZYNQ乗せるんだったら、GigabitEtherとLinuxも乗せなきゃ」

と際限なく拡大していったのですが、やはり、PCI ExpressからSFP(光ファイバのモジュール)にデータを送出できるというお客様からの要求を、満たすことに注力することにしました。

この基板にはどんな特徴があるかというと、同軸ケーブルが4つあってLEMOコネクタが乗っていることです。LEMOコネクタからはECLの信号が出てきます。

早い話が、素粒子物理学の研究室向けです。

一応、ZYNQで考えていたときの基板の図面とレイアウトを乗せておきます。PCI Expressの形状の基板にCosmo-Zのコア部分をコピペしてきただけです。ちょっとスペックがオーバーすぎるので、やめました。

Expzynq

↑ZYNQ版、PCI Expressボード

| | コメント (0)

2015.06.04

回路マンガ「おれデバ」を公開しました

回路マンガ「路マンガ ~ 俺のデバッグがこんなに簡単なわけがない ~ 」を公開しました

Oredebug

回路設計の楽しさや苦しさをマンガで表現していきたいと思います。

「おれデバ」のこちら↓のページから見られます。

http://www.tokudenkairo.co.jp/manga/index.html

お楽しみに!

| | コメント (0)

2015.06.02

Cosmo-ZのSATA開発

Cosmo-ZのSATAが動くようにと開発しています。

Spartan-6LXTの時に作ったSATAコアがあるので、その物理層部分をGTXに置き換えてみたのですが、どうもうまく動きません。GTXをSATA1の1.5Gbpsで動かそうと、QPLLを使ったりCPLLを使ったりしているのですが、どうにもうまく動かないのです。

具体的に言うと、受信したデータが化け化け。

Spartan-6のGTPのときは、COMRESET→COMWAKEというOOB(信号の有無を使って情報を伝達する)の手順の後で、D10.2が安定して見えていたのですが・・

Sata_1

ZYNQの7Z030(Kintex-7)で、ラインレート1.5Gbpsの設定でやってみると・・

Sata_2_3

何か汚い。

COMWAKEやCOMINITは受信できているけど、その後、rxerrorがずっとバタバタしていたりcdrlockがふらふらしていたり、CDRがちゃんとロックしていない感じがするのです。

XILINXのアンサーを見ていたら、「7 シリーズ FPGA GTX/GTH トランシーバー - SATA Gen 1、Gen 2、Gen 3 の最適パフォーマンスを得るための推奨事項および設定 http://japan.xilinx.com/support/answers/53364.html

というのがありました。

SATAはスペクトラム拡散をしているので、RXOUT_DIVという値をCoreGeneratorが生成した値から、下記の表の値に直せというものです。

  • SATA3(6G)・・・ RXOUT_DIV=1, RXCDR_CFG=72'h03_8000_8BFF_1020_0010
  • SATA2(3G)・・・ RXOUT_DIV=1, RXCDR_CFG=72'h03_8800_8BFF_4020_0008
  • SATA1(1.5G)・・・ RXOUT_DIV=1, RXCDR_CFG=72'h03_8000_8BFF_4010_0008

これを変更する箇所は、ipcore_dir/sataphy_gt.vhdの368行目付近にあるようです。(※sataphyというのはCoreGenで自分で付けた名前)

RXCDR_CFG =>  (x"0380008BFF40100008"),

この変更を行ってみると、心なしか安定したような気もしますが、あまり変わっていないような気もします。

Sata_3_2

リンクはアップしたり、しなかったりです。

次の図は、デバイスがALIGNを送ってきて、ホストがD10.2を送っていた段階から、次のホストがALIGNを送るところです。

Sata_4

このときもまだcdrlockがバタバタしています。xrdyが送られてくることはあるのですが、その後のwtrmがなかったり、不正なプリミティブが来たり、極めて不安定な感じでした。

Sata_5


こんな感じで行き詰まっていたのですが、ためしにPLLとGTXの設定を3.0Gbpsにしてみました。すると、なんということでしょう!

最初のCOMINITとCOMEAKEから綺麗です。

Sata_6


今までの苦労が嘘みたいにリンクアップはするし、XRDYも普通に来るではないですか!

Sata_7

もちろん、最初のD2Hパケットもちゃんと受信でき、ホストから送るソフトリセットも認識されたようです。

3Gbpsよりも1.5Gbpsのほうが難しいってどういうことでしょう。受信イコライザや送信のエンファシスの問題か、それともSATAはリンクアップのときに、デバイスはまず3GbpsでリンクアップしようとしてALIGNを送ってくるからかもしれません。

つまり、1.5Gbpsにコンフィグした状態でCDR(クロック・データ・リカバリ)ユニットが3GbpsのALIGNを受け取るとおかしくなるとか。

まとめると、

  • CDRがSpartan-6とだいぶん違いそうだ
  • RXELECIDLEだけじゃなく、何か別の信号もいろいろ使って、CDRRESETとRXCDRHOLDを動かさなければならないのかもしれない。
  • なぜか1.5Gbpsでは安定しない。3.0Gのほうが安定する
  • イコライザはDFE AUTOでよく、受信終端電圧は600mVでよい
  • クロックコレクションは自分でやるから特にいらない

です。

とりあえず、リセット関係の再点検と、イコライザレベル・電圧振幅などをデータシート上でチェックし、それでもダメなら工業試験場に行って高速オシロを使わせてもらって波形を見てこようと思います。

| | コメント (0)

« 2015年5月 | トップページ | 2015年7月 »