一 Flash加载时间
由于项目中需要一次性对多片不同的FPGA进行在线升级,在最初搭建底层时为了方便(偷懒)统一将FLASH SPI时钟约束成50MHz的时钟,这也为后期调试埋了一颗定时炸弹。
这里需要总结的一点就是,Xilinx FPGA并不支持任何大小的FLASH SPI时钟约束,在Vivado中可以查询当前FPGA型号支持的时钟大小。以Ultrascale+为例,仅支持以下SPI时钟频率:
当我对FLASH SPI速率约束设置为50MHz时,FPGA并不能识别该值,导致的结果是使用默认的2.7MHz这个最小的加载速率,最后反应在板卡上,会发现程序启动的特别慢,慢到令人发指。如果系统中使用PCIe这样的PC端时钟,很有可能导致PC端启动后,板卡未启动,导致PCIe无法建链成功,最终导致整个系统无法正常工作。
这里我们可以对加载时间进行一个简单计算:
(1)例如我们的Update区域划分了35MB的地址空间,即存储35MB的bin文件,如果加载速率为2.7MHz,Quad模式:
35*1024*1024*8 / (4*2.7*1000*1000) = 27s
(2)如果加载速率为36.4MHz,Quad模式:
35*1024*1024*8 / (4*36.4*1000*1000) = 2s
从理论计算结果就可以发现,如果加载速率约束不成功,加载时间的差距还是非常之大。
二 Flash区域划分技巧
在对FPGA进行约束时,通常会针对bit文件的大小进行压缩,这里就是为了控制烧写文件的大小。通过查阅官方手册可以发现,任何型号的Xilinx FPGA编译生成的bit文件的大小都有上限:
从手册上,我们可以按照bit文件的最大值进行区域划分,例如VU065,bit文件最大200713824bits,约等于24MB。那么我们在制作Golden和UPdate区域时,可以直接将两片区域划分成24MB,总共48MB左右的FLASH空间即可完成在线升级功能,后期无论程序如何变动,都不会超过这个空间大小。当然这样划分充足的空间的前提是,FLASH片子够大!制作multiboot去反复验证的过程实在太痛苦了,一次性将空间划分到位,减轻痛苦!!!