« 2018年6月 | トップページ | 2018年8月 »

2018.07.30

JTAGチャレンジ基板がほぼ完成

わざと間違いを作りこんでおいて、それを発見するための基板「JTAGチャレンジ基板」の設計がほぼ終わりました。

Jtagchallenge1

このボードには、FPGAとしてSpartan-7とMAX10が乗っていて、マイコンはRXマイコンとLPCマイコンが乗っています。RXマイコンにはUSB-JTAGの機能が実装されていて、Spartan-7、MAX10、LPC11U35をJTAGでいじくることができます。

Spartan-7にはSPI ROMやBPI Flash ROMとDDR3 SDRAMとΔΣのDACがつながっていて、MAX10にはシリアルADCがつながっています。

シリアルADCにはマイクと半固定抵抗がつながっています。

Jtagchallenge0

マイクで拾った音をシリアルADCでディジタルにして、MAX10からSpartan-7にデータを送り、Spartan-7で再びアナログにするという動作をします。ボイスレコーダみたいなものができます。

sun

ですが、設計ミスによりFPGAは起動しません。

そのミスを修正してFPGAが起動するようになっても、FPGA間の接続に問題があって、MAX10とSpartan-7の間で正しくデータを伝達できません。

DDR3 SDRAMも、BPI Flash ROMも致命的な設計ミスにより動作しません。

そういう間違いが10個くらいあります。

どれも、組み込みの基板設計では、よくありそうなミスを仕込んでいます。

sun

もし、FPGAにDDR3メモリをアクセスする回路を書いて地道にデバッグするとなると、途方もない時間がかかってしまいますが、そこをJTAGを使ってあっという間にデバッグできるようにしようというのが、このセミナーの趣旨となります。

Jtagchallenge2

6層基板で、140mm×100mmの、ほぼ葉書サイズです。

早ければ金曜日に生基板が届き、お盆前には実装が上がる予定です。

| | コメント (0)

2018.07.29

Zynqberryでディープラーニングが動いた!

ZYNQ搭載のRaspberry Pi型ボードで「Zynqberry(ジンクベリー)」というのがあります。

Zb

このボードにはZynqberryスタータキットというのがあって、Ubuntu Linux 14とJupyter Notebookがすぐに動くように環境がセットアップされています。

Zynqberry上のJupyterで、オライリーのゼロから作るDeep Learningの本に書かれている推論や学習をやってみました。

まず、第3章のMNIST推論プログラムです。

Learning

文字の正答率は93%で、パソコンと比べて遜色はありません。Pythonとnumpyで動いているプログラムなのであたりまえといえば、あたりまえですが。

ここまではサクッとと動きました。MNISTデータ60000件の推論も1~2秒程度できているので、スピードも遅くありません。推論はね。

sun

ですが、学習させると遅くなります。

まず、第4章の学習プログラムを走らせようとすると、Memory errorと出て停止してしまうのです。numpyでは大きな行列計算を当たり前の記述できて実行できますが、大きな行列を作るにはそれなりにメモリが必要なようで、512MBのメモリでは不足してしまうようです。

そこで、Linuxのswaponコマンドを使って仮想メモリを有効にしたのですが、仮想メモリというのはSDカード上に造られるので、読み書きに時間がかかってしまうというのが理由のようです。

下の図は夜中に走らせたときの結果ですが、1時間程度かかっています。

PCで20秒の計算が1時間です。

Zb_learn

次の実行結果では2時間程度かかっています。2回目の実行で2時間かかったのは、デスクトップウィンドウマネージャとかを動かしていたから、さらにメモリが足りなくなっていたのかもしれません。

Zb_learn2

ですが、学習結果の認識精度についてはパソコンと同じです。

下の図はcat /proc/meminfoで学習している間のメモリの情報を表示したものです。MemFreeとSwapFreeが極度に減っているのがわかります。

Zb_learn3

TOPコマンドの結果をみても、python3.5のVIRTが715556になっていて、大きなメモリを使用しているのがわかります。

Top

sun

