- fpga 内部对于除法 ,不论是取整还是求余 ,都十分不友好。特别是除法+组合逻辑+大位宽 的的组合方式,会综合处很大的逻辑深度和逻辑级数,造成时序违例;
解决: 使用移位计算取代 ,这也是为什么fpga 喜欢定义参数==2的幂次方;
乘法和除法使用累加/累减 实现(注意处理的最大时钟周期);
- fpga 内部对于乘法的计算也不友好,通常是将乘法逻辑拆分+打拍的方式修复时序。 如果不必要的过大位宽也不利于时序收敛;
解决:使用右移实现;
计算拆分+流水;
- 对于逻辑内部设计到基于软件配置信息,fpga 内部自己计算输出的一些内参信息。 如果内参信息的计算设计的除法/乘法/加法/减法 等组合运算时 ,完全可以将内参的计算剥离出来,转换成配置接口的形式传入。 fpga 工程师可以提供脚本,借助脚本计算出软件将要配置的所有接口信息。
解决: 删除内参生成逻辑,改为软件配置接口实现,fpga 提供参数生成脚本,帮助软件配置;
-
fpga内部对于bram的depth 必须是2 的幂次方,比如深度为1024 ,那么bram的深度位宽是10 ,另外xilinx 的bram深度 是 (数据存储位宽 * 深度)
-
数据输入fifo ,做整包调度,允许整包丢弃。逻辑需要保证实现整包写和整包读取; 也就是,在写的过程中,不care反压,只在写的第一拍判断输入缓存是否afull。
在读的第一拍,判断后级FIFO是否afull ,不afull 一直读取,后续的读不care 后记fifo 的afull
-
对于图像的读写仿真测试,需要借助fwrite和fread,将dut的 输出保存到文件,借助py 解析文件,可以快速定位代码问题;
-
项目开发步骤: 编码===》仿真===》修改时序===》再次仿真验证===》上板调试===》 加ila,signaltap ===》 项目pass