原创 虚拟JTAG工具在FPGA调试中的应用(续二)

2006-11-3 17:29 8021 8 17 分类: FPGA/CPLD

四、 verilog代码分析 riple


    先把关键的verilog代码写在下面。完整的代码在最后,按照我的理解和习惯,对原示例代码的写法作了修改。 riple
wire [3:0] counter1;
reg   [3:0] feed_reg;     // 四位的DR寄存器,用于加载输入值


wire tdi, tck, cdr, cir, e1dr, e2dr, pdr, sdr, udr, uir;
reg   tdo, bypass_reg;
wire [1:0] ir_in;             // 两位的IR寄存器输出,来自my_vji_a
wire sample = ir_in[0];  // IR译码,2'b01表示SAMPLE命令 
wire feed   = ir_in[1];    // IR译码,2'b10表示FEED命令


reg [3:0] offload_reg;    // 四位的DR寄存器,用于输出


/* instantiation of the vji mega functionc */
my_vji_a VJI_INST(
 .ir_out (2'b0), // input to megafunction
 .tdo (tdo),      // input to mega function


 .ir_in (ir_in),   // output from mega function
 .tck (tck),      // output from mega function
 .tdi (tdi),        // output from mgafunction
 
 .virtual_state_cdr (cdr), // output from mega function
 .virtual_state_e1dr(e1dr), // "
 .virtual_state_e2dr(e2dr), //  "
 .virtual_state_pdr (pdr), //  "
 .virtual_state_sdr (sdr), // "
 .virtual_state_udr (udr), //  "


 .virtual_state_uir (uir), //  "
 .virtual_state_cir (cir)); // "


/* 1. Sample Instruction Handler */  
always @ (posedge tck)  // 针对SAMPLE指令的处理
  if ( sample && cdr )
    offload_reg <= counter1;
  else if ( sample && sdr )
    offload_reg <= {tdi, offload_reg[3:1]}; // 典型的移位寄存器操作(MSB to LSB),移位输出counter1的当前值


/* 2. Feed Instruction Handler */
always @ (posedge tck)  // 针对FEED指令的处理
  if ( feed && sdr )
    feed_reg <= {tdi, feed_reg[3:1]}; // 典型的移位寄存器操作(MSB to LSB),移位输入要赋给counter1的初始值
  
/* 3. Bypass register */  // 旁路寄存器,没有针对这个virtual_jtag的操作就旁路
always @ (posedge tck)
  bypass_reg = tdi;


/* 4. Node TDO Output */  // TDO输出选择器,根据IR的不同,选择不同的信号输出
always @ ( sample, feed, feed_reg[0], offload_reg[0], bypass_reg )
begin
  if (sample)
    tdo <= offload_reg[0];
  else if (feed)
    tdo <= feed_reg[0];   // Used to maintain the continuity of the scan chain. // 在移位输入时,也要保证jtag链路有输出
  else
    tdo <= bypass_reg; 
end


    上面代码中,/* Sample Instruction Handler */之后的代码是需要用户自己编写的代码,是使用virtual_jtag的精髓所在,一定要读懂。 riple


    sld_virtual_jtag 的说明中把TAP控制器的状态信号分为High level和Low level。示例代码中使用的是High level部分的信号。High level部分的信号又可以分为DR寄存器操作对应的一组状态信号(6个)和IR寄存器操作对应的一组状态信号(2个)。 riple


    1. DR寄存器操作对应的一组状态是:Capture_DR -> Shift_DR -> Exit1_DR -> Pause_DR -> Exit2_DR -> Update_DR。每一个状态对应一个*dr信号。 riple


    对于数据输出操作(此例中是SAMPLE命令,并行加载,串行输出),需要在Capture_DR状态把被采样的信号并行加载到DR寄存器中,在Shift_DR状态把DR寄存器串行输出到virtual jtag链路的tdo引脚上(同时串行载入tdi引脚的数据),然后遍历余下的状态并不做任何操作。这一过程就是代码中对offload_reg寄存器的操作。 riple


    对于数据输出操作(此例中是FEED命令,串行输入,并行加载),在Capture_DR状态不进行任何操作直接跳转到下一个状态,Shift_DR状态串行载入virtual jtag输入的数据,在Exit1_DR状态把获得的数据并行加载到目标寄存器上,然后遍历余下的状态并不做任何操作。这一过程就是代码中对feed_reg寄存器的操作。 riple


    2. IR寄存器操作对应的一组状态是:Capture_IR -> Shift_IR -> Exit1_IR -> Pause_IR -> Exit2_IR -> Update_IR。由于virtual jtag模块提供了并行的ir_in端口,简化了操作,所以只有首尾两个状态对应*ir信号。 riple


    在这个例子中,只用到了ir_in端口,没有用到IR操作对应的状态及输出信号。这也可以看作是virtual jtag的方便之处。 riple


    3. bypass_reg寄存器提供了jtag链路的第三条通路,在没有针对当前virtual jtag操作的情况下,tdi数据经过一个tck周期的延时输出到tdo引脚。 riple


    4. tdo引脚输出时,需要根据ir_in的取值选择三条通路中的一条,所以这部分代码也是需要用户设计的。  riple


    看懂了这个例子,对virtual jtag的基本输出和输入功能就掌握了。 riple


    下图是用lpm宏单元替换各个功能块后编译得到的RTL视图。相应的代码可以在此rar下载。点击看大图点击看大图。 riple


 

PARTNER CONTENT

文章评论9条评论)