今回の実験はZynqberryのZYNQをARMマイコンとして使っているだけなのですが、メインメモリが512MBに限られている環境では、ディープラーニングの学習をPythonのプログラムで行うのはメモリ的にきついことがわかりました。

そもそも、組み込みのIoT端末に学習させることはあまりないかもしれませんが、不可能ではないことが示せました。

推論のほうは十分な速度が出ていますが、組み込みコンピューティングに特化して、Pythonを使わずにC/C++で軽量なニューラルネットワークを作ってもいいかもしれないと思えてきました。

誤差逆伝搬については原理を理解してしまえば、Pythonとnumpyを使わずにC言語で組むこともできるので、要望があれば組み込みマイコンに特化した軽量なディープラーニングというのも作っていきたいですね。

sun

ここで紹介したZynqberryは、日本国内の正規代理店(trenz.jp)から即日発送で購入できます。

https://www.trenz.jp/product/TE0726-03M/

Ubuntu Linux 14とJupyterと、SDSoCプラットフォームが整備されたスタータキットがおすすめですよ。

| | コメント (0)

2018.07.28

ゼロから作るDeep Learningをやってみた

オライリーの「ゼロから作るDeep Learning」をやってみました。

Dl1_2

本を一度通読しただけでは、ニューラルネットワークの各ニューロンがどんな計算をしているか、とか、重みは実際にはどんな値なのか、とか、学習にはどのくらい時間がかかるのか、とかわからなかったので、本に書いてあるコードを試してみることにしました。

Anacondaを入れて、Jupyterを動かして・・

この本はMNISTのデータセットを使って手書き文字認識を実現することをやっていますが、前半では普通のNNでやって、最後でCNNを説明するという構成になっています。

第3章では、28×28の画像を784個の1次元の入力とみなして、50個のニューロンを持つ隠れ層と、100個のニューロンを持つ隠れ層を通して、10個のニューロンを持つ出力層へと導いています。

この学習済みの重みがどんなものかを見てみました。

2

結構ランダムな感じで、人間が見ても、ニューラルネットワークの心の中はわからないようでした。

この本の第4章ではニューラルネットワークを3層に減らして、学習させる話が書かれています。実際に学習させてみると、予想に反してそれほど時間はかかりませんでした。だいたい20秒程度でこの16エポックが終わります。正解率は94.5%くらいまでいきます。

3_2

しかし、ニューロンを500個に増やしても、正解率は上がらず、時間がかかるだけでした。

4

逆にニューロンを10個まで減らしてみても、ほとんど正解率は下がりませんでした。

5

(ただし、9個以下に減らすと下がっていく)

面白いものですね。

3層(隠れ層が1つ)のニューラルネットワークでも、MNISTのデータ程度なら94%くらいの精度で認識できるし、ニューロンの数はあまり関係がないということでした。

情報は各シナプスのつながりの重みにあるのでしょうか。

| | コメント (0)

2018.07.27

JTAGチャレンジ基板がだいたいできてきた

JTAGチャレンジ基板の配線を引き続き進めています。

Spartan-7は電源ピンが少ないので、とても配線がやりやすいですね。

Sp7

MAX10はさらに電源が少なく、さらに3.3V単一電源なので配線がとても引きやすいですね。

Max10

LPC11U35のサブマイコン(JTAGで操作されるだけのマイコン)は、QFNパッケージにしました。初めて触るマイコンなので、BGAだと動かないとさすがにデバッグしづらいし、バグを作りこむものも難しいからです。

Lpc

これで基板の配線がだいたい完成しました。

RXとLPCとか、Spartan-7とMAX10とか、完全な異ベンダー基板になりました。

Jtagchallenge

| | コメント (0)

2018.07.26

JTAGチャレンジ基板の設計再開

設計ミスをわざと作りこんだ「JTAGチャレンジ基板」の配線を再開しました。

この基板は、わざと間違いを作りこんだ基板をJTAGでデバッグして、いかに早く動くようにできるかという、一種のエクストリームな競技デバッグ(?)のための基板です。

1

JTAGでできることの全部が詰め込まれています。

