vitis 实现一拍完成的方法总结

vitis中常规操作是通过循环获取反复从fifo中读取数据,实现对一个完整数据包的处理,这个的好处是可以做到类似面向对象的作用,比如:一个函数可以处理一个udp包,并把数据包的数据拆解写入fifo,并送往下一个环节。

但是单纯的for循环需要一拍完成相应的解析工作,如果超过一拍会导致整个数据包处理时延变成2N,这种情况一般有以下几种做法:

1 通过优化代码,将处理流程压缩到一拍完成,必要的时候可以将数据处理分成两个过程,第一个过程一个周期完成,剩余的放到后续过程完成。

2 流水打拍,通过流水打拍控制每拍都能启动,做到处理数据的时延是N+M,确定是一旦遇到需要开始需要前一条数据结束的情况,流水打拍就比较困难了

3 利用接收数据间隔,比如:读取一个fifo的数据,可以预判到这个fifo数据是间隔的,那么可以利用间隔时间处理数据,类似写法:

if( !fifo,empty())

/// 接收数据

else

/// 处理数据

4 循环中延迟一次,这种场景适合在循环中偶尔会出现一次两拍(大多数情况一拍)的场景,比如:中间偶尔需要发送两个包,可以循环继续,但是读取数据可以通过变量控制不读取,这个方法的前提是中金计算过程不需要用到i值

5 通过有限状态机控制循环

这种场景需要把for循环的i++动作提取到函数体中,并且放到最后一步(i++以后不能在用到i,否则做不到1拍),然后通过有限的状态机控制执行,比如:

for( int =0;i<100;)

{

if( status == 0)

/// 处理1

else if(status == 1)

///处理2

else if( status == 2)

{

/// 接收数据

i++;

status = 0;

}

}

上述方案的确定是不能在综合报告体现出循环执行的次数

ps:上述方案中,如果能用有限状态机,尽量用有限状态机,因为硬件综合逻辑和软件不一样,对于if else分支,硬件综合逻辑是两个分支并行,并且判断条件是根据if的条件取反。

如果有多个if判断条件比较复杂,并且多个if else分支,综合时有可能会判断if 和else if两个分支可能并行执行!

这种情况下代码中如果有相互依赖,综合会判断一拍无法完成,而且这个问题很难查,所以如果if else判断尽可能逻辑简单,最好用有限状态机来实现

相关推荐
粟米茶3 天前
Altium Desinger阵列式粘贴使用
硬件工程·硬件电路
逼子格5 天前
【Proteus仿真】虚拟终端出现乱码问题解决
单片机·嵌入式硬件·proteus·嵌入式·硬件工程·电路仿真·虚拟终端
m0_598250006 天前
串扰12-串扰对信号的影响
笔记·嵌入式硬件·硬件工程
XINVRY-FPGA8 天前
XCVU9P-2FLGA2104E Xilinx AMD Virtex UltraScale+ FPGA
人工智能·嵌入式硬件·fpga开发·硬件工程·dsp开发·射频工程·fpga
Saniffer_SH9 天前
【高清视频】CXL 2.0 over Fibre演示和答疑 - 将内存拉到服务器10米之外
运维·服务器·网络·人工智能·驱动开发·计算机外设·硬件工程
XINVRY-FPGA12 天前
XCVU13P-2FLGA2577I Xilinx AMD VirtexUltraScale+ FPGA
嵌入式硬件·fpga开发·云计算·硬件工程·dsp开发·射频工程·fpga
Sic_MOS_7801682412 天前
超高密度2kW GaN基低压电机驱动器的设计
人工智能·经验分享·汽车·集成测试·硬件工程·能源
自小吃多13 天前
光电探测-IV转换电路也称为TIA跨阻放大器-笔记
笔记·硬件工程
XINVRY-FPGA13 天前
XA7A75T-1FGG484Q 赛灵思 Xilinx AMD Artix-7 XA 系列 FPGA
嵌入式硬件·fpga开发·车载系统·云计算·硬件架构·硬件工程·fpga
XINVRY-FPGA13 天前
XC7A100T-2CSG324I 赛灵思 Xilinx AMD Artix-7 FPGA
arm开发·嵌入式硬件·fpga开发·硬件工程·信号处理·dsp开发·fpga