JTAG総合情報サイト>MITOUJTAG開発日記>2016年のJTAG開発の記録

2016年のJTAG開発の記録

MITOUJTAGの波形エクスポート機能

2016.12.25

MITOUJTAG Lightに搭載の「波形エクスポート機能」について説明します。

この機能はJTAGロジックアナライザでキャプチャ波形を、CSVやVCD形式で出力するものです。今までもVCD形式(Value Changed Dump)で出力することはできたのですが、VCDのビューワーで良いものがなかったので、CSVで出力する機能を新たに作りました。

実際のやり方を説明します。

まず、適当なFPGAボードを接続します。ここではZynqBerryを例に説明します。

Zb1

FPGAの端子が可視化できたら、ロジアナ画面を開いて、少し波形をキャプチャしてみます。

Zb2

はい。DDR3メモリの波形が見えました。なんだか激しく動いています。

ここで、保存ボタンの横の▼を押すと、「ファイルをエクスポートします」というのがあるので、このエクスポートを選びます。

Zb3

すると、ファイルを保存するダイアログが出るので、適当なファイル名を付けて保存します。

sun

保存したファイルはユーザ・データ・フォルダの下のMITOUJTAGフォルダにあります。ユーザ・データ・フォルダとは、Windows7や8ではマイドキュメントなのですが、今後のWindowsではマイドキュメントがどこに移動させられるかわかりません。

そこで、ファイルメニューの「ユーザ・データ・フォルダを開く」を選択すると、一発で保存したフォルダが開くようにしました。

Zb4

ここにaaa.csvというファイルが保存されていますね。

Zb5

これをExcelで開いて見てみましょう。

このように、時間情報(一番左の列)と、値のデータがベタな数字で入っています。

Zb6

これをグラフ化して、一部分だけ見てみると、

Zb7

このように、ロジアナで取った波形を、すぐにExcelでグラフ化することができます。

sun

この機能が真価を発揮するのは、アナログ的なデータを見る場合です。ADCの値でもいいですし、FPGAが内部で計算している数値計算の途中経過でも良いです。ロジアナの画面で波形が見れれば同じようにエクスポートできます。

下の波形は、18bit ADCでキャプチャしたデータです。

Adc1

このデータを見るためのFPGAのアプリケーションはまだ作っていないので、ロジアナで数字として確認するより他ありません。システムの開発中では、アプリケーションソフトを作りこむ前に、FPGAの中の数字をグラフ化したいということは良くあります。

そこで、CSVでエクスポートして、エクセルに取り込んでみました。

Adc2

この表形式のデータを範囲選択し、挿入→グラフとやると・・

 

このとおり、ADC値の時間変化を一瞬でグラフにすることができました。

Adc3

波形がカクカクしているのは、ロジックは250MHzで動いていて、ADCの波形は5MHzでやってくるため、50回に1回しか変化しないためです。

sun

FPGAの開発において、アプリを作らずにアナログ的に波形を見る、という新たなRapid Development(迅速開発)ができようになるでしょう。

面倒な手間を避け、できるだけ楽して開発する。それを可能にするのがMITOUJTAGです。

 

MITOUJTAGのBLOGANAをVerilogで使う

2016.06.16

MITOUJTAGにはBLOGANA(ブロガナ)という機能があります。

BLOGANAは、ChipScopeやSignalTapと同様、FPGAの中のBRAMに波形を溜め込んで、「JTAGで吸い出して見る」という、内蔵型のJTAGロジックアナライザです。

BLOGANAを使うには、コアを埋め込みたいモジュールに

component blogana2 is
  generic(
    BIT_WIDTH     : integer := 72; --サンプリングする信号のBIT幅を指定(1bit以上、252bit以下で選択)
    SAMPLE_LENGTH : integer := 1024--サンプリングの長さ(word)を指定(1word以上、8192word位下で選択)
    );
  Port (    CLK         : in std_logic;
            TRIG        : in std_logic;
            USER_OP     : out std_logic_vector(19 downto 0);
            SAMPLE_EN   : in std_logic;
            DIN         : in std_logic_vector(255 downto 0); --BIT幅はgenericのBIT_WIDTHで指定
            SAMP_FREQ   : in integer range 0 to 2147483647; -- サンプリング周波数
            BUSY        : out std_logic                     -- 必ずどこかに出力すること
            );