RX62NマイコンがUSB-JTAG変換をしてSpartan-7とMAX10とLPC11U35マイコンをJTAGでデバッグします。Flash ROMやDDR3 SDRAM、シリアルADCなど面白い部品が満載です。

単純そうに見えて実は6層基板。FPGAやSDRAMはBGAパッケージだし、配線は主に内層を通すので、オシロではプローブできません。Spartan-7とMAX10がチェーンでつながっているからFPGAメーカのデバッグツールも使えない。という、たいへん鬼畜な仕様になっています。

DR3 SDRAMとSpartan-7の配線は、大変かなと思って二の足を踏んでいたけど、やってみたら結構楽に引けました。

2_2

とりあえず、DDR3の配線ができた状態。

3_3

そして、FPGAとつないだ状態です。

4_2

このDDR3の配線、全部内層(茶色)を通したからオシロじゃ見えません。

終端抵抗とViaがあるのは、せめてもの優しさといえるでしょう。

sun

その次はパラレルフラッシュとの接続ですが、DDR3よりもこっちのほうが疲れたかもしれません。42本もあります。電源ピンが1個しかないし、20年前はみんな、こんなのでも動いていたんですね。

5_2

| | コメント (0)

2018.07.25

Cosmo-Z用ロックインアンプをリリースしました

フルディジタルなロックインアンプをリリースしました。

ロックインアンプというのは、微弱信号を計測するための計測回路で、入力信号に含まれる特定の周波数の成分の大きさを測定することができます。要するに、1つの周波数だけのフーリエ変換をやっているような感じです。

下の図は、650kHzの入力信号(矩形波)を入れて、それ自身と、に同期した正弦波の大きさと位相を測っています。

Lockin2

Cosmo-Zのロックインアンプは、下の図のような回路で、4chのアナログ入力のSINとCOS成分を同時に計算できます。

Lockin1

ロックインアンプは、参照信号という入力に同期した成分の信号を測るのですが、Cosmo-Zのロックインアンプでは、参照信号はADCからの入力信号の1つのチャネルを使ったり、外部トリガ入力を使ったりすることができるようにしています。

ADCからの入力信号を使う場合の問題点としては、入力に大きなノイズが乗っている場合があることです。

Lockin4_2

ノイズが乗っていると周期検出回路が正しく動作しないので、LPFやHPFを入れてある程度綺麗にすることができるようにしています。

Lockin3

参照信号として使用したい入力が0Vを横切らないような場合のために、HPFも入れられるようにしています。

Lockin5

このようなLPFやHPFを使うことで、入力信号の1つを参照信号として使用することはできますが、やはり、トリガはトリガとして矩形波を入れるのが一番ロックしやすいと思います。

小さな振幅のノイズに埋もれた正弦波で常に0V以上だと、さすがにロックは難しいですね。

乗算と積分を行った結果は任意のN周期分だけ加算することができます。積分が終了したときに波形を出力する「デシメーションモード」もあります。

下の図は、振幅変調された1MHzの正弦波の信号を、ロックインアンプ検波した結果をデシメーションし、表示したものです。デシメーション後のデータは2.23kHzと、遅くなっています。

Lockin6

このようなロックインアンプがFPGA内にフルディジタルで実装できました。

| | コメント (0)

2018.07.24

ロックインアンプで電源のハムを見る

FPGAに実装中のロックインアンプの計測結果が揺らいでいるので調べてみました。

次の図は、ファンクションジェネレータで作った正弦波を、Cosmo-Zに入力した波形です。

Lock5

この信号はノイズが乗っているので、そのままではロックインの参照信号に適しません。

そこで、FIRフィルタを使って綺麗にします。

Lock11

波形が綺麗になっていくのがわかります。

Lock6

これでロックインアンプがロックするようになったので、出力を見てみます。

よくみると、出力値は周期的にゆらいでいます。

Lock3

FFTしてみると、

Lpck4

見事に50Hzと、その整数倍のところにピークが立っています。

ロックインアンプを使ってもハムは取れませんでした。ファンクションジェネレータとCosmo-Zをつなぐ同軸ケーブルに飛んで入ってきているか、ファンクションジェネレータの出力の振幅自体が50Hzで揺れているのです。

