2018.08.18

高位合成のお勉強

私もZynqberryでSDSoCで高位合成の勉強を始めることにしました。

ADCやDACを扱いたいので、AXI Streamを入力して、AXI Streamを出力したりAD変換データを処理するようなコアをC言語で作りたいと思います。

まずは、入力を出力にそのまま出すだけのコア「pass_through」を作ります。

SDSoCでAXI Streamを扱うには、AXI-4 Stream Data FIFOを置くようです。

入力側(SDSoCのにとってのデータソース)をaxis_data_fifo_0とし、出力側をaxis_data_fifo_1としました。そして、そのポートに

set_property PFM.AXIS_PORT { M_AXIS {type "M_AXIS"} } [get_bd_cells /axis_data_fifo_0]
set_property PFM.AXIS_PORT { S_AXIS {type "S_AXIS"} } [get_bd_cells /axis_data_fifo_1]

でアトリビュートを設定し、DSAファイルを作成します。

SDSoCのプログラムでは、

#pragma SDS data sys_port (A:axis_data_fifo_0_M_AXIS)
#pragma SDS data sys_port (B:axis_data_fifo_1_S_AXIS)
//#pragma SDS data copy(A[0:32], B[0:32])
#pragma SDS data zero_copy(A[0:32], B[0:32])
void pass_through(unsigned long *A, unsigned long *B)
{
#pragma HLS INLINE
#pragma HLS interface axis port=A
#pragma HLS interface axis port=B
	unsigned long A_in;
	A_in = *A;
	*B = A_in;
}

Sdsoc_axis_1

とします。

#pragma SDS data sys_port の引数の部分にモジュール名_ポート名を書くと、そのポートにつながるようです。

こんなものでいいのかと思ったのですが、作られた回路を見ると、

Sdsoc_axis_2

pass_through_1_ifというモジュールが作られていて、pass_through関数の入力と出力をラップしているように見えます。

SDSoCが作ったと思われるコードを見てみると、

Sdsoc_axis_3

・・・

作りたかったものは、こうじゃない。

シンプルなデータパスルーでさえ、簡単には作れません。(;ω;)

覚書として、プラットフォームを作成するときに使用したプロパティの設定などを書いておきます。

set_property PFM.AXIS_PORT { M_AXIS {type "M_AXIS"} } [get_bd_cells /axis_data_fifo_0]
set_property PFM.AXIS_PORT { S_AXIS {type "S_AXIS"} } [get_bd_cells /axis_data_fifo_1]

set_property PFM_NAME "tokudenkairo.co.jp:zbstd:zbstd:1.1"\
[get_files [get_property FILE_NAME [get_bd_designs]]]

set_property PFM.CLOCK { \
 clk_out1 {id "2" is_default "true" proc_sys_reset "proc_sys_reset_0" } \
 clk_out2 {id "1" is_default "false" proc_sys_reset "proc_sys_reset_1" } \
 } [get_bd_cells /clk_wiz_0]
 
set_property PFM.AXI_PORT { \
M_AXI_GP1 {memport "M_AXI_GP"} \
S_AXI_ACP {memport "S_AXI_ACP" sptag "ACP" memory "processing_system7_0 ACP_DDR_LOWOCM"} \
S_AXI_HP2 {memport "S_AXI_HP" sptag "HP2" memory "processing_system7_0 HP2_DDR_LOWOCM"} \
S_AXI_HP3 {memport "S_AXI_HP" sptag "HP3" memory "processing_system7_0 HP3_DDR_LOWOCM"} \
} [get_bd_cells /processing_system7_0]

set intVar []
for {set i 2} {$i < 16} {incr i} {
lappend intVar In$i {}
}
set_property PFM.IRQ $intVar [get_bd_cells /xlconcat_0]

write_dsa -force d:/zbstd/zbstd.dsa

| | コメント (0)

2018.08.16

セキュリティキャンプ2018の講師を努めました

セキュリティ・キャンプ全国大会2018で講師を務めてまいりました。(写真は公式Twitterや掲示板の画像から引用)

