TCL脚本存取二进制文件应用举例
时间:02-23 10:53 阅读:1662次
*温馨提示:点击图片可以放大观看高清大图
简介:之前介绍了本人研究如何使用TCL脚本来存取二进制文件,这是因为我们在具体项目中实际使用得到,今天就给大家介绍下如何使用。
先来简单介绍下我们项目的基本要求吧,如图1所示,项目中有22个FPGA,每个FPGA存有3种表格,而每种表格都有6个block,每一个block的表格在实际产品使用的时候都有可能需要更新,这时候就需要生成表格,然后写入到FPGA,具体如何写入FPGA不是本文的内容,这里主要谈谈如何生成表格文件。
图1:二进制文件格式定义
图1中头和尾的内容就是单个32-bit数据,由于是预先定义好的,所以可以在代码中用常数概念,也即使用TCL脚本插入常数即可。而中间的LUT由于数据庞大,所以必须从另外的文件里读进来,由于每一次需要更新的LUT个数不一样,所以每次更新都需要单独生成。这个工作并不是fpga硬件工程师的任务,但是在最终产品交付之前,我又必须测试我的FPGA逻辑,所以必须自己产生文件进行测试。为了不打扰软件工程师,我自己使用TCL脚本来按照图1格式产生测试文件。
最终使用TCL脚本生成的工具如图2所示。
图2:脚本生成的产生LUT更新文件的工具
以下是插入Header的代码片段:
;##插入头
proc Ins_Header {} {
set lutfile [open "lut_file.dat" a+]
set header_file [open "header.txt" r]
fconfigure $lutfile -translation binary
gets $header_file line
set HeadSel [.par1 get]
set b [expr $line +$HeadSel]
set a [binary format "i1" $b]
puts -nonewline $lutfile $a
close $lutfile
close $header_file
}
上述代码是插入头的参考代码,我们看到在二进制文件中每次插入LUT之前先插入头,而头的具体内容则由菜单命令控制,不同的菜单命令针对不同的FPGA,一共22个FPGA.
图3显示的是一个已经生成的查找表的二进制文件,注意第一个32-bit数据为header,二进制数据格式是little-endian。
图3:二进制文件