« 2017年4月 | トップページ

2017.05.28

セキュリティキャンプへ応募を検討している皆様へ

セキュリティキャンプの応募締め切りまであと1日弱ですね。順調に進んでいますか?

なひたふは、講師の一人として参加させていただきます。

さて、私が学生の頃にはセキュリティキャンプというのはなく、存在自体を知りませんでした。最初に打診が来たときに何それ?という感じでした。

そんな私に話が来たのですが、ここだけの話、私は昔はネットワークエンジニアだったのです。官公庁や一般企業向けにLAN/WANの再構築の提案したり、某社で原発ネットの回線移行やったり・・。そんな時期が2年くらいありました。今ではいい思い出です。資格としては線路主任技術者とか第一種伝送交換主任技術者とか持ってます。

テーマを考えるときに、セキュリティで、FPGAでネットワーク系で何か面白いこと・・・と悩んでいて、そのときとっさに考えた「DoS攻撃用FPGA」というテーマでそのまま行ってしまいました。

sun

私は平和主義者なので、本当にDoS攻撃がやりたいわけじゃなくて、FPGAの動作原理や、なぜ高速に動作できるのか、パケットの作り方などを学んでいただくためにこの講座を準備しています。

FPGAが本気を出したらパソコンには真似できない「応答時間」と「頻度」でパケットを出せるはず。ギガビットイーサくらいならパソコンでもできるでしょうが、10GイーサはさすがにFPGAじゃなければワイヤ速度は出ないんじゃないでしょうか。

そういうことで、特殊電子回路㈱にインターンで来てくれている学生さんにも手伝ってもらって、ギガビットイーサや、10GイーサのFPGAを開発しています。

そういうわけで、下の写真のような10Gイーサ用スイッチングハブを買ってしまいました。

Ethfpga1

1Gのイーサは、FPGAのGTXから出せるよう、SFPからメタルのケーブルへ出すモジュールで、10GのイーサはSFP+の光モジュールで作ります。

今のところ、ARPを全力で投げるFPGAができています。

Ethfpga2

Ethfpga3

FPGA内部の波形を見てみると、1クロックの無駄もなく帯域を使い切っているのがわかります。ARPを全力で投げると、回線の帯域の50%を使い切ります。

ARPを投げるだけでなく、「すべてのARPに『オレオレ』と返事をする」ハードウェアがつながっていたら、それだけでネットワークは麻痺してしまうでしょう。そして、それは簡単に作れます。

パケットが多くなると、ルータが落ちるか、スイッチングハブが落ちるか、何が起きるかわかりません。外にだすといろいろまずいので、閉じたネットワークの中で実験しましょう。

実際に、15年くらい前に数百万円するL3スイッチでもパケットが多くなると落ちるというのはありました。

そういう攻撃用のFPGAを作るのが目的ではなくて、FPGAの勉強と、ワイヤ速度で動作するネットワーク機器を作るのが目的です。

sun

とはいっても、4時間の講義の間にすべてを教えるのは不可能です。きっとVivadoのインストールだけで4時間はあっという間に過ぎてしまいます。

そのため、私の講義では、あらかじめ数か月前に、XILINXのZyboという評価ボードをお渡しします。また、上記で紹介した「ギガビットイーサのパケットが出せる汎用的なFPGAのサンプルデザイン」をお渡しします。

Zybo

これらを使って、何か好きなものを作ってきてください。NTPサーバとか、DNSとか、PING発生器とか、ARP横取りとか、なんでもいいです。もちろん攻撃用ではなく防御用でも構いません。

作り方で困ったら、私がメールやTwitter等でサポートします。

セキュリティキャンプの2日目の朝、みんなで持ち寄って、見せ合いましょう!

私の講義は、キャンプが始まる前の事前課題がメインです。

そんなコースに興味があれば、ぜひともB-2、「DoS攻撃用FPGAをつくろう」を選択してくださいね。ご応募まってます!

| | コメント (0)

2017.05.27

TIのフォーラムにADS54J60のことを投稿してみた

1Gspsの高速ADC「ADS54J60」で得られた出力コードのヒストグラムが櫛形になるので、TIのフォーラムに質問を投げてみました。

質問内容はだいたいこんな感じです。


以下のようなボードを作った。JESD204Bはうまくいっている。

Myboard

入力をゼロにしたときのヒストグラムが4個の1個の櫛形になってしまう。

Histogram

ADS54J60のデータシートのFig60によると、データパスが14bitと書かれている。このADCは14bitの精度しかないということはないか?

Fig60

なお、設定条件は、LMFS=4211、K=16、N=5、SYSREF=1.953125MHz ( = 1GHz / 32 / 16)である。


というものでした。

すると、TIのエンジニアから返事が来ました。

fig60は誤植であって本当は16bitある。DCオフセットエンジンの働きによってDCレベルを自動的に調整しようとするため、このような結果になる。添付の資料を読んでDC補正を無効にしてみてくれ。

という内容でした。

DC補正というのはデータシートには載っていない内容で、つまり、

  • 1GspsのADCは、250MHzサンプリングのADCコアを4つ並べて作っている
  • 4つのADCコアのDCレベルが異なるとfs/4やfs/2のところでスプリアスが出る
  • そうならないように4つのADCのオフセットを自動的に調整している

ということだそうです。添付資料にはデータシートには載っていないレジスタ設定が書かれていました。

裏レジスタ キタ━━━━(゚∀゚)━━━━!!

せっかく教えてもらったので、補正をわざとずらしたり無効にしたりしてみたのですが、どうもこれも違うようです。

もし、DC補正の問題であれば、時間軸でみて

↑___↑___↑___↑___↑___

みたいな櫛形になるはずで、私が困っているヒストグラムでの櫛形にはならないでしょう。いろいろレジスタをいじってみて、教えてもらったDC補正とは関係ないという結論に達しました。