Seccamp1

今年はフィジカルレイヤーという物理層レベルのセキュリティのトラックが新設され、その講師に任命されたので、私の専門であるJTAG(ジェイタグ)について講義と実習を行ってきました。

Seccamp2

添付の写真のような基板を受講者に渡して、JTAGのビット列を解読したり、解読したビット列をもとにEXTESTを使ったLEDをチカチカさせたりといった演習となりました。

Seccamp3

Seccamp4

Seccamp5

当日朝まで徹夜でパワポをまとめたり、ソフトをデバッグしたりで大変でしたが、4時間の講義が終わったときのやり遂げたという解放感はひとしおでした。

Seccamp6

| | コメント (0)

2018.08.13

特電のオフィスに会議室兼セミナールームを設置しました

アルバイトさんに手伝ってもらって、特電のオフィスに会議室を設置しました。

特電のオフィスはワンフロアになっています。

まず、この雑然とした一角を片付けて・・

Before_2

本棚を動かして小部屋を作りました。

After1

本棚に隠れていた窓にもアクセスできるようになりました。(夜なので閉まっていますが)

After1_2

圧倒的、予備校の自習室感

いや、進路相談室かもしれない


大きなテーブルを出せば10人くらいまでなら一度に入れそうです。お昼ごはんを食べたり、軽作業をしたりする小部屋としても使えそうです。

小さなセミナーは自社で開催できるようになりました。Cosmo-Zセミナーなど機材の多いセミナーや、はんだごてが必要になるセミナーは、自社オフィスでやっていきたいと思います。

| | コメント (0)

2018.08.11

MITOUJTAGからMAX10に書き込む方法

XILINXとALTERAのデバイスが同一のJTAGチェーンにつながっている場合に、MITOUJTAGから書き込む方法を紹介します。

まず、Qualtus PrimeでMAX10のデザインを作ります。

Qp_1

QualtusのToolsからProgrammerを起動します。

Qp_2_2

QualtusのProgrammerが起動したら、いちど、まっさらな状態にします。

Qp_20

Add Fileを押して、MAX10の出力したファイルを選択します。

MAX10の内蔵ROMに書き込みたいならPOFを選び、揮発性のコンフィギュレーションをしたいならSOFを選びます。

Qp_8

下の図はPOFを選んだ場合の状態です。

Qp_6

次に、同一チェーン上にあるXILINXデバイスを追加したいのですが、当然ながらALTERAのツールはXILINXデバイスを認識しません。

そこで、Add Deviceボタンを押します。

どのデバイスを追加するかを聞かれるので、Importボタンを押します。

Qp_3

ファイル名を入力するダイアログが出るので...ボタンを押します。

Qp_4

D:\Xilinx\Vivado\2018.1\data\parts\xilinx\spartan7\public\bsdlディレクトリを指定し、中にあるxc7s25_csga225.bsdを指定します。

Qp_5

XC7S25が使用できるようになりました。

Qp_7

下の図のように、XILINXとALTERAがJTAGチェーンでつながります。

もし、順番が逆になっている場合にはUpボタンを押します。

Qp_9

sun

次にMITOUJTAGから書き込むために、SVFというファイルを作ります。SVFを作るにはProgrammerのFileからCreate JAM JBC、SVF or ISC Fileを行います。

Qp_12_2

デフォルトでは、下の図のようにjamファイルになっているので、

Qp_14_2

これを選択して、

Qp_11_2

SVFファイルに変更します。また、TCKを1MHzに変更します。(これを行わないと遅くなる)

Qp_13

OKを押します。

Qp_16

これでSVFファイルができました。SVFファイルというのはこのような感じのテキストファイルです。

Qp_10

この中に、Spartan-6とMAX10がチェーンになった場合のMAX10書き込みシーケンスが入っていて、そのまま実行すれば書き込まれるようになっています。

そうしたら、MITOUJTAGを起動して、[ツール]→[SVFプレイヤー]を起動します。

Qp_17

