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,所以系统报错。
文章评论(0条评论)
登录后参与讨论