そこで、次の質問を投げました。


DC補正の動作は理解したし、テストしたが正しく動いていた。私の関心ごとは時間軸で櫛形になることではなく、ヒストグラムがくし形になることだ。

DC補正の実験を通じて大きなヒントを得た。各チャネル4つのADCコアをA1 A2 A3 A4 B1 B2 B3 B4と呼ぶことにする。

Adcs

8つのADCコアでそれぞれのヒストグラムを作ってみた。

8core

このうち、A1とB1、つまり先頭のコアとそれ以外に分けてみる。

先頭の2つのコアのヒストグラムを見るとLSBが"01"になっている値しか出ていないので櫛形になっている。14bitの精度しかない。

2core

残りの6つのコアは16bitの精度があるヒストグラムになっている。

6cores

なぜ先頭の2つのADCコアだけ分解能が低いのか?

という内容でした。

つまり、4つのADCコアのうちの1個が14bit精度しかないから、全部をくっつけてヒストグラムをとると櫛形になってしまいます。稀に15bitになる場合もありますが、14bitしか出ないことのほうが多いようです。

まだ回答はありません。きっと月曜日の夜に来るでしょう。

| | コメント (0)

2017.05.25

1GspsのADCボード「HyperFADC」で綺麗に波形が取れた!

ようやく、1GspsのADCボード「HyperFADC」で波形が取れるようになりました!

改良に改良を重ね、もはや原型をとどめなくなってしまったHyperFADCボードですが、・・・

Hyadc1

ファンクションジェネレータから、1MHz、約0.9Vppの信号を入れてあげたら、ついに、綺麗な正弦波を得ることができました。

Hfadc3

ここまで到達するのに、いったいどれだけの時間と苦労がかかったことでしょう。

FFT解析をしてみると、250MHz,300MHz,350Mhz,400MHzのあたりに何かいますが、

Hfadc4_3

1MHzの正弦波の高調波ではないようです。

Hfadc5_4

このボードには50MHzの水晶発振器が乗っているので、その高調波が見えているのかもしれません。

さて、1GHzサンプリングのADCに1MHzを入れると、上の図のようにスペクトラムのすそ野が広がってしまって、鋭いピークとして見ることができません。

そこで、もうすこし良いシグナルジェネレータを使って48.828125MHzの正弦波を入れることにしました。

Hyadc2

なぜこの周波数かというと、1GHzでサンプリングした波形を16384ポイントのFFTで解析すると、周波数分解能は1000MHz/16384=61.03515625kHzになります。

そもそも、なぜスペクトラムの裾が広がるかというと、時間軸で区切った区間の最初と最後が連続していないからです。普通はここで窓関数とかを使うのですが、窓関数を使うとゲインは減るし、本当の波形ではなくなってしまいます。

そこで、この61.03515625kHzの整数倍の周波数の波形を入れれば、波形の周期とFFTで切り出した区間の周期がぴたりと整数倍になるので、裾が広がらなくなるのです。

そこで、61.03515625kHzの800倍である48828.125MHzを選んだ結果、非常に綺麗なスペクトラムが得られるようになりました。

Hfadc6

基本波-6dBくらいに対して、高調波が-60dBなので歪率は-54dBですが、ファンクションジェネレータの歪率もあまり良くないので、このボードが悪いのか信号源が悪いのかはわかりません。

気になるのは、50MHzの整数倍の周波数で出ている謎の高調波です。やはり基板上の水晶が悪いのかな・・と思います。

48MHz付近を拡大してみると、ちゃんと鋭いピークが見えています。少し広がっていますね。

Hfadc7

それから、今度は入力をオープンにして、波形を取ってみました。ホワイトノイズが見えています。

Hfadc8

1LSB=1.9V/32768なので、約58μVです。それが±200LSBくらい揺らいでいるので、±11mVの揺らぎとして見えています。

時系列でみていてもわからないので、ヒストグラムを取ってみました。すると、やはり櫛形になっていて、DNLがすごく悪いことがわかります。

Hfadc9

このADCは、なぜか4個に1個の範囲で大きな値が出るので、DNLが悪く、実質的には14bit程度の性能しかありません。

そこで4で割った値でヒストグラムを取ると、それなりに綺麗な形になりました。

これをガウシアンで目分量でフィットさせてみて、ノイズのσ=24LSBと推定できました。

Hfadc10

いまは14bit精度で使っているので、1LSB≒232μVとなるので、ノイズは2.28mVrmsと推定されました。最大入力900mVppの1G ADCボードでノイズが2.3mVですから、まあ許せる範囲じゃないかと思います。

ノイズを減らせられればもっと減らしたいところです。

| | コメント (0)

2017.05.23

18bit ADCボードのノイズはどこからくるのか

Cosmo-Zの18bit拡張ボードで、ノイズがどこからくるのかを調査しました。

このボードは、Cosmo-Zに装着する拡張ADボードで、Cosmo-Zを18bitのADCにするボードです。

18bit_ext

上の写真で、Cosmo-Zの下にあるボードで、5MHzサンプリングで8chというスペックです。可変ゲインアンプがのっていて、ゲインを1、10、100、1000倍と切り替えることができます。ゲイン1のときには±1.0Vの信号をAD変換してFPGAに入れることができます。

まず、何も入力しない状態でヒストグラムを取ってみますと、綺麗なガウス型が得られました。

18bit_ext1

ここから半値幅を出してみると、ノイズは約234μVという結果が得られました。

ちょっと大きいきがします。

このADCボードは下の図のような構成になっています。

18bit_ext2_2

このどこでノイズが発生しているのでしょうか。

まず、AD7960の入力をショートして、入力電圧を0にしてみました。

18bit_ext3

その結果が、下のヒストグラムです。

