原创 项目日志4——AD调试(Virtual JTAG)

2010-2-28 17:18 5577 8 16 分类: FPGA/CPLD

项目日志4——AD调试(Virtual JTAG


         接着上一篇博文里提到了基于Quartus II的一些在线调试方法,这一篇博文里将介绍基于Virtual JTAG的调试方法。对于Virtual JTAG,特权同学也很陌生,在这之前只记得riple兄的博客公告里有一句“Virtual JTAG是一个非常实用的工具,希望更多的朋友把它用起来”。一直以来对tcl不是很熟悉(找了不少资料,但是一直没好好静下心来学习),对Virtual JTAG也不是很熟悉。不过借着这次机会,特权同学好好感受了回Virtual JTAG的很好很强大。


         关于Virtual JTAG的资料,特权同学主要还是参考了官方的一些文档:


ug_virtualjtag.pdfVirtual JTAG Megafunction User Guide


AN 39_ IEEE 1149.1 (JTAG) Boundary-Scan Testing in Altera Devices (PDF) .pdf


         当然,英文看得一头雾水找不到眉目的时候,google一下,最终还是riple兄的数篇关于Virtual JTAG的文章(http://blog.ednchina.com/riple/10862/category.aspx)帮了我很大忙。这里要表示感谢,因为在网络上有很多很多像riple兄这样无私的人,才让我们的学习变得简单了。


         这个Virtual JTAG确实也不算什么新奇玩意,可以简单的理解,它和特权同学项目日志2里提到的利用串口来调试的方法思路是一致的。只不过相对于使用Altera支持Virtual JTAG器件的用户来说,如果掌握了这个调试方法,可以省却很多时间和精力(当然也包括额外调试用外设的考虑)。从硬件框图上来理解这个东西,可以如图1所示。和PC机连接只有使用现有的FPGAJTAG端口,不需要任何额外的电路,这就是它最大的优势。另外,在我们原有的工程中例化一个Virtual JTAGIP核,利用这个IP核给出的接口来传输数据即可。用户要做的主要任务就是设计符合传输协议的逻辑,适时的将数据接收进来或者传输出去。这一点上和之前提到的串口方法类似。但是,在PC端,用户就可以利用Quartus II提供的tcl支持来定制化自己需要的处理方式。


<?xml:namespace prefix = v ns = "urn:schemas-microsoft-com:vml" /><?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:office" />


点击看大图


1


         看起来也是蛮简单的东西,不过由于对tcl不熟悉,特权同学也是琢磨了两天才搞定一个基本的数据传输。下面将做一点简单的介绍,希望后来者能够少走弯路,快速上手。


1、  MegaWizard中定义一个Virtual JTGA,然后在工程中进行例化。


2、  在工程中设计专门针对Virtual JTGA接口控制的逻辑,该实例中只是要输出一个8位的寄存器adc_din,只要上位机发送2’b11的地址,我们就要把该数据逐位传送出去。其基本代码如下:


module debug_ctrl(


            clk,rst_n,


            adc_din//,source_sig


        );


input clk;      //25MHz


input rst_n;    //低电平复位信号


 


input[7:0] adc_din; //模数转换数据寄存器0-256  


 


reg tdo_r;  //输出数据TDO


 


wire[1:0] ir_in;    //输入IR数据


wire tck_in;    //输入时钟TCK


wire tdi_in;    //输入数据TDI


 


wire vs_cdr_in;     //Virtual Capture DR


wire vs_cir_in;     //Virtual Capture IR


wire vs_e1dr_in;    //Virtual Exit1 DR


wire vs_e2dr_in;    //Virtual Exit2 DR


wire vs_pdr_in;     //Virtual Pause DR


wire vs_sdr_in;     //Virtual Shift DR


wire vs_udr_in;     //Virtual Update DR


wire vs_uir_in;     //Virtual Update IR


 


vir_jtag    vir_jtag_inst (


                    .ir_out ( ir_out_r ),


                    .tdo ( tdo_r ),


                    .ir_in ( ir_in ),


                    .tck ( tck_in ),


                    .tdi ( tdi_in ),


                    .virtual_state_cdr ( vs_cdr_in ),


                    .virtual_state_cir ( vs_cir_in ),


                    .virtual_state_e1dr ( vs_e1dr_in ),


                    .virtual_state_e2dr ( vs_e2dr_in ),


                    .virtual_state_pdr ( vs_pdr_in ),


                    .virtual_state_sdr ( vs_sdr_in ),


                    .virtual_state_udr ( vs_udr_in ),


                    .virtual_state_uir ( vs_uir_in )


                );


 


wire cmd_dout = (ir_in[0] & ir_in[1]);  //ir==2'b11


 


reg[7:0] tdo_db;    //tdo输出缓存寄存器


reg bypass_reg;     //旁路寄存器,没有针对这个virtual_jtag的操作就旁路


 


always @(posedge tck_in)


    if(vs_cdr_in && cmd_dout) tdo_db <= adc_din;


    else if(vs_sdr_in && cmd_dout) tdo_db <= {tdi_in,tdo_db[7:1]};  //移位输出操作


 


always @ (posedge tck_in) begin


    bypass_reg = tdi_in;


end


 


always @(vs_sdr_in or tdo_db or bypass_reg) //数据输出


    if(vs_sdr_in) tdo_r <= tdo_db[0];


    else tdo_r <= bypass_reg;


 


endmodule


         对于上述代码,其实要使用的Virtual JTGA接口并不多。尤其需要注意的是数据的输出tdo_r,特权同学在这上面吃了不少苦,参考了不少代码才发现其中的玄机。也就是说tdo_r在没有有效输出数据可传送的时候,需要回送打了一拍的由tdi发送过来的数据。


3、  编译工程,下载代码。


4、  写一段tcl脚本,在Quartus IItcl console上运行,主要是发一个获取FPGA中数据的命令。其脚本如下:


# List all available programming hardwares, and select the USBBlaster.


# (Note: this example assumes only one USBBlaster connected.)


puts "Programming Hardwares:"


foreach hardware_name [get_hardware_names] {


puts $hardware_name


if { [string match "ByteBlasterII*" $hardware_name] } {


set ByteBlasterII_name $hardware_name


}


}


puts "\nSelect JTAG chain connected to $ByteBlasterII_name.\n";


# List all devices on the chain, and select the first device on the chain.


puts "\nDevices on the JTAG chain:"


foreach device_name [get_device_names -hardware_name $ByteBlasterII_name] {


puts $device_name


if { [string match "@1*" $device_name] } {


set test_device $device_name


}


}


puts "\nSelect device: $test_device.\n";


# Open device


open_device -hardware_name $ByteBlasterII_name -device_name $test_device


# The follow virtual JTAG IR and DR shift sequence engage with


# the example virtual JTAG instance.


#


# Two instructions: SAMPLE (1) FEED (2)


# SAMPLE instruction samples a 8-bit bus; the captured value shows the


# number of sample performed.


# FEED instruction supplies a 8-bit value to the logic connected to this


# instance.


# Both data registers corresponding to the IR are 8 bit wide.


# Send SAMPLE instruction to IR, read captured IR for the sampling


# number.


# Capture the DR register for the current sampled value.


device_lock -timeout 10000


puts "Current LED Value (sample #[device_virtual_ir_shift -instance_index \


0 -ir_value 3]): \