登录后参与讨论

ash_riple_768180695 2009-8-13 12:59

第一句非常快就执行完了。这就像C语言的程序里,如果main函数里面没有一个无限循环的话,就直接执行完毕返回了。你的情况就是这样。其实没必要强求用bat,用shell也很好。

coyoo 2009-8-13 12:40

我的bat是这样写的: quartus_stp -t dc_fifo_vji.tcl quartus_stp -s 但是执行以后感觉第一句没有解析成功,还是要在shell下sourece dc_fifo_vji.tcl

ash_riple_768180695 2009-8-13 10:54

我想你的tcl文件中可能没有while{1}循环,不能实现和用户的交互,所以例子中采用shell方式运行,实现和用户交互。你如果想把例子改成bat方式运行的话,需要加入while{1}循环,或者就把quartus_stp -s写到bat里,利用shell完成用户交互。

ash_riple_768180695 2009-8-13 10:38

为什么要用*.tcl呢?你不知道文件在哪里么?pause一定要加在后面,否则你连怎么错的都不知道啊。

coyoo 2009-8-13 10:34

新版的第一个例子是跑起来了,但是我遇到一个无法全自动的问题。例子给出的tcl如果用quartus_stp -t *.tcl 无法解析,不知何故,只能分两步:1、quartus_stp -s进入shell; 2、在shell下source *.tcl. 这样才能正常执行。

ash_riple_768180695 2009-8-13 09:13

coyoo同学真是认真,谢谢你指出这个问题!两年前的ug第一版里面就是这个例子,现在第一版已经找不到了。你把新版本的看懂了,也写一篇文章说明一下吧。

ash_riple_768180695 2009-8-13 09:11

High level就是从Virtual JTAG角度需要的精简之后的信号,Low Level就是从Real JTAG角度看到的信号。对于Virtual JTAG操作来说,用High level就可以了。

coyoo 2009-8-12 17:17

“TAP控制器的状态信号分为High level和Low level”是什么意思? 你贴的“ sld_virtual_jtag 的说明”链接找不到了哦!!!

coyoo 2009-8-12 17:15

这个例子和最新的ug上的两个例子不同哦!!!!
相关推荐阅读
ash_riple_768180695 2015-12-18 11:06
学习示例程序:FPGA快速系统原型设计--敏捷实践
        学习与开发板配套的示例程序,是敏捷实践的起点。示例程序是厂商针对开发板上提供的硬件资源和接口量身定做的工程,可以展示其FPGA芯片的功能和性能特点。从示例程序入手最大的好处就是:示...
ash_riple_768180695 2015-11-03 16:46
开发板选取:FPGA快速系统原型设计--敏捷实践
    既然是“实践”,就不能只谈编码和仿真,必须要上板运行、调试。这个虚拟项目的目标是实现一块兼容Intel82574L以太网控制器的千兆网卡,需要运行在一块具备PCIe接口和10/100/10...
ash_riple_768180695 2015-10-22 12:41
开篇:FPGA快速系统原型设计--敏捷实践
    虽然借用了 “系统原型开发”的标题,本系列文章将围绕FPGA IP级别的开发这个主题展开,如果可能的话,将扩展至FPGA System级别的开发。     先上一篇PPT:RSPwFP...
ash_riple_768180695 2013-08-26 10:21
学习SystemVerilog(二)——学习它的理由
    学习SystemVerilog的理由也很多,我在阅读SystemVerilog for Design 和 SystemVerilog for Verification两本书前言的过程中,总...
ash_riple_768180695 2013-08-26 10:19
学习SystemVerilog(一)——不学习它的理由
    想要学习SystemVerilog已经很久了。曾经尝试通过Accellera网站上给出的LRM学习,怎奈内容众多,找不出入手点和重点,只能望而却步。虽然手头有三本SystemVerilog...
ash_riple_768180695 2011-06-26 23:20
Hardware-Assisted IEEE1588 Implementation Analysis
06/18/11 11:00:05 PM         最近一段时间在研究IEEE1588-2008精确时间同步协议(PTP)。该协议可以在软件中实现,如果需要提高时间同步...
我要评论
9
8
关闭 站长推荐上一条 /3 下一条