18bit_ext4

半値幅は3LSBで、ノイズは47μVということになります。

つまり、ADCのAD7960自体ではノイズは47μV程度しかありません。

OPアンプのどこかでノイズが発生していることがわかります。

次に2段目のTHS4521の入力をショートしてみました。

回路図でいうとこんな感じです。

18bit_ext6

ヒストグラムを見ると、

18bit_ext7

半値幅が5LSBで、ノイズが78μVに増えたことがわかります。

これをどう解釈すればよいかというと、AD変換器自体のノイズは78μVで、それにOPアンプで64μVのノイズが加わったと解釈できます。ノイズの和は二乗の和の平方根になるので、√(47×47 + 64×64)≒79μVとなるからです。

このOPアンプにはゲイン4を持たせているので、入力側で16μVのノイズが発生したと解釈できます。

OPアンプ自体で発生するノイズは4.6nV/√Hzで、約2.5MHzまでの帯域を増幅しているので7.3μV。OPアンプの帰還抵抗は5kΩで、生じる熱雑音は2.5MHzの帯域で14μV。

合わせて16μVになるので、ちょうど計算が合いました。

18bit_ext8

18bit ADC拡張ボードのノイズのほとんどは、AD8253から出ていることがわかります。

この話が合っているかどうかはわかりませんが、意外と、ノイズの大きさは計算できてしまうのですね。

| | コメント (0)

2017.05.22

1GADCボードの設計

Cosmo-Zの拡張用に、1Gs/sのADCボードを作っています

Np1094_1

ADCは、ADS54J60。TI社の16bit 2ch 1Gs/sのものです。

3時間ほどでここまで完成。

Np1094_2

あとは電源の配線かな。

今回はコストと電力と面積を抑えるためにArtixを選択したのですが、やはりKintexにしておけばよかったと後悔しています。

なぜなら、

  • Kintex-7だと、パスコン内蔵なので、FPGA裏のパスコンがほとんどいらない。
  • Kintex-7だとGTXが10Gbpsまで対応しているので4レーンで引ける。全チャネルのデータがJTAGロジアナで同時に見られる
  • Artix-7だと最大5Gbpsなので、2個使うことになる。これはこれで面倒。

ただ、Kintex-7は小さなパッケージのものがないので、狭いところに乗せるには不利かなと思います。

| | コメント (0)

2017.05.20

自社のベンダIDでXDMAに成功

Kintex-7のFPGAボード『Cosmo-K』にXILINXのPCI Express DMAコアを入れて、さらに自社ベンダIDに変更して動作させることができるようになりました。

まず、VivadoでXDMAのコアをIPカタログから持ってきて、置きます。

Xdma2_3

これだけでも動作しそうなのですが、PCI Expressのクロックは差動クロックでGTXに入ってくるので、IBUF_GTE2というプリミティブで普通のクロックに直してやらねばならないなど、いろいろあるので、RTLのモジュールを作ってそのなかに細かいロジックを入れます。

また、DMAを行うには、M_AXIのポートに何かのAXIスレーブがつながっていなければなりません。

そこで、AXI Block RAMをつなぐことにしました。私のVivadoではなぜかAXI Block RAMを直接置くことができなかったので、AXI BRAM Controllerを介して普通のBlock RAMを置きました。

最終的な出来上がったブロックデザインは下の図のとおりです。Xdma10_2

ここまでBRAMのサイズを指定する箇所がなかったのですが、Vivadoのアドレスエディタというツールで「0番地から1MByteに配置する」と書いてValidate Designを行うと、自動的にBRAMのサイズが1M Bytes(256個使用)と推論されるようです。

Xdma11_2

また、XDMAのコアでは、ベンダIDとデバイスID、それからクラスを変更しました。1BC8というのは特殊電子回路㈱のベンダIDで、110000というクラスは汎用のデジタル入出力装置を意味します。

Xdma12_2

できあがったBit Streamの書き込みはMITOUJTAGを使うと便利です。Cosmo-KにはUSB-JTAGが搭載されているので、MITOUJTAGをつなぐとすぐに認識されます。また、MITOUJTAGにはBit Streamが更新されたら書き込みを行うという機能があるので、論理合成が終了したら自動的に書き込まれます。

Xdma13_2

ベンダIDを変えたので今まで見たことのないデバイスとして認識されますが、XILINXのxdma.infの中を書き換えて、デジタル署名を施しただけのドライバでうまく認識されました。

Xdma14

xdma_info.exeツールを使えば内部のレジスタなどが見えるし、

Xdma9

もちろん、DMA転送のテストプログラムも動きました。

Xdma1

8MByteを0.004952秒で転送しているので、1.6GByte/sec出ている計算になります。

あと、割り込みも動きました。

Xdma6

しかし問題はDMA以外に何かやりたいと思って、AXI LiteやAXI Bytessの、いわば予備の通信チャネルを有効にすると、途端にドライバがうまく動かなくなります。

下の図は、XDMAの設定画面ですが、BARsというところでAXI LiteやAXI Bytessを有効にできます。

Xdma5

AXI Liteを使えば、パソコンから1ワード単位でFPGA内に小さなトランザクションを発生させられるのでしょう。AXI Bypassを使えばFull AXIなトランザクションを発生させられるのでしょう。

しかし、これらを有効にすると、

Xdma7

このように、xdma_関係のツールは調子が悪くなります。

XILINXのXDMAは、デフォルトの状態ではBAR0にDMA用のコントロールレジスタが並んでいますが、Liteを有効にするとBAR1に移動してしまうからでしょうか。

Xdma8

というわけで、自社ベンダIDのPCI Expressデザインで、XILINXのXDMAを使うことには成功しました。

| | コメント (0)

2017.05.19

Kintex-7でのPCI Express DMA

