打印
[CPLD]

使用Vivado HLS在ZedBoard上实现PI及其测试(转)

[复制链接]
2559|3
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
gaochy1126|  楼主 | 2012-11-22 22:02 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
Vivado HLS可以实现对C、C++等高级编程语言的高层次综合,极大地方便了从现有C/C++的算法快速转换为综合后的RTL模型。正好我所测试的ZedBoard中的器件7020已经被Vivado HLS极好地支持,所以做了一些简单的验证:模拟一个PI调节器,一个传递函数描述的阻感负载,测试信号使用阶跃给定模拟电流给定,测试结果则是看反馈的电流信号。 打开Vivado HLS 14.3,新建一个基于C/C++的工程,如图1所示

图1 新建工程
然后便是添加/新建文件、指定测试文件、选择器件类型等步骤,这些与传统ISE的开发流程基本一致。建好的工程在项目管理器中也是分为头文件、源程序等,与一般的IDE类似,如图2所示。

图2 项目文件夹
然后在Test.C里编写了一个电流给定与电流反馈送入PI调节器,产生电压加在阻感负载上面,然后产生新的电流反馈这么一个简单的闭环系统,测试信号则是Step.C里给定阶跃。为了充分测试VivadoHLS的能力,直接使用float类型,没有花力气去各种各样的浮点转定点。在以前编程的时候,除非直接使用System Generator生成,否则这些数**算会非常复杂;但是在System Generator编程时,又需要为每一个浮点数指定整数位和小数位的宽度,还是比较麻烦。
在写C代码时,如果程序有语法错误,会直接提示,如图3所示。

图3 代码提示
代码编写完成后,可以用debug进行调试,其界面、操作与一般的IDE无异,便不需多说。切换到Vivado HLS的Synthesis选项卡进行综合,经过一堆提示,很快就完成了RTL级的综合:
Starting synthesis ...
C:/Xilinx/Vivado_HLS/2012.3/Win_x86/bin/vivado_hls_bin.exe C:/Users/FU/PIwithRL/PIwithRLload/script.tcl
@I [LIC-101] Checked out feature [VIVADO_HLS]
@W [HLS-40] Vivado and/or ISE in the PATH variable are not from the same build as Vivado HLS. The mismatch may result in unexpected behaviors.
@I [HLS-10] Running 'C:/Xilinx/Vivado_HLS/2012.3/Win_x86/bin/vivado_hls_bin.exe'
@I [HLS-10] On platform 'Windows NT_intel version 6.1'
@I [HLS-10] Vivado HLS Tcl shell started on Sat Nov 10 17:38:32 +0800 2012 for user 'FU' at host 'fu-pc'
@I [HLS-10] Current directory: C:/Users/FU
@I [HLS-10] Opening project 'C:/Users/FU/PIwithRL'.
@I [HLS-10] Adding design file '../../ZedBoard/Ceping5/Test.c' to the project.
@I [HLS-10] Adding test bench file '../../ZedBoard/Ceping5/Step.c' to the project.
@I [HLS-10] Opening solution 'C:/Users/FU/PIwithRL/PIwithRLload'.
@I [SYN-201] Setting up clock with a period of 10ns.
@I [HLS-10] Setting target device to 'xc7z020clg484-1'
@I [HLS-10] Importing test bench file '../../ZedBoard/Ceping5/Step.c' ...
@I [HLS-10] Importing design file '../../ZedBoard/Ceping5/Test.c' ...
@I [HLS-10] Analyzing the design file ...
@I [HLS-10] Validating synthesis directives ...
@I [HLS-10] Checking synthesizability ...
@I [HLS-10] Starting code transformations ...
@I [HLS-111] Elapsed time: 2.153 seconds; current memory usage: 16.2 MB.
@I [HLS-10] Starting hardware synthesis ...
@I [HLS-10] Synthesizing 'Test' ...
@I [HLS-10] ----------------------------------------------------------------
@I [HLS-10] -- Scheduling module 'Test'
@I [HLS-10] ----------------------------------------------------------------
@I [SCHED-11] Starting scheduling ...
@I [SCHED-11] Finished scheduling.
@I [HLS-111] Elapsed time: 0.047 seconds; current memory usage: 16.5 MB.
@I [HLS-10] ----------------------------------------------------------------
@I [HLS-10] -- Exploring micro-architecture for module 'Test'
@I [HLS-10] ----------------------------------------------------------------
@I [BIND-100] Starting micro-architecture binding ...
@I [BIND-101] Performing variable lifetime analysis.
@I [BIND-101] Exploring resource sharing.
@I [BIND-101] Binding resource limited operations ...
@I [BIND-100] Finished micro-architecture binding.
@I [HLS-111] Elapsed time: 0.031 seconds; current memory usage: 16.5 MB.
@I [HLS-10] ----------------------------------------------------------------
@I [HLS-10] -- Generating RTL for module 'Test'
@I [HLS-10] ----------------------------------------------------------------
@I [RTGEN-500] Setting IO mode on port 'Test|igive' to 'ap_none'.
@I [RTGEN-500] Setting IO mode on port 'Test|iback' to 'ap_none'.
@W [RTGEN-101] Global scalar 'error' will not be exposed as RTL port.
@W [RTGEN-101] Global scalar 'voltagelast' will not be exposed as RTL port.
@W [RTGEN-101] Global scalar 'errorlast' will not be exposed as RTL port.
@W [RTGEN-101] Global scalar 'voltage' will not be exposed as RTL port.
@W [RTGEN-101] Global scalar 'temp1' will not be exposed as RTL port.
@W [RTGEN-101] Global scalar 'ibacklast' will not be exposed as RTL port.
@W [RTGEN-101] Global scalar 'temp2' will not be exposed as RTL port.
@I [RTGEN-100] Module generated: Test_grp_fu_84_ACMP_faddfsub_1|Test_grp_fu_84_ACMP_faddfsub_1_U.
@I [RTGEN-100] Module generated: Test_grp_fu_94_ACMP_fptrunc_2|Test_grp_fu_94_ACMP_fptrunc_2_U.
@I [RTGEN-100] Module generated: Test_grp_fu_99_ACMP_fptrunc_3|Test_grp_fu_99_ACMP_fptrunc_3_U.
@I [RTGEN-100] Module generated: Test_grp_fu_104_ACMP_fpext_4|Test_grp_fu_104_ACMP_fpext_4_U.
@I [RTGEN-100] Module generated: Test_grp_fu_108_ACMP_fpext_5|Test_grp_fu_108_ACMP_fpext_5_U.
@I [RTGEN-100] Module generated: Test_grp_fu_111_ACMP_fpext_6|Test_grp_fu_111_ACMP_fpext_6_U.
@I [RTGEN-100] Module generated: Test_grp_fu_114_ACMP_fpext_7|Test_grp_fu_114_ACMP_fpext_7_U.
@I [RTGEN-100] Module generated: Test_grp_fu_118_ACMP_dadddsub_8|Test_grp_fu_118_ACMP_dadddsub_8_U.
@I [RTGEN-100] Module generated: Test_grp_fu_123_ACMP_dmul_9|Test_grp_fu_123_ACMP_dmul_9_U.
@I [RTGEN-100] Finished creating RTL model for 'Test'.