[device_virtual_dr_shift -instance_index 0 -length 8 -value_in_hex]"


device_unlock


# Send FEED instruction to IR, read a two-digit hex string from the


# console,


# then send the new value to the DR register.


# puts "\nType in 2 digits in hexadecimal to update the LED:"


# gets stdin update_value


# device_lock -timeout 10000


# device_virtual_ir_shift -instance_index 0 -ir_value 3 \


# -no_captured_ir_value


# device_virtual_dr_shift -instance_index 0 -length 8 -dr_value \


# $update_value -value_in_hex -no_captured_dr_value


# device_unlock


# Close device


close_device


         这段代码也是根据官方的一个实例改写,详细的说明还请大家参考riple兄的文章。


5、  将该tcl脚本文件保存在工程目录下,然后在tcl console中输入:


quartus_stp -t a.tcl


得到了返回的数据:


Info: *******************************************************************


Info: Running Quartus II SignalTap II


    Info: Version 9.1 Build 222 10/21/2009 SJ Web Edition


    Info: Copyright (C) 1991-2009 Altera Corporation. All rights reserved.


    Info: Your use of Altera Corporation's design tools, logic functions


    Info: and other software and tools, and its AMPP partner logic


    Info: functions, and any output files from any of the foregoing


    Info: (including device programming or simulation files), and any


    Info: associated documentation or information are expressly subject


    Info: to the terms and conditions of the Altera Program License


    Info: Subscription Agreement, Altera MegaCore Function License


    Info: Agreement, or other applicable license agreement, including,


    Info: without limitation, that your use is for the sole purpose of


    Info: programming logic devices manufactured by Altera and sold by


    Info: Altera or its authorized distributors.  Please refer to the


    Info: applicable agreement for further details.


    Info: Processing started: Sun Feb 28 16:28:53 2010


Info: Command: quartus_stp -t a.tcl