インターンで来ている学生さんが、XILINXのDMAコアをCosmo-Kに実装して、PCI Express DMAの実験を行ってくれました。

Cosmo-Kというのは、Kintex-7を搭載したPCI Expressボードです。

1478579789_cosmok3_3

LinuxでDMAのベンチマークテストを行い、毎秒1.4GBytes~1.6Gbytesの転送ができることを確認できました。

C2h_2

H2c_2

詳しいやりかたは、Cosmo-Kの「Kintex-7でのPCI Express DMA」のページをご覧ください。

| | コメント (0)

2017.05.18

1G ADC「ADS54J60」のノイズ

1Gs/sのADC、「ADS54J60」で得られた波形をデコードしてみたところ、なぜか大きなノイズが乗っています。

Noise1

下の図は、200mVpp、100kHzの正弦波を入れてみたところです。

Noise2

もう正弦波の形をしていません。

どうやら、ADCが悪いのではなく、アナログのフロントエンドのアンプに原因があるようでした。オシロで見ても同じような形をしています。

| | コメント (0)

2017.05.12

復刻・Spartan-6 サンプルコード CD-ROM集

以前作った、Spartan-6 サンプルコード CD-ROM集の復刻版を作りました。

これは、ブログやJTAGひろば(旧会員制サイト)、Webサイトなどに分散していた各種のSpartan-6向けソースコードやアプリケーションのほか、特別なご依頼があった客様向けに作成したサンプルアプリなどを、1枚のCD-ROMに納めたものです。

S6smpl

その内容は、

  • Spartan-6とOV7670 CMOSイメージセンサを接続するためのサンプル回路
  • Spartan-6とMT9V031 CMOSイメージセンサを接続するためのサンプル回路
  • 汎用データ収集装置(16bit,166MHzでサンプリングしてDDR2メモリに貯め、USBで読みだす)回路
  • Spartan-6のIODELAY2機能を実験するためのサンプル回路
  • Spartan-6のDeviceDNA機能を実験するためのサンプル回路
  • Spartan-6のIOSERDESで1Gbpsの通信を行うためのサンプル回路
  • Spartan-6LXTのGTPでの通信実験(SATA)
  • Spartan-6のMCBを使ったDDR2メモリ実験回路
  • 当社製ソフトコアによるUSB-DDR2メモリ実験回路(サンプル・リファレンス・デザイン)
  • USB通信の単純なサンプル回路
  • Spartan-6とAD/DAコンバータを接続するデータ収集・計測回路
  • Spartan-6にMicroBlazeを内蔵して実験を行うためのサンプル回路
  • MATLABと接続してデータをキャプチャするための拡張ファイル
  • Microsoft Excelと接続してデータをキャプチャするためのVBAマクロ
  • デバイスドライバ (Windows2000/XP/Vista/7, 32bit/64bit)
  • Spartan-6用USB-JTAG書き込みツール (FPGAやROMにBitStreamを書き込む)
  • Windowsサンプルアプリケーション (USBを通じたDDR2メモリへのデータ転送)
  • ファームウェア更新ツール (万が一ファームウェアを消してしまった場合の復旧用)
  • ES品 回路図(TKDN-SP6-ES すべてのページ)
  • ES品 UCFファイル (TKDN-SP6-ES用 FPGAのピン定義)
  • ES品 基板ピン配置図(TKDN-SP6-ES用)
  • 量産版 Rev.A 回路図(TKDN-SP6-16/45 すべてのページ)
  • 量産版 Rev.B 回路図(TKDN-SP6-16/45 すべてのページ)
  • 量産版 UCFファイル (TKDN-SP6-16/45用 FPGAのピン定義)
  • 量産版 基板ピン配置図(TKDN-SP6-16/45用)
  • ボード寸法図

などです。

CD-ROMを挿入すると、自動的にメニューが立ち上がって、リンクをクリックするとその内容が見られるというしくみです。

Cdindex

なひたふJTAG日記のバックナンバーをご覧いただいたお客様から、このCD-ROMをご要望いただいたので、今回、復刻版として5枚程度作りました。

本日以降、特電オンラインショップから、Spartan-6ボードをお買い上げいただいたお客様に、先着5名様でこのCD-ROMをお付けしたいと思います。オンラインショップでのご注文の際に、備考欄に「CD-ROM希望」とお書き添えください。

在庫切れの場合はどうかご容赦ください。

| | コメント (0)

2017.05.11

1Gbps ADCの波形デコードに成功

ついに1Gs/s 16bit 2CHの高速ADC(TI社 ADS54J60)からのデータの受信ができるようになりました。

Csk_1g

使っているボードは、Cosmo-K+というKintex-7のPCI Expressボード。いまはPCI Expressには挿さずにスタンドアローンで動かしています。

ADCからのデータは、JESD204Bという規格で、10Gbps×4本で送られてきます。

1494561450_1g

トータルで40Gbpsの信号です。

この中にJESD204Bのデータが入っています。

何度かやってみると、毎回、4つあるGTXのフレームの先頭がずれるようですます。

次の図ではGTX1だけ1ワード遅れています。また、先頭にある11Cというコード(/R/)が2回見えています。

Zure1

GTXの中でチャネルボンディングとかしてうまく合わせられるはずなのですが、まだうまく行っていません。

とりあえず、このFPGA内蔵ロジアナで取り込んだデータをExcelにエクスポートしました。

Exp

これから解析ですよ。

16進に直して、Kコードを置換したり色を付けて見やすくします。

Kcode

/A//R//Q/で始まるILASフェーズが見えてきましたね。

トラ技によればILASフェースは14バイトとのことなのですが、上の解析データでは17バイトあります。これはSYSREFの周期の違いだそうで、後ろに無駄なデータが詰まっているだけなので問題はないようです。