end component;

というコンポーネントを宣言して、インスタンシエートします。

最近はISEでもVivadoでも、VerilogからVHDLのモジュールを呼び出すことはできるので、Verilogでも使えるはず・・と思っているのですが、私はVHDL派なのでVerilog対応はおざなりになっていたのですが、お客様からVerilogでも使用できないかという問合せがあったので、試してみました。

というか、インターンで来ている学生さんに試してもらいました。

sun

結論からいうと、このままではダメでした。

という理由によるものでした。

GenericにあるBIT_WIDTHやSAMPLE_LENGTHはInteger型でも大丈夫なのですが、PortのところにあるSAMP_FREQがダメな原因でした。

どうすればよいかというと、SAMP_FREQをstd_logic_vectorに書き換える必要がありました。

うまく動くようになったLEDチカチカのソースを載せます。

module LED_Chika(xtalclk_ip, led_op, tmp);
 input   xtalclk_ip;
 output [7:0] led_op;
 output tmp;
 wire [71:0] blogana_din;
 wire   blogana_trig;
 wire   blogana_busy;
 wire [19:0] blogana_user;
 //
 wire   xtalclk;
 reg  [7:0] led;
 reg  [31:0] timer;
 reg    count_en;
 reg  [2:0] count;
 assign xtalclk = xtalclk_ip;
 assign led_op = led;
 
 blogana2 #(
   .BIT_WIDTH(72),  //サンプリングする信号のBIT幅を指定(1bit以上、252bit以下で選択)
   .SAMPLE_LENGTH(1024) //サンプリングの長さ(word)を指定(1word以上、8192word位下で選択)
   )
 blogana
   (  .CLK(xtalclk),
   .TRIG(blogana_trig),
   .DIN(blogana_din),
   .USER_OP(blogana_user),
   .SAMPLE_EN(1'b1),
   .SAMP_FREQ(32'd480000),
   .BUSY(blogana_busy)
   );
 always @(posedge xtalclk) begin
  if (timer == 5000000) begin //10Hz
   timer <= 32'h00000000;
   count_en <= 1'b1;
  end else begin
   timer <= timer + 1;
   count_en <= 1'b0;
  end
 end
 //counter ( output LED )
 always @(count) begin
  case (count)
  3'b000: begin
   led <= 8'b00000001;
  end
  3'b001: begin
   led <= 8'b00000010;
  end
  3'b010: begin
   led <= 8'b00000100;
  end
  3'b011: begin
   led <= 8'b00001000;
  end
  3'b100: begin
   led <= 8'b00010000;
  end
  3'b101: begin
   led <= 8'b00100000;
  end
  3'b110: begin
   led <= 8'b01000000;
  end
  3'b111: begin
   led <= 8'b10000000;
  end
  default: begin
   led <= 8'b11111111;
  end
  endcase
 end
 always @(posedge xtalclk) begin
  if (count_en == 1'b1) begin
   count <= count + 1;
  end
 end
 
 assign blogana_trig = count_en ? 1'b1 : 1'b0;
 assign blogana_din[2:0] = count;
 assign blogana_din[10:3] = led;
 assign blogana_din[42:11] = timer;
 assign blogana_din[43] = count_en;
 assign  tmp = blogana_busy;
 
endmodule

これでVerilogからblogana2というモジュールをインスタンシエートする形になりますが、ISEのプロジェクトマネージャでは

Verilog_blogana

という期待通りの階層構造が表示され、blogana2.vhdが下位モジュールとして認識されるようです。

 

論理合成したら、出来上がったBitファイルを書き込みます。

そして、ロジアナ画面を開き、BLOGANAボタンを押すと、ダイアログが開き、

Verilog_blogana2

BLOGANAを組み込んだソースファイルを指示されます。このダイアログに書かれているサンプリング周波数、ビット幅、データ長は、GenreicとPortで設定したSAMP_FREQ、BIT_WIDTH、SAMPLE_WIDTHです。

Verilogファイルを読むこむと、

assign blogana_din[*:*] = ○○○

で書いた行を自動的に解析して、信号に名前を付けてくれます。

Verilog_blogana3

バスはまとめてバスにしてくれて、名前まで付けてくれるので、意外と便利ですよ。

 

BLOGANAのソースファイルと、インスタンシエートするサンプルのVerilogファイルはこちらにアップロードしました。

https://www.tokudenkairo.co.jp/login2/getfile.php?target=blogana2_verilog

 

MITOUJTAGのロジアナ波形をエクスポートする方法

2016.05.26

アルバイトさんが、MITOUJTAGのロジアナ機能を使って取った波形をEXCELにエクスポートする方法を考えてくれました。

やりたかったことは、18bitのAD変換ボードのA/D変換結果をグラフにしたかったというものです。

まず、MITOUJTAGの内蔵ロジアナを使って、FPGA内部の波形をキャプチャします。

Mjwave_1

一番上の正弦波のようになっている信号が、ADCから受け取った波形です。

十進数にしてみるとこんな感じです。

Mjwave_2

この波形をエクスポートしたいと思います。

まず、MITOUJTAGの画面左で、ツリーになっているところにあるロジアナ波形を右クリックして、エクスポートを選びます。

Mjwave_3

そうしたら、vcdファイルの形式でエクスポートします。

VCDというのは、Value Changed Dumpの略で、標準的な波形記録フォーマットです。

Mjwave_4


VCDファイルはテキストで、このような感じになっています。

Mjwave_5

VCDは、信号名を謎の記号に変換しますが、2進数の部分はこう書かれるようです。

Mjwave_6

こういうのをひたすら集めて、テキストエディタで置換すると

 

Mjwave_7_2

MITOUJTAGのロジアナで得られた波形をこのようなテキストに落とせるとのことです。

Mjwave_8
 

ちょっと大変ですが、専用のキャプチャ用アプリを作らなくても、FPGAの中でバスに出ていれば、それをMITOUJTAGで取り込んで他のアプリにエクスポートできるので、開発途中では便利な方法だと思います。

 

ZynqBerryをLEDチカチカして、JTAGで観察してみた

2016.05.24

今、話題沸騰のZynqBerryをLEDチカチカさせてみます。

本来の使い方では

  1. VivadoでPLとPSを作る
  2. 起動ファイルを作る
  3. フラッシュROMに書き込む

ということになるのでしょうが、2や3の手順はZynqBerryの専用のツール(CMDファイル)を使うようなので、動かない場合にどこで間違えたのかがわからなくなってしまいます。

そこで、今回はMITOUJTAGを使ってPLだけ書き換えてみようと思います。これならBitファイルが出来ているのか、その後の工程で間違えているのかの切り分けが簡単です。

Zynqberry0526

 

まず、ZynqBerryにMicroUSBをつなぐと、FT2232Hのドライバがインストールされます。

ドライバは下記のURLにあります。

http://www.ftdichip.com/Drivers/VCP.htm

このFT2232HはDigilentのUSB-JTAGを構成しているので、使用するためにはDegilent Adeptをインストールし、再起動します。

http://store.digilentinc.com/digilent-adept-2-download-only/

これで準備OKです。

sun

MITOUJTAGを起動したら、オプション→XILINX Cable Serverの設定を行います。

Zb1

 

次のダイアログが開くので、ケーブルのタイプをautoに設定するか、digilent_pluginを選びます。

Zb2

EXEファイルを自動的に検索する・・のパスは、XILINXのISE(のラボツール)が入っているパスを選択しておきます。CSEサーバのバージョンは14.5で構いません。

そして、メイン画面のケーブルアイコンの上で右クリックして、ケーブルの接続を選びます。

Zb3

数ある対応ケーブルの中から「Digilent JTAG-HS2 or onboard-JTAG」を選びます。

Zb4

OKを押すと、Digilentケーブルが認識されます。

Zb5

そうしたら、ツールバーにある「自動認識」ボタンを押します。

Zb6

2個のデバイスが検出された旨が表示されるので、最初のデバイスにはZYNQ7000_ARM_DAPを選びます。

Zb7

 

2個目のデバイスはXC7Z010_CLG225を選びます。

Zb8

実際には、XA7Z010やXC7Z010Iを選んでも中身は同じなので問題はありませんが、225ピンのものを選ぶようにしてください。

 

画面上に2つのデバイスが表示されます。右の○がいっぱいあるのが、XC7Z010のBGAの端子を表しています。可視化ボタンを押すと・・

Zb9

 

このように、1つ1つのBGAの端子がHレベルなのか、Lレベルなのかが画面上でわかります。

Zb10

(まだ未完成ですが、3D化も開発中です。)

Zb11

 

VivadoのXDCファイルを読み込んで、ロジアナを起動してみると、どうやらZYNQのマイコン部分が動いてDDR3メモリに常にアクセスが行われているのがわかります。

Zb12

 

sun

次にZYNQのPL部へ、書き込みをしてみましょう。

MITOUJTAGでZYNQをクリックして、書き換えボタンを押し、Bitファイルを選択して「開始」を押します。

Zb13

 

ほんの一瞬でBitファイルが転送されます。1秒かかりません。あまりにも早いので画面キャプチャができないほどです。

Zb14_2

ロジアナで見てみると、H11番ピン(GPIOのピンヘッダ)に設定したI/OからLEDチカチカ用の信号が出ているのがわかります。

Zb15

 

Zynqberry0526_2

できた!

sun

ZynqBerryでLEDチカチカをする際に迷った点を2つ。

  • ZynqBerryにはユーザ用LEDがない。そのため、LEDを自分で用意して適当なGPIOにつなぐ必要がある
  • ZynqBerryはPLにクロックが入っていない。PSが起動した状態でFCLKをもらう必要がある。(PLだけの完全なスタンドアローン動作はできない)

LEDチカチカ用のVivadoプロジェクトは近日中に公開します。

Zb_scan

 

MITOUJTAGの3D化

2016.05.11

また別のアルバイトの学生さんが、MITOUJTAGの3D化をだいぶん進めてくれました。

とてもいい感じの3D表示になってきました。

Mj3d

ちなみに表示させているICはZYNQのXC7Z030FBG676です。

昨年のMITOUJTAGオンラインと比べると、かなり速度的にも改善しています。JavaScriptではなくネイティブなプログラムだからでしょう。

来週にはバウンダリスキャンの結果で端子がチカチカ表示できるようになると思います。

BGAの端子が透けて見えたらいいですよね。 

 

MITOUJTAG BASIC/Pro 3.0をリリースしました

2016.04.27

お待たせしました。

ついに、MITOUJTAG 3.0をリリースしました。

Bannerb30Bannerp30


MITOUJTAGは 2003年度に未踏ソフトウェア創造事業で開発をスタートしてから、頻繁にバージョンアップしてきたのですが、バージョンアップ番号の上げ方が

0.2→0.24→1.0→1.2→1.24→1.25→1.5→2.0→2.1→2.3→2.4→2.5→2.6→2.9→3.0(たぶん)と、かなり控えめなので、14年目にして未だに3.0なのです。

各バージョンごとにかなり違いがあるので、実質的にはバージョン14くらいでしょう。

主な更新点は、

  • いままでの更新パッチを累積したことと
  • ユーザ用データのフォルダをマイドキュメント配下に変更したこと
  • ユーザが作ったEXEファイルからJTAGファンクションジェネレータを呼び出せるようにした
  • 複数のBLOGANA対応デバイスがつながっている場合のサポート
  • XILINX Artix-7の小さいもの(XC7A15,35)の書き込みサポート

などです。

また、今回からはインストールイメージのダウンロードもできるようにしました。

現在、MITOUJTAGをお使い(でライセンスの有効期間内の方)は、下記のページから無償でダウンロードできます。

https://www.tokudenkairo.co.jp/login2/download.php

Mj300_3

ダウンロードで迅速に提供しますが、もちろん従来どおりCD-ROMも付けて販売します。

Mjbpack

sun

今回の目玉機能である、MITOUJTAG ProのJTAGファンクションジェネレータのリモート化を使うには、ファイルの「アプリケション・データ・フォルダを開く」を行ってください。

Mj300

MITOUJTAGのデータフォルダが入ったフォルダが開きます。

 

Mj300_1_2

この中のAjfgRemoteを開きます。

Mj300_2

中にはAjfgClient.dllとAjfgClient.libとAjfgClient_vc.libとjtagscr.hが入っています。

VisualC++で使う場合には、

cl userprogram.cpp AjfgClient_vc.lib

でコンパイルします。

BorlandC++で使う場合には、

cl userprogram.cpp AjfgClient.lib

でコンパイルします。

これで、貴方の作ったプログラムからJTAGスクリプトを呼び出すことができます。

JTAGスクリプトの書き方は、一昨日のブログ

http://nahitafu.cocolog-nifty.com/nahitafu/2016/04/mram-74d8.html

を参考にしてください。

sun

今回からダウンロードでの提供を開始した理由は、CD-ROMというメディアは時代遅れなのと、CD-ROMが存在しないPCも多いことなどです。

ですが、特電はCD-ROMを無くすことはしません。

「ダウンロードのみ」という形のないものだと、大手の企業様や学校などでは検収がやりづらいと思われるからです。

従来のように「CD-ROMに入ったソフト」と、「JTAGケーブル」と「印刷されたマニュアル」があればどの企業様でも問題なく検収を上げていただくことができるでしょう。

でも、ダウンロード販売ONLYにしてクレジット払いとかのイマドキ風にするとどうでしょう?

大手様や学校様では、形がないものに対する検収が難しいかもしれません。帳簿上は、機械工具器具、備品消耗品ではなく、支払手数料(会計規則上クラウドサービスのような物を伴わないサービスは支払手数料として仕訳するルールになっている)になるのかもしれません。

実際に私も支払手数料という仕訳は好きではありませんし、この仕訳を避けたくなる会社もあるはずです。

だから、CD-ROMをJTAGケーブルと紙のマニュアルはなくさないことにしているのです。

 

MRAMをバウンダリスキャンで操作する

2016.04.25

MRAMというメモリがあります。何やら磁気を利用したメモリらしいのですが、メリットは、

  • 書き換え回数の制限がない(FlashROMより優れている)
  • SRAM並に高速(DRAMより優れている)
  • 不揮発性

ということらしいです。

さて、今月、MITOUJTAGをお買い上げいただいたお客様から、バウンダリスキャンでMRAMを書き換えできないかという問い合わせをいただいたので、実際に試してみました。

私はMRAMの単品は持っていなかったのdですが、ちょうどヒューマンデータ製のFPGAボード(XCM-022)がMRAMを搭載していて、そのXCM-022を乗せた試作ボードがあったので、そのシステムを使ってMRAMの実験をしてみることにしまいた。

Np1080

MITOUJTAG Proには、アドバンスドJTAGファンクションジェネレータ(AJFG)、JTAGスクリプトといって、FPGAの端子をC++言語で書いたとおりに動かす機能があります。

ここでは、そのJTAGスクリプトを使ってFPGA(XC7K160T)の端子を動かし、MRAMにアクセスしてみました。

まず、仕様しているMRAMは、Everspin社のMR2A16AMA35だそうです。

※このEVERSPINという社名を聞いて思わず笑ってしまいました。素晴らしい社名です。とてもセンスがあります。

データシートを見て驚いたのは、SPI ROMやDDR2 SDRAMのようなコマンドがないこと。普通のSRAMと同じように使えばよいのです。これは楽だ・・・・

まずは、ピン配置ファイルを作ります。俗に言うUCFです。

NET "MRAM_WE" LOC="F21";
NET "MRAM_OE "LOC="J22";
NET "MRAM_DQU<15>" LOC="U20";
NET "MRAM_DQU<14>" LOC="T20";
NET "MRAM_DQU<13>" LOC="R19";
NET "MRAM_DQU<12>" LOC="P19";
NET "MRAM_DQU<11>" LOC="P20";
NET "MRAM_DQU<10>" LOC="N19";
NET "MRAM_DQU<9>" LOC="L21";
NET "MRAM_DQU<8>" LOC="K21";
NET "MRAM_DQL<7>" LOC="L20";
NET "MRAM_DQL<6>" LOC="K19";
NET "MRAM_DQL<5>" LOC="L18";
NET "MRAM_DQL<4>" LOC="K16";
NET "MRAM_DQL<3>" LOC="V17";
NET "MRAM_DQL<2>" LOC="J19";
NET "MRAM_DQL<1>" LOC="M16";
NET "MRAM_DQL<0>" LOC="J20";
NET "MRAM_CE" LOC="F20";
NET "MRAM_BE<1>" LOC="J21";
NET "MRAM_BE<0>" LOC="K22";
NET "MRAM_A<18>" LOC="N18";
NET "MRAM_A<17>" LOC="P17";
NET "MRAM_A<16>" LOC="R17";
NET "MRAM_A<15>" LOC="M21";
NET "MRAM_A<14>" LOC="U16";
NET "MRAM_A<13>" LOC="M20";
NET "MRAM_A<12>" LOC="K17";
NET "MRAM_A<11>" LOC="H20";
NET "MRAM_A<10>" LOC="R18";
NET "MRAM_A<9>" LOC="T19";
NET "MRAM_A<8>" LOC="M18";
NET "MRAM_A<7>" LOC="M17";
NET "MRAM_A<6>" LOC="N20";
NET "MRAM_A<5>" LOC="G22";
NET "MRAM_A<4>" LOC="H22";
NET "MRAM_A<3>" LOC="E22";
NET "MRAM_A<2>" LOC="G20";
NET "MRAM_A<1>" LOC="G21";

このUCFをMITOUJTAGで処理すると、↓のようなピン定義ファイルになります。

MRAM_WE     F21 
MRAM_OE     J22 
MRAM_DQ     U20 T20 R19 P19 P20 N19 L21 K21 L20 K19 L18 K16 V17 J19 M16 J20 
MRAM_CE     F20 
MRAM_BE     J21 K22 
MRAM_A      N18 P17 R17 M21 U16 M20 K17 H20 R18 T19 M18 M17 N20 G22 H22 E22 G20 G21 

それから、JTAGスクリプトを書きます。

#include "default.h"
#include "conio.h"

JEXPORT int jmain() {
	j_bypass();
	j_sample();j_extest(); // AJFGで端子を操作するにはこの行を有効にしてください

	int addr = 0;

	MRAM_WE  = "1";	
	MRAM_OE  = "1";	
	MRAM_CE  = "1";	
	MRAM_BE <= "00";	
	MRAM_CE  = "0";	
	printf("Skip MRAM write (Y/n) ?\n");
	if(getch() == 'n'){
		printf("Write to MRAM...\n");
		for(int addr=0;addr < 1000;addr++) {
			MRAM_A   = addr;
			MRAM_DQ  = ~addr;
			MRAM_WE <= "0";	
			MRAM_WE <= "1";	
		}
	}
	MRAM_OE  = "0";	
	MRAM_CE  = "0";	
	MRAM_DQ <= "Z";	
	printf("Read from MRAM...\n");
	for(int addr=0;addr < 1000;addr++) {
		MRAM_A  <= addr;
		if((addr & 7) == 0) printf("%08lx : ",addr);
		printf("%04x ",(int)MRAM_DQ);
		if((addr & 7) == 7) printf("\n");
	}
	MRAM_OE <= "1";	
	MRAM_CE <= "1";	

	return 0;
}

普通のC言語のように見えますが、高位合成じゃなくてJTAGスクリプトです。ここで書いたMRAM_CEやMRAM_Aといった変数が変化すると、実際のFPGAの端子が動くというものです。

上のプログラムを実行すると、DOSプロンプトが開いて、このように表示されます。

Mram2

そして、そのときの端子の波形がJTAGロジアナに表示されます。

Mram1

赤い波形が出力ピン、緑の波形は入力ピンです。書いてから読んでいるので、DQ端子は赤から緑に変化しているのがわかります。

 

結論をいうと、SRAMと同じ手順でアクセスできました。これは、DDRメモリやFlashROM、SPI Flashと比べてはるかに楽です。この手軽さには、かなり感動しました。

 

私はMRAMの特徴(メリット)に

  • 伝統的なパラレルSRAMと同じ手順で簡単にアクセスできる

もあると、声を大きくして言いたいです。