MITOUJTAGとは何か
製品について
ご購入を検討中の方へ
サポート
JTAGについて
JTAG技術サービス(有料)
JTAG開発日記
JTAGを熱く語る
2016年のJTAG開発の記録
MITOUJTAGの波形エクスポート機能
2016.12.25
MITOUJTAG Lightに搭載の「波形エクスポート機能」について説明します。
この機能はJTAGロジックアナライザでキャプチャ波形を、CSVやVCD形式で出力するものです。今までもVCD形式(Value Changed Dump)で出力することはできたのですが、VCDのビューワーで良いものがなかったので、CSVで出力する機能を新たに作りました。
実際のやり方を説明します。
まず、適当なFPGAボードを接続します。ここではZynqBerryを例に説明します。
FPGAの端子が可視化できたら、ロジアナ画面を開いて、少し波形をキャプチャしてみます。
はい。DDR3メモリの波形が見えました。なんだか激しく動いています。
ここで、保存ボタンの横の▼を押すと、「ファイルをエクスポートします」というのがあるので、このエクスポートを選びます。
すると、ファイルを保存するダイアログが出るので、適当なファイル名を付けて保存します。
![]()
保存したファイルはユーザ・データ・フォルダの下のMITOUJTAGフォルダにあります。ユーザ・データ・フォルダとは、Windows7や8ではマイドキュメントなのですが、今後のWindowsではマイドキュメントがどこに移動させられるかわかりません。
そこで、ファイルメニューの「ユーザ・データ・フォルダを開く」を選択すると、一発で保存したフォルダが開くようにしました。
これをExcelで開いて見てみましょう。
このように、時間情報(一番左の列)と、値のデータがベタな数字で入っています。
これをグラフ化して、一部分だけ見てみると、
このように、ロジアナで取った波形を、すぐにExcelでグラフ化することができます。
![]()
この機能が真価を発揮するのは、アナログ的なデータを見る場合です。ADCの値でもいいですし、FPGAが内部で計算している数値計算の途中経過でも良いです。ロジアナの画面で波形が見れれば同じようにエクスポートできます。
下の波形は、18bit ADCでキャプチャしたデータです。
このデータを見るためのFPGAのアプリケーションはまだ作っていないので、ロジアナで数字として確認するより他ありません。システムの開発中では、アプリケーションソフトを作りこむ前に、FPGAの中の数字をグラフ化したいということは良くあります。
そこで、CSVでエクスポートして、エクセルに取り込んでみました。
この表形式のデータを範囲選択し、挿入→グラフとやると・・
このとおり、ADC値の時間変化を一瞬でグラフにすることができました。
波形がカクカクしているのは、ロジックは250MHzで動いていて、ADCの波形は5MHzでやってくるため、50回に1回しか変化しないためです。
![]()
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でも使用できないかという問合せがあったので、試してみました。
というか、インターンで来ている学生さんに試してもらいました。
![]()
結論からいうと、このままではダメでした。
- インターフェースには型の制限がある
http://japan.xilinx.com/support/documentation/sw_manuals_j/xilinx11/ism_r_mixed_lang_boundary_mapping_rules.htm - VHDLの場合、portにInteger型を使うとVerilogからモジュールをインスタンス化できない(verilogでinteger型を指定したとしても不可)
という理由によるものでした。
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のプロジェクトマネージャでは
という期待通りの階層構造が表示され、blogana2.vhdが下位モジュールとして認識されるようです。
論理合成したら、出来上がったBitファイルを書き込みます。
そして、ロジアナ画面を開き、BLOGANAボタンを押すと、ダイアログが開き、
BLOGANAを組み込んだソースファイルを指示されます。このダイアログに書かれているサンプリング周波数、ビット幅、データ長は、GenreicとPortで設定したSAMP_FREQ、BIT_WIDTH、SAMPLE_WIDTHです。
Verilogファイルを読むこむと、
assign blogana_din[*:*] = ○○○
で書いた行を自動的に解析して、信号に名前を付けてくれます。
バスはまとめてバスにしてくれて、名前まで付けてくれるので、意外と便利ですよ。
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内部の波形をキャプチャします。
一番上の正弦波のようになっている信号が、ADCから受け取った波形です。
十進数にしてみるとこんな感じです。
まず、MITOUJTAGの画面左で、ツリーになっているところにあるロジアナ波形を右クリックして、エクスポートを選びます。
そうしたら、vcdファイルの形式でエクスポートします。
VCDというのは、Value Changed Dumpの略で、標準的な波形記録フォーマットです。
VCDは、信号名を謎の記号に変換しますが、2進数の部分はこう書かれるようです。

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