データを見てみると、GTX1とGTX3は00とFFばかりです。つまり、AD変換結果の上位16bitなのでしょう。

Excelで各セルに

=MOD(HEX2DEC(K271)+HEX2DEC(P271)*255+32768,65536)-32768

みたいな式を書いて2つの16進数値を結合し、10進に直して、さらに時系列に並べます。

すると、生の波形が見えてきました。

Raw

これは入力に何もつながないときの波形です。ノイズのヒストグラムを取ってみます。

Hist

おお、釣り鐘型のヒストグラムが見えてきました。4つおきに大きな頻度になっているのはDNLが極端に悪いか、何かを間違っているためでしょう。

とりあえず、まだ波形は綺麗ではないのですが、何か正しそうなデータが受信できるようになりました。

あとは、弾性バッファを入れたり、チャネルボンディングとかをできるようにして、4つのGTXのフレームの先頭がぴったり合うようにしたいですね。

| | コメント (0)

2017.05.10

Ubuntu on ZYNQで今までのZYNQのプログラムが動くようにする

昨日の成果で、ZYNQでUbuntu Linuxが動くようになりました。

しかし、いままで使っていたcosmoz.elfを動かそうとしても、なぜか、No such file or directoryと言われてしまいます。

Zynq_cosmoz

うちのアルバイトさんが原因を究明してくれました。

ARMは浮動小数点のハードウェア演算モジュールを積んでいるか積んでいないかはそれぞれなので、ARM用のELFファイルでは浮動小数点の演算をshared libraryにしているようです。

ZYNQ搭載ADCボード「Cosmo-Z」のプログラムはXILINXのSDKで作っていますが、ZYNQのARMはハードウェア浮動小数点モジュールを積んでいるので、ハードウェア演算するようなshared libraryにリンクされているようです。

linaroのubuntuは浮動小数点演算をソフトウェアで行うようなshared libraryがリンクされるようになっていたので起動できず、No such file or directoryと言われるようになったのではないか、ということでした。

どう設定したのかはわかりませんが、shared libraryを使わずに、static libraryにしたらうまく動いたとのことでした。次回来た時にやり方を聞いてみることにします。

sun

それから、今までのCosmoZではZYNQ Linuxに入っているシンプルなWebサーバで動いていたのですが、今回からApache2に移行できることになりました。

Kanri

ApacheとはCGIの仕組みが違うようなので、まだ動的な部分は動きません。

これからの開発と移行が待ち望まれます。

| | コメント (0)

2017.05.09

ZYNQのLinuxをUbuntuにする

ZYNQ搭載のADCボード「Cosmo-Z」では、いままでXILINXのプレーンなLinuxを使っていました。

Cosmoz

プレーンなLinuxでも正しく動作していたのですが、いくつかの不満もありました。具体的には

  1. 全体的にコマンドが貧弱(基本的にbusybox)
  2. aptなどのツールを使って新しいパッケージを入れられない
  3. ApacheやPHPが動かない
  4. sambaが動かない

といったところです。

そこで、アルバイトさんに調査をしてもらって、ZYNQでUbuntuを動かす方法を考えてもらいました。

結論としては、

  1. プレーンなLinuxもubuntuもカーネルは同じ。ファイルシステムをごっそりとUbuntuのものにすれば、ubuntuになる
  2. Petalinuxは使わなくてよい
  3. デバイスツリーの一部修正が必要

ということのようでした。

実際には、下記のWebサイトを参考にして

http://marsee101.blog19.fc2.com/blog-entry-2818.html
https://keitetsu.blogspot.jp/2015/01/zyboubuntu.html

ほぼ同じ手順で起動用SDカードを作成したようです。以下、アルバイトさんの残したメモにしたがって書いていきます。

① パーティションを分けます。

sudo gparted /dev/sdb

Lin1

② 第二パーティションにubuntuのroot file systemだけを書き込みます。

https://releases.linaro.org/archive/12.11/ubuntu/precise-images/ からubuntu-desktopのlinaro-precise-ubuntu-desktop-20121124-560.tar.gzをダウンロード(nanoのほうを入れたら起動が早くなるかもしれない)

sudo tar --strip-components=3 -C /media/tkdn/ROOT_FS -xzpf linaro-precise-ubuntu-desktop-20121124-560.tar.gz binary/boot/filesystem.dir

③ 第一パーティションに入れるもの。

  • BOOT.bin (busyboxを起動したときと同じもの)
  • uImage (Linuxのカーネル)
  • devicetree.dtb

なお、DeviceTreeのbootargsに

"console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1";

を指定します。さらに、ここにmem=256Mと追加すれば、Linuxの認識するDRAM容量を制限できます。そうすると、Linuxからは後ろの768MBを認識しなくなるので、FPGAのPLから自由に使えます。

Cosmo-Zに特有の操作として、devicetree内のcpu0のプロパティoperating-pointを以下のように変更する必要があったようです。

前 : operating-points = <0xa2c2b 0xf4240 0x51616 0xf4240 0x3640f 0xf4240>;
後 : operating-points = <0xa2c2b 0xf4240 0x51616 0xf4240>;
  • uEnv.txt (u-bootが読み込む設定ファイル)
uenvcmd=fatload mmc 0 0x03000000 uImage && fatload mmc 0 0x02A00000 devicetree.dtb && bootm 0x03000000 - 0x02A00000

(u-Bootの設定で読み込むかどうかを変えられるが、Cosmozで使っているu-bootがどういう設定になっているかわからないので一応入れておく。)

このようにして作ったファイルシステムと設定ファイルで、Ubuntuが起動するようになりました。

sun

何より嬉しいのは、DHCPでIPアドレスを自動設定したあと、Windows PCから名前でCosmo-Zを探すことができるようになったことです。

Lin2