先ほど生成したSVFファイルの中身を貼り付けます。

Qp_18

ここで開始ボタンを押すと、SVFが実行されて、MAX10に書き込まれます。

Qp_19

無事に書き込みが行われ、MAX10が起動しました。

Max10_write_success

sun

下の図は、MAX10につないだシリアルADCを操作して、半固定抵抗の値やマイクで拾った音声を、JTAGロジアナで波形として表示しているようすです。

Max10_adc

Max10_adc2

特にWindowsのソフトウェアを組むことなく、FPGAのピンからバイナリの値を出せば、MITOUJTAGのロジアナでそれを拾って、アナログ波形として表示できます。

このやり方は、FPGAやWindowsのソフトを作らなくてもよいので楽ですよ。

| | コメント (0)

2018.08.10

JTAGチャレンジ基板の実装が上がってきた

わざと間違いを作りこんでおいて、JTAGバウンダリスキャンでそれを発見するという「JTAGチャレンジ基板」の初期ロット12台が上がってきました。

Jtag_challenge_12

Jtag_challenge

Jtag_challenge_sm

Jtag_challenge_rx

とりあえずは、JTAGケーブルを接続してSpartan-7とMAX10が認識されました。

Jtag_challenge_bscan

この画面が出れば電源とJTAGは正常であることが保証されるので安心できますね。

よく見るとエラーになっていますが、MAX10は書き込み前だとINSTRUCTION_CAPTUREレジスタの値が変わるという変な仕様のためです。

最初は動かなくてかなり焦りました。まさか、こんな罠があるとは・・

coldsweats01

これから動かないことを確認します!

| | コメント (0)

2018.08.09

Digilentのボードを片っ端からスキャンしてみた

MITOUJTAGのDigilentプラグインができたので、手元にあるDigilent製ボードを、MITOUJTAGで片っ端からバウンダリスキャンしてみました。

まずは、Artyです。ArtyはXC7A35TのCSG324が乗っているFPGAボードです。

Arty_a7

自動認識すると同じIDCODEのデバイスの候補が見つかるので、この中で324ピンのものを選びます。

Arty_detect

Artyが動作しているときの、Artix-7の端子の状態です。

ピンクはHレベル、水色はLレベル、塗りつぶしは出力、網掛けは入力の状態を表しています。

Arty_bscan

ArtyにはSPI ROMが乗っているようで、MITOUJTAGからSPI ROMを認識することもできました。

Artyspirom

Artyが起動するときのSPI ROMの端子の動きや、起動後のLEDチカチカの信号も見えました。

Arty_logana

sun

次はSpartan-7が乗ったArty-S7です。Artyとの大きな違いは、Etherのコネクタが無いことです。

Arty_s7

こちらも自動認識すると、同じIDCODEのデバイスが見つかります。この中で324ピンのものを選びます。

S7_detect

端子の状態もばっちり見えました。

S7_bscan

Arty-S7のデフォルトのLEDチカチカはPWMがかかって、じわりじわりと点滅します。そのようすがJTAGロジアナでも見えています。

S7_logana

sun

最後はZYBO-Z7です。

ZYBOは初期のころの評価ボードなので画面出力がVGA端子だったりしますが、その後HDMI出力やCSIカメラが付いたZYBO Z7というのが出ました。

Zybo_z7

FPGAもXC7Z020にアップグレードされています。

Z7_detect

自動認識すると、ARMコアとFPGAコアの2つのデバイスが見えます。

Z7_bscan

LEDチカチカのPWMもよくできています。

Z7_pwm

様々な端子の信号を見るとこのような感じになっています。

Z7_logana

sun

MITOUJTAGは、他社製ボードであっても使えます。デフォルトのサンプルデザインが動いている状況でも使えます。つまり、FPGAに何もIPを書き込む必要がありません。

FPGAの起動前であっても信号が見えるので便利ですよ。

組み込みの世界にバウンダリスキャンを普及させたMITOUJTAGについて詳しく知りたい方は、こちらをクリックしてください↓

MITOUJTAGについて詳しく

