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判断尽可能逻辑简单,最好用有限状态机来实现

相关推荐
陌夏微秋1 天前
STM32单片机GUI系统1 GUI基本内容
stm32·单片机·嵌入式硬件·硬件架构·硬件工程·智能硬件
逼子格2 天前
硬件工程师笔记——三极管Multisim电路仿真实验汇总
笔记·嵌入式硬件·硬件工程·硬件工程师·三极管·硬件工程师真题·multisim电路仿真
搬砖的小码农_Sky3 天前
FPGA:高速接口JESD204B以及FPGA实现
嵌入式硬件·fpga开发·硬件架构·硬件工程
搬砖的小码农_Sky3 天前
低功耗:XILINX FPGA如何优化功耗?
嵌入式硬件·fpga开发·硬件架构·硬件工程
集思广益的灰太狼4 天前
汇川MD810-20M4110GXXX变频器为什么要加GRJ9000S电源滤波器?
硬件工程
技术流浪者5 天前
PCB设计(十九)PCB设计中NPN/PNP选型策略
单片机·嵌入式硬件·硬件工程·pcb工艺
搬砖的小码农_Sky6 天前
FPGA:Lattice的FPGA产品线以及器件选型建议
嵌入式硬件·fpga开发·硬件架构·硬件工程
嘿,二极管6 天前
运算放大器相关的电路
硬件工程
情意绵绵6747 天前
车用CAN接口芯片:汽车神经系统的沉默构建者
单片机·嵌入式硬件·汽车·硬件架构·硬件工程
Yesheldon8 天前
Cadence 高速系统设计流程及工具使用三
嵌入式硬件·fpga开发·硬件架构·硬件工程·智能硬件