一拍完成的方法总结"/>
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判断尽可能逻辑简单,最好用有限状态机来实现
更多推荐
vitis 实现一拍完成的方法总结
发布评论