先来简单介绍下我们项目的基本要求吧,如图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:二进制文件