電源のハムを取るには、それよりも低い周波数で積分をするように積分回数を増やす、つまりLPFのカットオフ周波数をさらに下げるしかないのかもしれません。

| | コメント (0)

2018.07.23

ロックインアンプ実装中

Cosmo-Zにフルディジタルなロックインアンプを実装中です。

VivadoのIPモジュールとして作っています。

Lockin6_2

次の図は、ロックイン回路の内部の信号の波形を表したものです。

入力信号(茶)に同期した位相信号(赤)を作り、それからsin(黄)とcos(橙)を作り、それを乗算した結果が青と緑です。紫と灰色は積分結果です。

Lockin1_2

積分結果はLPFに通して出力しますが、ディジタルなので、3回の周期で積分器をリセットし、そのリセット直前の値を出力するということができています。

この計算途中の波形を使ってリサージュ図形を描かせてみると、変な気持ち悪い波形がいろいろ描けます。

Lockin2_2

Lockin3_2

Lockin4_3

Lockin5_2

こんな変なリサージュ図形が描けるのは、ディジタルならではです。

| | コメント (0)

2018.07.16

VivadoでIEEE-1735によるソースコード暗号化

製品を作る際に、ユーザがカスタマイズできるようにしたいけれども、FPGAのソースコードを公開したくないという場合があります。

そんな場合、どうすればよいでしょうか。ISEのころは、EDIFのネットリストで配ったり難読化を施したコードを配ったりすることもあったと思います。

VivadoではIEEE-1735という暗号化の方法がサポートされています。IEEE-1735を使うとVivadoの公開鍵であなたのソースコードを暗号化し、Vivadoでしかそれを解読できないので、秘密を守ることができるようになります。

やり方を説明します。

https://japan.xilinx.com/support/answers/68071.htmlのページを参考に、ライセンスが欲しい旨を英語でメールします。しばらくすると、ライセンスが追加された旨のメールが送られてくるので、XILINXのライセンスサイトに行きます。

すると、1735のライセンスが使えるようになっているので、Createします。

Enc_1

② ライセンスを生成するとメールでlicファイルが送られてくるので、これをVivadoに取り込みます。

Enc_2

これでVivadoで暗号化ができるようになります。

③ Vivadoのプロジェクトを作り、暗号化したいソースを作ります。

ここではD:/enctest/project_1/というフォルダにプロジェクトを作ります。

以下は暗号化させたいソースファイルの例です。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
entity led is
    Port ( clk_ip : in std_logic;
           din    : in STD_LOGIC_VECTOR(3 downto 0);
           dout   : out STD_LOGIC_VECTOR(3 downto 0));