Cosmo-Zのような機器がDHCPで自動的に取得したアドレスをネットワーク内の他のマシンから知るには、一般的で簡単な方法はありません。(よく、ネットワークプリンタなどではUDPでブロードキャストする専用のネットワーク設定ツールがありますが、それと同じ理由です。)

ですが、Sambaが動けばNetBIOSで名前が解決できます。

Windows PCからは

ping cosmoz-ubuntu

と打つだけで名前解決できてしまいます。nbtstatで探すこともできます。

Lin3

Ubuntuが動くようになったので、早速apt-getでいろんなものを入れたくなります。

私はviは嫌いでemacsが好きなのですが、apt-getでさくっと入りました。便利ですね。

では最後に起動メッセージを

U-Boot 2014.07-00004-ga38e1e3-dirty (Jan 08 2015 - 00:30:24)

Board:  Xilinx Zynq
I2C:   ready
DRAM:  ECC disabled 256 MiB
MMC:   zynq_sdhci: 0
SF: Detected N25Q128A with page size 256 Bytes, erase size 64 KiB, total 16 MiB
*** Warning - bad CRC, using default environment

In:    serial
Out:   serial
Err:   serial
Net:   Gem.e000b000
Hit any key to stop autoboot:  0
Device: zynq_sdhci
Manufacturer ID: 74
OEM: 4a60
Name: SDU1
Tran Speed: 50000000
Rd Block Len: 512
SD version 3.0
High Capacity: Yes
Capacity: 30.2 GiB
Bus Width: 4-bit
reading uEnv.txt
115 bytes read in 8 ms (13.7 KiB/s)
Loaded environment from uEnv.txt
Importing environment from SD ...
Running uenvcmd ...
reading uImage
3451432 bytes read in 303 ms (10.9 MiB/s)
reading devicetree.dtb
7396 bytes read in 16 ms (451.2 KiB/s)
## Booting kernel from Legacy Image at 03000000 ...
   Image Name:   Linux-3.17.0-xilinx-00085-gde136
   Image Type:   ARM Linux Kernel Image (uncompressed)
   Data Size:    3451368 Bytes = 3.3 MiB
   Load Address: 00008000
   Entry Point:  00008000
   Verifying Checksum ... OK
## Flattened Device Tree blob at 02a00000
   Booting using the fdt blob at 0x2a00000
   Loading Kernel Image ... OK
   Loading Device Tree to 0ed1e000, end 0ed22ce3 ... OK

Starting kernel ...

Booting Linux on physical CPU 0x0
Linux version 3.17.0-xilinx-00085-gde13611 (naitou@ubuntu) (gcc version 4.7.2 (Sourcery CodeBench Lite 2012.09-104) ) #1 SMP PREEMPT Thu Jan 8 07:40:50 JST 2015
CPU: ARMv7 Processor [413fc090] revision 0 (ARMv7), cr=18c5387d
CPU: PIPT / VIPT nonaliasing data cache, VIPT aliasing instruction cache
Machine model: Tokuden Cosmo-Z
cma: Reserved 16 MiB at 0f000000
Memory policy: Data cache writealloc
PERCPU: Embedded 8 pages/cpu @4edd9000 s8768 r8192 d15808 u32768
Built 1 zonelists in Zone order, mobility grouping on.  Total pages: 65024
Kernel command line:  mem=256M console=ttyPS0,115200 root=/dev/mmcblk0p2 rw earlyprintk rootfstype=ext4 rootwait devtmpfs.mount=1
PID hash table entries: 1024 (order: 0, 4096 bytes)
Dentry cache hash table entries: 32768 (order: 5, 131072 bytes)
Inode-cache hash table entries: 16384 (order: 4, 65536 bytes)
Memory: 236376K/262144K available (4688K kernel code, 239K rwdata, 1592K rodata, 204K init, 210K bss, 25768K reserved, 0K highmem)
Virtual kernel memory layout:
    vector  : 0xffff0000 - 0xffff1000   (   4 kB)
    fixmap  : 0xffc00000 - 0xffe00000   (2048 kB)
    vmalloc : 0x50800000 - 0xff000000   (2792 MB)
    lowmem  : 0x40000000 - 0x50000000   ( 256 MB)
    pkmap   : 0x3fe00000 - 0x40000000   (   2 MB)
    modules : 0x3f000000 - 0x3fe00000   (  14 MB)
      .text : 0x40008000 - 0x4062a3b4   (6281 kB)
      .init : 0x4062b000 - 0x4065e240   ( 205 kB)
      .data : 0x40660000 - 0x4069be20   ( 240 kB)
       .bss : 0x4069be20 - 0x406d07ac   ( 211 kB)
Preemptible hierarchical RCU implementation.
        Dump stacks of tasks blocking RCU-preempt GP.
        RCU restricting CPUs from NR_CPUS=4 to nr_cpu_ids=2.
