原创 【博客大赛】虚拟JTAG调试小问题之二:符号转二进制数据

2013-8-16 11:45 2357 17 17 分类: 测试测量 文集: Virtual JTAG

TCL所有操作数默认都是字符串,如果需要将一个数据通过虚拟JTAG传到FPGA,就必须先将其转化成二进制(或者十六进制)格式比特流。转化的方法如下所示:

 set par_val [int2bits $val];#将整型数转换成二进制数

我们现在要谈论的问题并不是上述转化函数,而是转化后par_val的位宽问题,实际上TCL代码中没有硬件语言比如vhdl中矢量那样定义信号位宽的概念,上述转化后,根据具体的整数获得位宽,比如整数7转化后位宽是3,而整数8转化后位宽是4.假如我们通过Virtual JTAG想FPGA发生数据的命令如下所示:

device_lock -timeout 10000
 device_virtual_ir_shift -instance_index 0 -ir_value 5 -no_captured_ir_value
         
 device_virtual_dr_shift -instance_index 0 -dr_value $par_val -length 32 -no_captured_dr_value
 device_unlock

 

也就是说par_val在被传送的时候位宽应该要是32-bit,所以par_val在进行传输之前还需要通过补0让其位宽符合要求,代码如下所示:

set diff [expr {32 - [string length $par_value]}]
     .top.t insert end "\n The 's value is $diff\n"   
     if {$diff != 32 && $diff !=0} {
          set par_value [format %0${diff}d$par_val 0];#通过在par_val左边补0,将其转换成32bit数据(注意这里不改变数据大小)。
     }

 

这里我要说的问题出现在这句:“if {$diff != 32 && $diff !=0}”,最开始的条件并不是这样,而是“if {$diff != 32}”。很长一段时间这是没有问题的,因为大部分时候要传输的数据不会真的达到32-bit这么长。只是最近突然发现调试平台中传输数据的时候报错,经查原因就是被传输的参数达到32-bit,我们来看看为什么达到32-bit的时候 为什么报错呢。如果参数达到32-bit,那么diff的值就等于0,这时候如果判断条件没有剔除这种情况,那么补0语句还是会补一个0,那么造成par_val变成了33bit,而不是32bit,所以系统报错。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
17
关闭 站长推荐上一条 /3 下一条