TCL语言小试
搞芯片的要是不会tcl真的有点说不过去,虽然严格上我并不算是搞芯片的,但是tcl还是有必要了解一下的,因为FPGA里面还是要用到很多tcl脚本的。下面我们就根据一个具体的例子来看看tcl是怎么读取二进制文件的。
先看需求
现在我们要把一个二进制的文件通过tcl读取并转换成一个列表,二进制文件通常是我们程序生成的一个bin文件,转换成列表之后可以用于更新Memory或者仿真等操作。
程序编写
都说Google是最好的教程,学习tcl也不例外,这里的程序基本都是Google来的,tcl本身的文件IO都是默认支持文本文件的,不像Python等语言打开文件的时候有b
的选项,tcl里面需要通过一个fconfigure $fp -translation binary
把我们读文件的方式转换成二进制读写的方式,稍显复杂,但是Google一下很容易就能找到,所以也不是什么问题。
这里我们先把最终的程序贴出来,然后一点点分析一下:
proc binary2list {binary_path} {
set fp [open $binary_path]
fconfigure $fp -translation binary
set binary_data [list]
set data [read $fp 4]
while { $data != "" } {
# i for signed iu for unsigned little-end
# I for big-end, H for big-end hex
binary scan $data "iu*" d
lappend binary_data $d
set data [read $fp 4]
}
close $fp
return $binary_data
}
首先为了通用性,这里定义了一个过程,也就是我们常说的函数,要注意tcl里面比较少用()
,过程参数,条件判断等等都是{}
,这个和很多语言都不一样,一定要注意。函数的参数我们只有一个二进制文件的路径,首先我们还是用常规的方法打开文件,然后通过fconfigure $fp -translation binary
将文件读取的方式转换成二进制的方式,往下是定义一个binary_data
的列表用于保存结果,然后通过set data [read $fp 4]
读取4个字节的数据。
注意tcl读取文件的时候,即使到了末尾也不会出现错误,只是读到的数据是空的而已,所以我们要对读到的数据进行判断,如果是""
说明二进制文件已经全部读完。读到二进制数据之后,我们要将二进制数据转化成整型,这一步是通过binary scan
实现的,binary scan $data "iu*" d
这一步就是将data
根据Little-endian转换成无符号整型,并将结果保存到d变量,这里iu*
就是转换方式的一个标识符,i代表Little-endian的有符号整型,I代表Big-endian的有符号整型,这个里面还是有些麻烦的,具体可以参考相关文档。最后我们将转换好的结果放到列表并读取新的数据。
以上就是一个简单的tcl读取二进制文件的例子,相比而言稍显复杂,但是结果Google之后并不太难,关键还是在于动手。
最后更新于 2019-12-24 22:19:44 并被添加「脚本 FPGA HAPS 编程」标签,已有 4370 位童鞋阅读过。
本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。