RCU: Adjusting geometry for rcu_fanout_leaf=16, nr_cpu_ids=2
NR_IRQS:16 nr_irqs:16 16
L2C: platform provided aux values match the hardware, so have no effect.  Please remove them.
L2C-310 erratum 769419 enabled
L2C-310 enabling early BRESP for Cortex-A9
L2C-310 full line of zeros enabled for Cortex-A9
L2C-310 ID prefetch enabled, offset 1 lines
L2C-310 dynamic clock gating enabled, standby mode enabled
L2C-310 cache controller enabled, 8 ways, 512 kB
L2C-310: CACHE_ID 0x410000c8, AUX_CTRL 0x76360001
ps7-slcr mapped to 50804000
zynq_clock_init: clkc starts at 50804100
Zynq clock init
sched_clock: 64 bits at 333MHz, resolution 3ns, wraps every 3298534883328ns
ps7-ttc #0 at 50806000, irq=43
Console: colour dummy device 80x30
Calibrating delay loop... 1332.01 BogoMIPS (lpj=6660096)
pid_max: default: 32768 minimum: 301
Mount-cache hash table entries: 1024 (order: 0, 4096 bytes)
Mountpoint-cache hash table entries: 1024 (order: 0, 4096 bytes)
CPU: Testing write buffer coherency: ok
CPU0: thread -1, cpu 0, socket 0, mpidr 80000000
Setting up static identity map for 0x46ca18 - 0x46ca70
CPU1: Booted secondary processor
CPU1: thread -1, cpu 1, socket 0, mpidr 80000001
Brought up 2 CPUs
SMP: Total of 2 processors activated.
CPU: All CPU(s) started in SVC mode.
devtmpfs: initialized
VFP support v0.3: implementor 41 architecture 3 part 30 variant 9 rev 4
regulator-dummy: no parameters
NET: Registered protocol family 16
DMA: preallocated 256 KiB pool for atomic coherent allocations
cpuidle: using governor ladder
cpuidle: using governor menu
hw-breakpoint: found 5 (+1 reserved) breakpoint and 1 watchpoint registers.
hw-breakpoint: maximum watchpoint size is 4 bytes.
zynq-ocm f800c000.ps7-ocmc: ZYNQ OCM pool: 256 KiB @ 0x50880000
vgaarb: loaded
SCSI subsystem initialized
usbcore: registered new interface driver usbfs
usbcore: registered new interface driver hub
usbcore: registered new device driver usb
media: Linux media interface: v0.10
Linux video capture interface: v2.00
pps_core: LinuxPPS API ver. 1 registered
pps_core: Software ver. 5.3.6 - Copyright 2005-2007 Rodolfo Giometti <giometti@linux.it>
PTP clock support registered
EDAC MC: Ver: 3.0.0
Advanced Linux Sound Architecture Driver Initialized.
Switched to clocksource arm_global_timer
NET: Registered protocol family 2
TCP established hash table entries: 2048 (order: 1, 8192 bytes)
TCP bind hash table entries: 2048 (order: 2, 16384 bytes)
TCP: Hash tables configured (established 2048 bind 2048)
TCP: reno registered
UDP hash table entries: 256 (order: 1, 8192 bytes)
UDP-Lite hash table entries: 256 (order: 1, 8192 bytes)
NET: Registered protocol family 1
RPC: Registered named UNIX socket transport module.
RPC: Registered udp transport module.
RPC: Registered tcp transport module.
RPC: Registered tcp NFSv4.1 backchannel transport module.
hw perfevents: enabled with armv7_cortex_a9 PMU driver, 7 counters available
futex hash table entries: 512 (order: 3, 32768 bytes)
jffs2: version 2.2. (NAND) (SUMMARY)  c 2001-2006 Red Hat, Inc.
msgmni has been set to 493
io scheduler noop registered
io scheduler deadline registered
io scheduler cfq registered (default)
dma-pl330 f8003000.ps7-dma: Loaded driver for PL330 DMAC-2364208
dma-pl330 f8003000.ps7-dma:     DBUFF-128x8bytes Num_Chans-8 Num_Peri-4 Num_Events-16
e0001000.serial: ttyPS0 at MMIO 0xe0001000 (irq = 82, base_baud = 6249999) is a xuartps
console [ttyPS0] enabled
xdevcfg f8007000.ps7-dev-cfg: ioremap 0xf8007000 to 5086a000
[drm] Initialized drm 1.1.0 20060810
brd: module loaded
loop: module loaded
m25p80 spi0.0: n25q128a11 (16384 Kbytes)
1 ofpart partitions found on MTD device spi0.0
Creating 1 MTD partitions on "spi0.0":
0x000000000000-0x000001000000 : "qspi-all"
CAN device driver interface
e1000e: Intel(R) PRO/1000 Network Driver - 2.3.2-k
e1000e: Copyright(c) 1999 - 2014 Intel Corporation.
libphy: XEMACPS mii bus: probed
xemacps e000b000.ps7-ethernet: pdev->id -1, baseaddr 0xe000b000, irq 54
ehci_hcd: USB 2.0 'Enhanced' Host Controller (EHCI) Driver
ehci-pci: EHCI PCI platform driver
zynq-dr e0002000.ps7-usb: Unable to init USB phy, missing?
usbcore: registered new interface driver usb-storage
mousedev: PS/2 mouse device common for all mice
i2c /dev entries driver
cdns-i2c e0004000.ps7-i2c: 40 kHz mmio e0004000 irq 57
zynq-edac f8006000.ps7-ddrc: ecc not enabled
cpufreq_cpu0: failed to get cpu0 regulator: -19
cpufreq: __cpufreq_add_dev: CPU0: Running at unlisted freq: 666666 KHz
cpufreq: __cpufreq_add_dev: CPU0: Unlisted initial frequency changed to: 666667 KHz
Xilinx Zynq CpuIdle Driver started
sdhci: Secure Digital Host Controller Interface driver
sdhci: Copyright(c) Pierre Ossman
sdhci-pltfm: SDHCI platform and OF driver helper
sdhci-arasan e0100000.ps7-sdio: No vmmc regulator found
sdhci-arasan e0100000.ps7-sdio: No vqmmc regulator found
mmc0: SDHCI controller on e0100000.ps7-sdio [e0100000.ps7-sdio] using ADMA
ledtrig-cpu: registered to indicate activity on CPUs
usbcore: registered new interface driver usbhid
usbhid: USB HID core driver
TCP: cubic registered
NET: Registered protocol family 17
can: controller area network core (rev 20120528 abi 9)
NET: Registered protocol family 29
can: raw protocol (rev 20120528)
can: broadcast manager protocol (rev 20120528 t)
can: netlink gateway (rev 20130117) max_hops=1
Registering SWP/SWPB emulation handler
drivers/rtc/hctosys.c: unable to open rtc device (rtc0)
ALSA device list:
  No soundcards found.
