wind330

ImpulseC的几点说明

0
阅读(33051)

最近学习了ImpulseC,最后也在开发板上实践了一把,确实比较好用,效率也可以接受。向大伙说一声wind330的学习感受。

关于报告分析

用Stage Master Explorer打开一份分析报告,内容如下:   

Bayer2RGB工程报告

Total Stages: 14 ImpuseC最终生成的RTL代码,整个运行都是在状态机的控制下,而Total Stages说明了该控制状态机的状态数。

Max.Unit Delay: 64 该参数表示Math运算参与的最大位数,主要影响FPGA的运行速度,数字越大,FPGA运行速度越小。

我们再看 Block #3 pipeline,由于这里使用了"#pragma CO PIPELINE"(多在循环结构中使用),所以该部分代码使用了高效的流水线技术。

Latency: 8 表示Block #3从数据输入到结果输出会有8个时钟延迟。

Rate: 6 说明Block #3每6个时钟产生一个结果。

Effetctive Rate: 384 等于Rate*Max. Unit Delay,用于评估RTL综合后性能,越小越好。

关于Coding Style

由于wind330使用该工具也不久,对这方面经验还比较少。在ImpulseC下,不同的编写方式会极大地影响FPGA执行性能,不仅是FPGA运行频率,还有执行效率(Rate)。

if...else...语句会对应生成一级Stage,即状态;所以可以在同一个时钟内完成的运算代码不要被if...else...隔开,要么全部在该语句中,要么在该语句外;

数组的定义会生成一个RAM,如做暂存器,在某一时间段只需要读或者写,则保证地址和数据的生成以及写入动作可以并发进行,确保Rate=1;如果需要同时进行读写,则把RAM配置成双口RAM 。

        co_array_config(array1, co_kind, "dualsync");

for循环语句会生成一个Block,即相当于一个子状态机;如为重要运算模块的话,添加"#pragma CO PIPELINE"约束;

关于架构

ImpulseC的不同处理模块用Stream隔开,这样做减弱了每个模块中的时序相关性,对数据流处理非常有效,如对输入视频流的视频预处理。

***_hw.c内的数据处理都属于同一个相同的时钟域,如处理时钟与数据输入流时钟不同,则把输入的Stream接口配置为Dual Clock。