Programming Hardwares:


ByteBlasterII [LPT1]


 


Select JTAG chain connected to ByteBlasterII [LPT1].


 


 


Devices on the JTAG chain:


@1: EP2C8 (0x020B20DD)


 


Select device: @1: EP2C8 (0x020B20DD).


 


Current LED Value (sample #0):  84


Info: Evaluation of Tcl script a.tcl was successful


Info: Quartus II SignalTap II was successful. 0 errors, 0 warnings


    Info: Peak virtual memory: 75 megabytes


    Info: Processing ended: Sun Feb 28 16:28:54 2010


    Info: Elapsed time: 00:00:01


    Info: Total CPU time (on all processors): 00:00:01


上面的数据84H和实测结果一致,并且多次验证无误。


 


         在初步掌握这项技巧后,如果再在tcl编程方面下点功夫,使用Virtual JTGA带来的便利会更加明显。我想我有些迫不及待的希望尝试这个便利了。


 


 

文章评论8条评论)

登录后参与讨论

用户1713276 2016-3-4 16:46

2016年3月4日已阅

用户1738735 2015-7-21 22:24

特权前辈,我在Tcl Console里面输入 puts "Programming Hardwares:" foreach hardware_name [get_hardware_names] { puts $hardware_name if { [string match "USB-Blaster*" $hardware_name] } { set usbblaster_name $hardware_name } }这个语句后就会出现错误, Error:ERROR: Quartus II Tcl command "get_hardware_names" is only available for use in the following executables: Error: quartus_sh Error: quartus_stp Error: while executing Error:"get_hardware_names" Error: invoked from within Error:"foreach hardware_name [get_hardware_names] {puts $hardware_name if { [string match "USB-Blaster*" $hardware_name] } {set usbblaster_name $hardware_nam..." 折腾了好久,没接触过Tcl脚本文件,正在学习中,网上也找不到相关资料,不知道前辈能否帮忙解决个疑惑,非常感谢!

用户1831675 2015-3-28 10:27

说的很好。

ilove314_323192455 2011-4-2 11:41

你可以试试啊

用户1179795 2011-4-2 11:03

假如要用tcl来模拟test bench中类似@clk 的等待一个时钟沿的动作,该如何实现? 不知riple兄有没有碰到过? 谢谢!

用户249726 2010-12-5 21:33

谢谢特权 还想请教下在你TCL语言中 这句: device_virtual_ir_shift -instance_index 0 -ir_value 3 index的0和value的3是如何取的?谢谢 麻烦你了

ilove314_323192455 2010-12-3 09:19

我的测试中不需要PC的JTAG端下发数据给FPGA,所以不定义,你需要可以在tcl编程中处理。

用户249726 2010-12-2 20:37

想请教下 例化VJI时候 ir_out_r寄存器为什么没有声明 它内部值是多少? 我在RTL视图上看它的输入时1'h1是怎么回事? 谢谢

用户251222 2010-4-27 11:20

厉害,不知道xilinx的BSCAN怎么用的,想学一下,看了一些资料还是没有头绪

用户834612 2010-4-6 08:55

由于这两天正在测试AD,所以把特权同学的文档都看了一下。前些日子,卖了特权同学的板子,看来特权同学的视频,感觉很好。在此,向和特权同学一样,把自己学习的东西和大家共同分享的前行者们表示感谢!
相关推荐阅读
特权ilove314 2016-06-30 21:16
例说FPGA连载6:FPGA开发所需的技能
例说FPGA连载6:FPGA开发所需的技能 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   前面的文字已经做了很多铺垫,相信读...
特权ilove314 2016-06-28 21:09
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-28 21:05
例说FPGA连载5:FPGA的优势与局限性
例说FPGA连载5:FPGA的优势与局限性 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   若要准确评估FPGA技术能否满足开...
特权ilove314 2016-06-26 22:11
例说FPGA连载4:FPGA语言与厂商介绍
例说FPGA连载4:FPGA语言与厂商介绍 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   Verilog与VHDL 说到FP...
特权ilove314 2016-06-23 21:26
例说FPGA连载3:FPGA与其它主流芯片的比较
例说FPGA连载3:FPGA与其它主流芯片的比较 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   FPGA、ASIC和ASSP...
特权ilove314 2016-06-21 20:32
例说FPGA连载2:FPGA是什么
例说FPGA连载2:FPGA是什么 特权同学,版权所有 配套例程和更多资料下载链接: http://pan.baidu.com/s/1c0nf6Qc   2015年伊始,Intel欲出资百亿美金收...
我要评论
8
8
关闭 站长推荐上一条 /2 下一条