相关帖子

沙发
gaochy1126|  楼主 | 2012-11-22 22:02 | 只看该作者
@I [HLS-111] Elapsed time: 0.109 seconds; current memory usage: 16.4 MB.
@I [WSYSC-301] Generating RTL SystemC for 'Test'.
@I [WVHDL-304] Generating RTL VHDL for 'Test'. 看综合报告,整个设计的使用面积还是很不错的,如图4所示。

图4 估算的资源占用
接下来可以在菜单栏solution下面选择C/RTL的联合仿真,但是目前只支持Modelsim,因为我没有这个软件,所以只好忽略这一步了。但是对C的仿真还是可以进行的,编写了测试文件Step.c如下:
intmain () {
floatfeedback;
feedback=Test(1);
}
然后点击Project---Run C Simulation,如图5所示。

图5 基于C的仿真
可以看到仿真之后变量的值(目前我只能看到一个值),如图6所示。但是如何出现像ISIM、ModelSim那样的图形化仿真结果,找了半天也还没有具体的资料,所以留到以后再研究。

图6 仿真结果
VivadoHLS的目的是将高层次语言的代码转换为RTL从而进行布局布线等工作,所以代码验证之后,要将RTL导出,供Vivado或者ISE来进行布局布线等工作,如图7所示。

图7 导出RTL
有意思的是,在导出RTL时,会出现一个Xilinx的调查选项,询问你使用Vivado HLS的用户体验,如图8所示。点击确定之后会跳转到Xilinx网站填表去;网页很慢,我20M的电信宽带用了1分多种还没显示出来。一共10个问题,和通常科技公司进行的调查没有区别,有几个打分的表格看的眼都花了。我的真是反映就是两个:1.速度特别快,没想到高层次综合的速度可以这么快,简直秒杀SystemGenerator那种生成代码的方式了。2.资料特别少,连个像样的帮助也没有,之后靠感觉点了。

图8 调查
导出的类型是可以选择的,如图9所示;其中,第一个选项意思是把这个基于C的设计导出为IP核的类型,可以有效保护知识产权。

图9 选择导出RTL的类型
以第一种方式为例,生成的RTL非常全面,可以直接作为IP核使用了,如图10所示。

使用特权

评论回复
板凳
gaochy1126|  楼主 | 2012-11-22 22:03 | 只看该作者

图10 结果文件夹
如果直接点击图10中的tmp.xpr,则Vivado会启动,如果没有新的功能要加入,可以直接generate bitstream,经过几分钟的等待,就可以下载到FPGA中了。
眼看我的试用license要过期了,不知道在这之前还能鼓捣出神马新玩意。要实验的东西还可以有很多,比如怎么和ARM双核结合等等(原来疑虑怎么和SystemGenerator结合,原来Vivado HLS可以直接生成sg使用的.v文件)。
最后补充一点在Xilinx网站上辛苦找到的一点信息,关于使用Vivado HLS编程时的一些考虑(基本原则与使用HDL编程一致的):
•Unroll the Shift_Accum_Looploop to reduce latency.
•Partition the array shift_regto prevent a BRAM being used, and allow a shift register to be used.
•Specify the input array cas a single-port RAM in order to guarantee a single-port RAM interface.
•Ensure that the input port xuses a valid handshake.
•Force sharing of the multipliers.

使用特权

评论回复
地板
梅花望青竹| | 2012-11-23 08:55 | 只看该作者
没有license 所以灭有用过的!

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

1025

主题

11271

帖子

25

粉丝