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 小时前
FPGA硬件设计2 最小芯片系统-ZYNQ7020/7010
嵌入式硬件·fpga开发·硬件架构·硬件工程·信息与通信·智能硬件
XINVRY-FPGA1 天前
10CL016YF484C8G Altera FPGA Cyclone
嵌入式硬件·网络协议·fpga开发·云计算·硬件工程·信息与通信·fpga
limitless_peter3 天前
集成运算放大器(反向比例,同相比例)
嵌入式硬件·硬件工程
Be Legendary-CGK6 天前
三极管的基极为什么需要下拉电阻
单片机·嵌入式硬件·硬件工程
国科安芯6 天前
MCU外设初始化:为什么参数配置必须优先于使能
网络·单片机·嵌入式硬件·性能优化·硬件工程
针不戳202209267 天前
PFC是什么
嵌入式硬件·学习·硬件工程
无情的8868 天前
LVPECL、LVDS、LVTTL、LVCMOS四种逻辑电平标准的全面对比
硬件工程
粟米茶10 天前
差分放大电路的四种接法
硬件工程·硬件电路·三极管·运放
XINVRY-FPGA12 天前
XCKU115-2FLVB2104E AMD Xilinx Kintex UltraScale FPGA
嵌入式硬件·计算机视觉·fpga开发·云计算·硬件工程·dsp开发·fpga
XINVRY-FPGA12 天前
XCZU19EG-2FFVB1517I FPGA Xilinx AMD ZynqUltraScale+ MPSoC
arm开发·嵌入式硬件·fpga开发·硬件架构·硬件工程·dsp开发·fpga