end led;
architecture Behavioral of led is
begin
    process(clk_ip) begin
        if(clk_ip'event and clk_ip = '1') then 
            case din is
                when x"0" =>
                    dout <= "1000";
                when x"1" =>
                    dout <= "0100";
                when x"2" =>
                    dout <= "0010";
                when x"3" =>
                    dout <= "0001";
                when others =>
                    dout <= "0000";
            end case;
        end if;
    end process;
end Behavioral;

④ Keyファイルを作ります。

`protect version = 2
`protect encrypt_agent = "XILINX"
`protect encrypt_agent_info = "Xilinx Encryption Tool 2017"
`protect begin_commonblock
`protect control error_handling = "delegated"
`protect control runtime_visibility = "delegated"
`protect control child_visibility = "delegated"
`protect control decryption=(activity==simulation) ? "false" : "true"
`protect end_commonblock
`protect begin_toolblock
`protect rights_digest_method="sha256"
`protect key_keyowner = "Xilinx", key_keyname= "xilinxt_2017_05", key_method = "rsa", key_public_key
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAxngMPQrDv/s/Rz/ED4Ri
j3tGzeObw/Topab4sl+WDRl/up6SWpAfcgdqb2jvLontfkiQS2xnGoq/Ye0JJEp2
h0NYydCB5GtcEBEe+2n5YJxgiHJ5fGaPguuM6pMX2GcBfKpp3dg8hA/KVTGwvX6a
L4ThrFgEyCSRe2zVd4DpayOre1LZlFVO8X207BNIJD29reTGSFzj5fbVsHSyRpPl
kmOpFQiXMjqOtYFAwI9LyVEJpfx2B6GxwA+5zrGC/ZptmaTTj1a3Z815q1GUZu1A
dpBK2uY9B4wXer6M8yKeqGX0uxDAOW1zh7tvzBysCJoWkZD39OJJWaoaddvhq6HU
MwIDAQAB
`protect control xilinx_configuration_visible = "false"
`protect control xilinx_enable_modification = "false"
`protect control xilinx_enable_probing = "false"
`protect control xilinx_enable_netlist_export = "false"
`protect control xilinx_enable_bitstream = "true"
`protect control decryption=(xilinx_activity==simulation) ? "false" : "true"
`protect end_toolblock = ""

中央にある公開鍵の部分(緑色の部分)は、Vivadoをインストールしたフォルダの Vivado\2018.1\data\pubkey にあります。

protect controlの部分は、暗号化したコアがユーザにどのようなアクセスを許可するかを指定します。

  • xilinx_configuration_visible・・・VivadoビューワーでLUT値を表示できるかどうかを設定します。
  • xilinx_enable_modification・・・Vivadoツールで、保護領域内の情報を変更できるかどうかを設定します。
  • xilinx_enable_probing・・・Vivadoデバッグプローブを保護領域内に挿入できるかどうかを設定します。
  • xilinx_enable_netlist_export・・・保護領域のネットリストをエクスポートできるかどうかを指定します。
  • xilinx_enable_bitstream・・・Vivadoでビットストリームを生成できるようにします。

例えば、ビットストリームの生成を不可にすると、Generate Bitstreamで以下のようなエラーが出ます。

Enc_3

⑤ VivadoのTclコンソールで以下のコマンドを打つ

cd D:/enctest/project_1/src/
encrypt -key keyfile.txt -ext .vhdp -lang vhd led.vhd

こうすると、led.vhdからled.vhdpが生成されます。.vhdpの内容は以下のようになります。

`protect begin_protected
`protect version = 2
`protect encrypt_agent = "XILINX"
`protect encrypt_agent_info = "Xilinx Encryption Tool 2015"
`protect begin_commonblock
`protect control error_handling = "delegated"
`protect control runtime_visibility = "delegated"
`protect control child_visibility = "delegated"
`protect control decryption=(activity==simulation) ? "false" : "true"
`protect end_commonblock
`protect begin_toolblock
`protect rights_digest_method="sha256"
`protect key_keyowner = "Xilinx", key_keyname= "xilinxt_2017_05", key_method = "rsa", key_block
pdjNjyoCm2WBMs0KG3Q+ePaDB6ARbd7Y7H3A26a55OOdnew+1OzTUK2k96Ntxukr+wj/aCI2W080
iHpbvKfzLLHduvQ2c1dY3pwuILRpF/YrHydz3MK+Z2IVWvREP/HYxv29SL9MCchFczqEoILOZLfP
PqBHW8jMADoKFmexdPzUm3dx10P1hOGMQ5/4Twzq9dj1Ff3x0QHNcDwsuPj1ed1DXdXP9LAUlWAa
MSTo8PBOP9BHKipCYhrDYSWJqXrAqFtdwzMyixefO7cSleSt4QYoZ6wXS3cgV7hfxtgjsD+C2eu8
RnTUg7kB/iZJT93cNeLAopn9eFLt6Mo9mu1lMw==

`protect control xilinx_configuration_visible = "false"
`protect control xilinx_enable_modification = "false"
`protect control xilinx_enable_probing = "false"
`protect control xilinx_enable_netlist_export = "false"
`protect control xilinx_enable_bitstream = "true"
`protect control decryption=(xilinx_activity==simulation) ? "false" : "true"
`protect end_toolblock="Gvz94Xjb16LqWZIuHZl19gXgAJUP/A9Ayg7PWzSp71Q="
`protect data_method = "AES128-CBC"
`protect encoding = (enctype = "BASE64", line_length = 76, bytes = 464)
`protect data_block
vZGEdHA8Zx5d5yGCb7CGj0ZiCC7CbVudUtULGxqOfj8l+1wRnXKQ4uevKFe6wrMj+P8OXGSBZrl4
VPAnc7iJAC5jXR7TwXtDbO9YzXA8d6sPl2PEb9W/gdLZSEoPqcLfi7oG0pxYaSXzSur2BN9LDYX8
jTYhPDwhPQqOEUwDpmxHxYTqIo+lJEKGOkJDE/Gh2VQ1pZnP1huOVn6MD60nZRZ0CnNL2+zFtf8z
BggLumqLrIY+4yWGI/qLgeDL9zo/COv/AWBmJsb9oCRmBrEcPKOS86jX8nmVejTTuQJwxDId2h2p
w+tj7NFlIF3ay1x26G8UVrQvxxtUsqsfgj+IZ1hIiBr7b6Ae11p2zSKRzW9dQTW5nc1E6C7DzqlJ
6eTAnJ29y9AhU/zH4Q1WBVHlutg0wAANMIwEEjLH+9ZicjzZQBpIwG3A65e1ylAnLw8mCP6aeXTt
cSM2Mwfx+GSWOaJCaymED+E1w6qGw6efC2vdeTzIuedN2ejxDGG45uNzW8zhZGrb/oFToDwh2NaB
CAy3AXRgadtedUPE/mt9Jq0MXqDqh1aHv5e3x8Ebqbiq6tQsI8jUi7BhWis9fSG7kVP2jDTB257q
NX/VL7bljOo=
`protect end_protected

この最後にあるprotect data_block~protect end_protectedの間の暗号化された部分が、元のled.vhdに相当します。

このled.vhdは、人間が読んでもわかりませんが、Vivadoには元のled.vhdを復元できるので、論理合成できるというわけです。

⑥ ラッパを作る

上で暗号化した、led.vhd→led.vhdpは暗号化されていて使いにくいので、led_wrap.vhdというラッパを作ります。

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;

entity led_wrap is
    Port ( clk_ip : in std_logic;
           din : in STD_LOGIC_VECTOR(3 downto 0);
           dout : out STD_LOGIC_VECTOR(3 downto 0));
end led_wrap;

architecture Behavioral of led_wrap is
    component led
        Port ( clk_ip : in std_logic;
           din : in STD_LOGIC_VECTOR(3 downto 0);
           dout : out STD_LOGIC_VECTOR(3 downto 0));
    end component;
begin

    u0 : led
    port map( clk_ip => clk_ip, din => din, dout => dout );

end Behavioral;

これで論理合成すれば、led.vhdが暗号化されたIPとなって、無事に回路が合成されます。

Enc_4

sun

いかがでしたでしょうか?

意外と簡単だったと思います。

ポイントは、

  • 暗号化ライセンスを取得してVivadoに機能追加する
  • keyファイルを作り、ユーザに与えたい権限を設定し、tclコマンドでVHDLファイルを暗号化する
  • vhdpファイルは、人間には読めないが、ツールにはVHDLと同じように使用可能

このような手順で、貴方のつくった回路の秘密が守られるので、ぜひ試してみてください。

| | コメント (0)

2018.07.12

JTAGチャレンジ基板(仮称)を作ります

JTAGチャレンジ基板(仮称)というものを作ります。

これはどういうものかというと、RXマイコン、Spartan-7、MAX10が乗った基板なのですが、基板にいろいろとミスが仕込んであって、動かないのです。

そのミスというのは、回路設計者や基板設計者がやりがちな、よくある設計ミスです。

クロックが来ていないとか、リセットがかからないとか、FPGAが起動しないとか・・そういうミスなのですが、本当の基板でやったら即作り直しになって、再設計費数十万円と1か月を無駄にするような、胃が痛くなるようなミスをたくさん仕込んであります。

Jtagchallenge

で、そんな動かない基板をどうするかというと、MITOUJTAGを使えばそういうミスが一瞬で発見できるということを体験してもらおうというわけです。

MITOUJTAGというのは、世界で一番最初にJTAGバウンダリスキャンを組み込み回路のデバッグに活用できるようにしたツールです。

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

今までは工場の出荷検査くらいにしか使われてこなかったJTAGバウンダリスキャンを、開発者ひとりひとりが自分の回路のために使えるようにしたツールなのです。

sun

たとえば、DDR3メモリのアドレス線が入れ替わっていたら、どうやってデバッグしますか?MIGを使って何度も作り直す?

たとえば、FPGAにクロックが入っていなかったら、どうやってデバッグしますか?Vivadoの内蔵JTAGアナライザはクロックがなかったら動きませんよね。

もし、6層基板の内層が切れていたら、どうやって発見しますか?片方のFPGAからテスト信号を出して、もう一個のFPGAでロジアナを動かす?そんなめんどくさいこと・・・

でも、内層が切れているかも・・・ということにどうやって気づきますか?

sun

JTAGの本来の機能は「バウンダリスキャン」といって、FPGAやCPUが動作しないレベルの致命的なバグがある基板でも使えるのです。

MITOUJTAGは、バウンダリスキャンを強力なデバッグ手段にすることができ、基板の間違いをもっと早期に、もっとストレスを感じない方法で見つけてもらいたいと思い、この基板を設計しています。

早ければ9月中にこの基板を使って最初のセミナーを開催できればと思っています。

| | コメント (0)

2018.07.08

ZynqberryでJupyter notebookが動いた!

何度目かの挑戦でようやくZynqberryでJupyterが動くようになりました。

参考にしたページは、この2つです。

ただし、ZYNQのUbuntu 14.04では上記のページのままのコマンドを実行してもうまくいきません。

  • pip installコマンドで、メモリ不足が出る
  • いくつかのモジュールが足りず、apt-getで足りないものを入れなければならない
  • Ubuntuに入っているPythonのバージョンが低くてpip install ipython[notebook]が通らない
  • sixというモジュールが自動的にはRemoveされない

という問題があるためです。

ARMのシステムにJupyterを入れるのに数時間は軽くかかります。一晩中放っておいたり、外出したりして、うまくいっていたらラッキーという感じです。

とにかく、Jupyterはインストールするのにものすごく時間がかかります。正しい手順を知っていても半日~1日はかかります。

そこで、Zynqberry用にJupyterをインストールしたSDカードイメージを作りました。Zynqberryスタータキットをご利用のお客様は、下記のURLのページからダウンロードできるようになります。

https://www.trenz.jp/download.html

ubuntu14-richというSDカードイメージを書き込めば、Ubuntu14.04上でJupyter (Python 3.5.1および2.7.12)が動くようになります。

sun

なおpyenvは/root/.pyenv/にインストールしてあるので、rootユーザしか起動できません。

使い方は、rootでログインした後、

export PYENV_ROOT=$HOME/.pyenv
export PATH=$PYENV_ROOT/bin:$PATH
eval "$(pyenv init -)"
pyenv global 3.5.1
eval "$(pyenv virtualenv-init -)"
pyenv virtualenv 3.5.1 dev1_3.5.1
pyenv local dev1_3.5.1
python -V
jupyter notebook --allow-root&

で起動できます。

Jupyter起動時のコンソールは

Jupyter4

こんな感じでした。

Webブラウザの画面には

Jupyter5

このような棒グラフが表示されています。

ネットで見つけてきたグラフ描画のスクリプトをいくつか実行してみます。

Jupyter1_2

Jupyter2_2

ちゃんと綺麗なグラフが描画されますね。

それから、Jupyterにはコンソールが付いているようで、これを使うとSSHでTeraTermに接続するということをユーザに強要しなくても、コマンドラインが使えるようになるのかなと思います。それと同時に大きなセキュリティホールにもなりますが。

Jupyter3

このコンソールは気を付けなければなりません。

| | コメント (0)

« 2018年6月 | トップページ | 2018年8月 »