一、背景描述
二、USR_ACCESSE2实现思路
三、在项目中如何使用?
四、测试验证
一、背景描述
在项目中,FPGA板卡中所运行的固件是哪个版本?是否支持最新功能?是否已经把bug给修复了?
很多时候FPGA调试都需要先确定版本号是否一致,当然实现方式很多,通用的方式开发寄存器,让软件提供一个版本界面,用于显示FPGA运行版本,这个寄存器通常是只读寄存器,更新的方式有两种:
一是手动更新,每次生成bit流文件和BIN文件时候,手动改写寄存器的默认数值,用于显示,这种方式取决于人,万一忘记修改,那么版本号还是上一个版本,而且版本的编译时间也很难界定,只能提供一个大概的起始时间。
二是自动获取FPGA的编译时间,同步更新至寄存器中,完成FPGA版本的自动更新,此处有两种方式,一是tcl脚步生成,二是通过原语USR_ACCESSE2来实现。
二、USR_ACCESSE2实现思路
USR_ACCESSE2这个原语,就是一个32bit的时间数值,具体代表含义如下图中所示,当然读者可以查询手册进行学习。在xapp497_usr_access已经明确解释了这个32bit的数据含义:
DATA[31:27] - days
DATA[26:23] - months
DATA[22:17] - years
DATA[16:12] - hours
DATA[11:06] - minutes
DATA[05:00] - seconds
三、在项目中如何使用?
在项目中,对这个32bit的数据进行时钟域转换,转换至axilite总线的时钟域下。由于寄存器定义显示十六进制,此处需要对数值进行转换,将二级制数值转化成十六进制,比如:5e30be03的数值,转换后日期为20241211,时间为00115603。定义两个寄存器用于显示日期和时间。
在版本号中对二进制数值转换,并显示十六进制数值。
最重要的一点,笔者采用了xdc约束USR_ACCESSE2属性,当然还有其他的方式,在GUI界面进行约束等。
set_property BITSTREAM.CONFIG.USR_ACCESS TIMESTAMP [current_design]
通过上面的约束就可以将USR_ACCESS原语属性切换至时间采样功能配置。
四、测试验证
FPGA的功能开发,需要上板验证。笔者实时生成了不同的bit文件,然后在线烧录后,通过ila进行抓取32bit的数值以及转换后的版本号数值,由此功能得以验证。
之后笔者借助于QT上位机,通过串口实时显示当前FPGA的版本编译时间,从而确定板卡运行的FPGA版本是否与bit文件的编译时间一致,误差在10s左右。这项功能在项目中很实用,推荐读者移植到工程中,避免因版本不一致导致功能验证失败。