Board logo

标题: 学习vivado第7章Lab2——C代码为了I/O访问的优化 [打印本页]

作者: pengpengpang    时间: 2015-3-28 16:26     标题: 学习vivado第7章Lab2——C代码为了I/O访问的优化




在lab1中,你不能使用流接口。C代码指定同一地址多访问的本质防止了流接口的应用。
•在流接口中,值必须按顺序进行访问。
•在代码中,访问也指端口的访问,高层次综合不能删除和优化。C代码规定了在每次product循环启动时,往端口res写0值。这可能是预期的行为的一部分。HLS不能简单地决定改变该算法的规范。
代码直观捕获到矩阵乘法的行为,但这样就阻止了在硬件上流访问行为要求。
这个实验练习使用了C代码更新的版本。在lab1中,你也工作在这个版本下。下面介绍了C代码如何更新的。
图161展示了I/O访问模式对在lab1中的代码。出于需要地址值显示用小的字体。
当变量I,j,和k从0到3迭代时,图161下面部分展示了地址产生为了读a,b和写res。此外,在每次Product循环启动时,res被设置为0。


以顺序流访问的硬件设计,端口的访问仅发生在高亮红色的时候。为了读端口,数据必须被内部缓存为了保证设计不重读端口。为了写端口res,数据必须被保存在临时变量里,并仅在周期里(红色显示的)往端口写。
在这个实验中C代码影响这个行为。
步骤1:创建并仿真工程
1. 在lab1中用命令提示符窗口,变为lab2路径如图162
2. 执行TCL并建立vivado HLS Project,采用的是vivado_hls–f run_hls.tcl如图162所示


3. 在用户界面里打开工程。用vivado_hls–p hamming_window_prj命令打开,
4.在资源管理器中打开源文件夹,并双击window_fn_top.cpp打开代码,如图163


查看代码并确认以下:
•Lab1中指令,包括fifo接口,在代码中指定代码编译
•for循环已被添加到读rol和column的缓存
•临时变量被用于累加,并且端口res仅被写当最后结果已计算出每个值时。
•因为for循环缓存row和column要求多个周期来执行读。流水线指令已被用在Col for循环。保证这些缓存for循环自动展开。
综合设计并验证RTL用协同仿真。
5.在工具栏中点击Run C Synthesis按钮,并把设计综合成RTL
6.当综合完成,用Run C/RTL Cosimulation工具栏按钮加载Cosimulation Dialog框。
7.点击OK,启动RTL仿真。
设计已经被完成综合成采用流FIFO接口在每个时钟周期读取一个样本。
结论在本教程中,您可以:
•学会了如何分析流水线循环和理解真正阻止又换目标实现的限制。
•函数实现循环流水线的优点缺点。
•如何认识到非计划中的代码中的依赖性会阻止硬件设计目标的实现,以及他们如何可以通过修改源代码来克服
附件大小实验例子.rar40.94 KB







欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0