| | コメント (0)

2018.08.08

MITOUJTAGのDigilentプラグインを作成

Digilent製ボードでMITOUJTAGが使えるようにするため、プラグインを作っています。

ようやくDigilent USB-JTAGの使い方を理解して、MITOUJTAGから使えるようにできました!

まずは、ZYBOとパソコンをつなぎます。ZYBO上のUSB-JTAGで通信するので、USBケーブル1本だけです。

Zybo_3

これでDigilent製のボードはUSBをつなぐだけでI/Oピンや波形が見れるようになったわけなのですが、ZYBOが起動するときの波形をバウンダリスキャンのロジアナで見てみたら、毎秒4000サンプリングほど出ていました。つまり250usくらいのサンプリング周期のようです。

Zybo_bscan

JTAGロジアナで見てみると、DDR3メモリの動きなどが見えます。

Zybo_logana

実は今までのMITOUJTAGにもDigilent USB-JTAGを接続する機能はあったのですが、XILINX ISEがサポートするDigilent Cable Pluginを間接的に使っていたので、ISE(Labtool)が入っていないと使えませんでした。

LabToolはISEのでなければだめで、Vivadoには対応していませんでした。

その意味でも、今回の改良でISEに依存せずにDigilentケーブルが使えるようになったのは大きいといえます。

Dflow

| | コメント (0)

2018.08.04

DigilentのJTAGを自分のプログラムで使う方法

DigilentのボードにはUSB-JTAGが付いています。

このUSB-JTAGを自分のプログラム方法を調べました。

簡単に言うと、Digilent Adeptというライブラリがあって、djtgとdmgrというライブラリを使います。AdeptはJTAG以外にもDigilentが用意するシリアルI/OやパラレルI/Oを統括した、総合的なターゲットボード用ライブラリのようです。

様々なボードがあるので、JTAGの機能にもいろいろなオプションがあるようです。

また、PCに何台のターゲットボードがつながるかもわからないので、最初にEnumerateして、ボードのシリアル番号を調べて、そのシリアル番号を使ってデバイスをオープンするという手順になります。

開いたボードはたいていはFT2232が乗っていて、FT2232のファームウェアでAdeptのターゲットを実装していると思うのですが、そうでないボードもある可能性があるので、ボードが備えているabilityを調べます。

Zyboのボードは、スピード調整や、ピンの設定、WAIT機能、バッチ機能などを備えているようです。

Jtag_program

DigilentのUSB-JTAGを叩いて、ZYBO上のUSB-JTAGのプロパティと、ARMとZYNQコアをスキャンすることに成功。

AUX Resetというポートは存在していて、GPIOは付属していないようですね。

AUX Resetを0にするとARMのJTAGがしばらく認識できなくなるので、何かの機能はあるようです。GPIOは、おそらくCPUのデバッグに用いる補助的なI/Oに使われるものと思われます。最近のARMでは使いませんが、MIPSのころはGPIOが必要でした。

sun

次に、Digilentのボードに乗っているUSB-JTAGを使う実験をしてみました。

最初の感想は、かなり遅い。

それもそのはず。USB 2.0 HighSpeedは、1つの操作をするたびに125us待たなければなりません。FT2232はさらに遅いはずです。

実際に試してみると数百usかかったり、かなり不安定です。

そこで、Adeptにはバッチモードというのが用意されていて、複数のJTAG操作をスクリプト化してまとめて投げるのです。

このバッチモードを使うと、任意の波形をそこそこの速度で出せるようになりました。USBの遅さカバーする方法が私のライブラリと同じ設計思想なのですぐに使い方がわかりました。FTDIのICの動きもだいたい想像できます。

Djtag

ZYBOのJTAGでIDCODEを読み出すシーケンスを実行してみました。

Djtag_idcode

ARMとZYNQコアのIDCODEが読み出せているのがわかります。

TCKは最高で30MHzほど出ていて、これが最高速度のようです。

| | コメント (0)

«JTAGチャレンジ基板の生板ができてきた