MITOUJTAGのロジアナで得られた波形をこのようなテキストに落とせるとのことです。
ちょっと大変ですが、専用のキャプチャ用アプリを作らなくても、FPGAの中でバスに出ていれば、それをMITOUJTAGで取り込んで他のアプリにエクスポートできるので、開発途中では便利な方法だと思います。
ZynqBerryをLEDチカチカして、JTAGで観察してみた
2016.05.24
今、話題沸騰のZynqBerryをLEDチカチカさせてみます。
本来の使い方では
-
VivadoでPLとPSを作る
-
起動ファイルを作る
-
フラッシュROMに書き込む
ということになるのでしょうが、2や3の手順はZynqBerryの専用のツール(CMDファイル)を使うようなので、動かない場合にどこで間違えたのかがわからなくなってしまいます。
そこで、今回はMITOUJTAGを使ってPLだけ書き換えてみようと思います。これならBitファイルが出来ているのか、その後の工程で間違えているのかの切り分けが簡単です。
まず、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です。
![]()
MITOUJTAGを起動したら、オプション→XILINX Cable Serverの設定を行います。

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

EXEファイルを自動的に検索する・・のパスは、XILINXのISE(のラボツール)が入っているパスを選択しておきます。CSEサーバのバージョンは14.5で構いません。
そして、メイン画面のケーブルアイコンの上で右クリックして、ケーブルの接続を選びます。

数ある対応ケーブルの中から「Digilent JTAG-HS2 or onboard-JTAG」を選びます。
OKを押すと、Digilentケーブルが認識されます。

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

2個のデバイスが検出された旨が表示されるので、最初のデバイスにはZYNQ7000_ARM_DAPを選びます。
2個目のデバイスはXC7Z010_CLG225を選びます。
実際には、XA7Z010やXC7Z010Iを選んでも中身は同じなので問題はありませんが、225ピンのものを選ぶようにしてください。
画面上に2つのデバイスが表示されます。右の○がいっぱいあるのが、XC7Z010のBGAの端子を表しています。可視化ボタンを押すと・・
このように、1つ1つのBGAの端子がHレベルなのか、Lレベルなのかが画面上でわかります。
(まだ未完成ですが、3D化も開発中です。)
VivadoのXDCファイルを読み込んで、ロジアナを起動してみると、どうやらZYNQのマイコン部分が動いてDDR3メモリに常にアクセスが行われているのがわかります。
![]()
次にZYNQのPL部へ、書き込みをしてみましょう。
MITOUJTAGでZYNQをクリックして、書き換えボタンを押し、Bitファイルを選択して「開始」を押します。
ほんの一瞬でBitファイルが転送されます。1秒かかりません。あまりにも早いので画面キャプチャができないほどです。
ロジアナで見てみると、H11番ピン(GPIOのピンヘッダ)に設定したI/OからLEDチカチカ用の信号が出ているのがわかります。
![]()
ZynqBerryでLEDチカチカをする際に迷った点を2つ。
- ZynqBerryにはユーザ用LEDがない。そのため、LEDを自分で用意して適当なGPIOにつなぐ必要がある
- ZynqBerryはPLにクロックが入っていない。PSが起動した状態でFCLKをもらう必要がある。(PLだけの完全なスタンドアローン動作はできない)
LEDチカチカ用のVivadoプロジェクトは近日中に公開します。

MITOUJTAGの3D化
2016.05.11
MITOUJTAG BASIC/Pro 3.0をリリースしました
2016.04.27
お待たせしました。
ついに、MITOUJTAG 3.0をリリースしました。


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
ダウンロードで迅速に提供しますが、もちろん従来どおりCD-ROMも付けて販売します。
今回の目玉機能である、MITOUJTAG ProのJTAGファンクションジェネレータのリモート化を使うには、ファイルの「アプリケション・データ・フォルダを開く」を行ってください。
MITOUJTAGのデータフォルダが入ったフォルダが開きます。
この中のAjfgRemoteを開きます。
中には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
を参考にしてください。
![]()
今回からダウンロードでの提供を開始した理由は、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の実験をしてみることにしまいた。
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プロンプトが開いて、このように表示されます。
そして、そのときの端子の波形がJTAGロジアナに表示されます。
赤い波形が出力ピン、緑の波形は入力ピンです。書いてから読んでいるので、DQ端子は赤から緑に変化しているのがわかります。
結論をいうと、SRAMと同じ手順でアクセスできました。これは、DDRメモリやFlashROM、SPI Flashと比べてはるかに楽です。この手軽さには、かなり感動しました。
私はMRAMの特徴(メリット)に
- 伝統的なパラレルSRAMと同じ手順で簡単にアクセスできる
もあると、声を大きくして言いたいです。










