mmc0: new high speed SDHC card at address 59b4
mmcblk0: mmc0:59b4 SDU1  30.1 GiB
 mmcblk0: p1 p2
EXT4-fs (mmcblk0p2): recovery complete
EXT4-fs (mmcblk0p2): mounted filesystem with ordered data mode. Opts: (null)
VFS: Mounted root (ext4 filesystem) on device 179:2.
devtmpfs: mounted
Freeing unused kernel memory: 204K (4062b000 - 4065e000)
 * Starting mDNS/DNS-SD daemon 24 bits of entropy available              [ OK ]
 * Starting configure network device security                            [ OK ]
 * Starting network connection manager                                   [ OK ]
 * Starting bluetooth daemon                                             [ OK ]
 * Starting configure network device                                     [ OK ]
 * Starting configure network device security                            [ OK ]
 * Starting Mount network filesystems                                    [ OK ]
 * Starting Failsafe Boot Delay                                          [ OK ]
 * Starting SMB/CIFS File Server                                         [ OK ]
 * Stopping cold plug devices                                            [ OK ]
 * Starting CUPS printing spooler/server                                 [ OK ]
 * Starting load fallback graphics devices                               [ OK ]
 * Starting configure network device security                            [ OK ]
 * Stopping Mount network filesystems                                    [ OK ]
 * Stopping log initial device creation                                  [ OK ]
 * Starting load fallback graphics devices                               [fail]
 * Starting configure virtual network devices                            [ OK ]
 * Starting save udev log and update rules                               [ OK ]
 * Stopping save udev log and update rules                               [ OK ]
 * Stopping configure virtual network devices                            [ OK ]
 * Starting configure network device                                     [ OK ]
 * Stopping Failsafe Boot Delay                                          [ OK ]
 * Starting System V initialisation compatibility                        [ OK ]
 * Starting set sysctls from /etc/sysctl.conf                            [ OK ]
 * Stopping set sysctls from /etc/sysctl.conf                            [ OK ]
 * Starting bluetooth daemon                                             [ OK ]
 * Starting Bridge socket events into upstart                            [ OK ]
 * Starting bluetooth daemon                                             [ OK ]
 * Starting bluetooth daemon                                             [ OK ]
 * Starting bluetooth daemon                                             [ OK ]

speech-dispatcher disabled; edit /etc/default/speech-dispatcher
saned disabled; edit /etc/default/saned
 * Stopping System V initialisation compatibility                        [ OK ]
 * Starting System V runlevel compatibility                              [ OK ]
 * Starting automatic crash report generation                            [ OK ]
 * Starting LightDM Display Manager                                      [ OK ]
 * Starting save kernel messages                                         [ OK ]
 * Starting regular background program processing daemon                 [ OK ]
 * Starting anac(h)ronistic cron                                         [ OK ]
 * Stopping System V runlevel compatibility                              [ OK ]
 * Stopping anac(h)ronistic cron                                         [ OK ]
Last login: Thu Jan  1 00:00:09 UTC 1970 on tty1
 * Starting bluetooth daemon                                             [ OK ]
 * Stopping System PulseAudio sound server                               [ OK ]
 * Starting crash report submission daemon                               [ OK ]
 * Stopping save kernel messages                                         [ OK ]
run-parts: /etc/update-motd.d/98-fsck-at-reboot exited with return code 1
Welcome to Linaro 12.11 (GNU/Linux 3.17.0-xilinx-00085-gde13611 armv7l)

 * Documentation:  https://wiki.linaro.org/
root@cosmoz-ubuntu:~#

ここで入ったLinuxは、開発環境付の本格的なもののようで、gccも入っていました。ZYNQ上でセルフコンパイルして、実行することもできてしまいます。

emacsでプログラムを書いて・・

Lin4

コンパイルして、実行!

Lin5_2

ZYNQ上でセルフでできるというのが面白いですね。

| | コメント (2)

2017.05.04

Cosmo-KのIBERT試験

Cosmo-KのIBERT試験を行いました。

Cosmo-Kというのは、Kintex-7を搭載したPCI Expressボードで、SFP+の光モジュールを搭載したボードです。

Cosmok3pcs

IBERT試験というのは、高速シリアルトランシーバがエラーを起こすマージンを解析するものです。つまり、どのくらい電圧や時間がぶれても大丈夫かを調べることができます。

なんでこんな検査を行ったかというと、今まで6層だとP板のウルトラクイックとかでも10日くらいかかっていたのですが、さすがに納期が長い。

だが、日本の基板会社なら2~4日で製造できる。でも、本当に2日や4日で作った基板で品質は大丈夫だろうか・・・そんな心配があったから比べてみました。

10Gbpsの通信に差はでるでしょうか。

使っているFPGAはXC7K160T-2FFG676Cです。

まずは、新基板(日本)でのIBERT検査の結果です。

Newpcb


Newpcb2


10Gbpsで測って、だいたい50%程度のマージンが出ています。10Gbpsでも余裕で通します。

P板(韓国か台湾)で作ったものはどうでしょうか。

Oldpcb


Oldpcb2


いずれのチャネルも10Gbpsで十分に通信ができ、なんと60%を超えているところもあります。

ただ、新基板は2台作っていて、もう1台のもので測ってみると、

Newpcb3

1台目のものよりも良い性能が得られました。P版で作ったものも、過去に測ったときには60%が出たことはなく50%か43.8%でした。このあたりは偶然なのでしょう。

結論を言うと、基板メーカーによる差はなく、おそらくFPGAの個体差なのだと思います。10Gbpsが出ているのだから良しとしましょう。

| | コメント (0)

« 2017年4月 | トップページ