2 创建一个VivadoHLS工程Xilinx Forums.docx
《2 创建一个VivadoHLS工程Xilinx Forums.docx》由会员分享,可在线阅读,更多相关《2 创建一个VivadoHLS工程Xilinx Forums.docx(15页珍藏版)》请在冰豆网上搜索。
2创建一个VivadoHLS工程XilinxForums
用Vivado-HLS实现低latency除法器
GeorgeWang–XilinxDSPSpecialist
TableofContents
1VivadoHLS简介3
2创建一个Vivado-HLS工程4
2.1打开VivadoHLSGUI4
2.2创建新工程5
2.3添加源文件6
2.4添加测试文件8
2.5创建solution10
3CValidation12
4CSynthesis13
5Explore不同新的Solution15
1VivadoHLS简介
XilinxVivadoHigh-LevelSynthesis(HLS)工具将C,C++,或者SystemC设计规范,算法转成RegisterTransferLevel(RTL)实现,可综合到XilinxFPGA。
将DSP算法快速转到RTLFPGA实现
将C至RTL时间缩短4倍
基于C语言的验证时间缩短100倍
RTL仿真时间缩短3倍
2创建一个Vivado-HLS工程
2.1打开VivadoHLSGUI
双击桌面上VivadoHLSGUI图标,或从Start>AllPrograms>
Vivado>VivadoHLSGUI
打开GUI之后,Vivado-HLSwelcome界面如下所示:
2.2创建新工程
在WelcomePage,选择CreateNewProject
2.3添加源文件
指定顶层需要综合的源文件名,并添加文件.
本除法器设计采用移位算法
#include"radix2div.h"
quotient_tradix2div(
dividend_tdividend,//(numerator)
divisor_tdivisor,//(denominator)
remainder_t*remainder//
){
#pragmaAPlatencymax=3
#pragmaAPpipeline
quotient_i_tquo,y;//+1bitsunsigned
subtract_tsub_out,rem_r;//+1bitssigned
boolean_tlast_bit,next_bit;
loop_cnt_ti;
///////////////////////////////////////////////
last_bit=0;
rem_r=0;
if(LOOP_MAX>32)
quo=0ULL;
else
quo=0;
//////////////////////////////////////////////////
div_booth_label0:
for(i=0;i//concurrentblocks
sub_out=rem_r-divisor;
y=dividend&1<<(LOOP_MAX-i-2);
if(y==0)
next_bit=0;
else
next_bit=1;
if(sub_out<0){//remainder-denominatorisnegative
quo=quo<<1;
if(i!
=LOOP_MAX-1){
rem_r=rem_r<<1;
rem_r=rem_r|next_bit;
}
}
else{//remainder-denominatorispositive
quo=quo<<1;
quo=quo|1;
if(i!
=LOOP_MAX-1){
rem_r=sub_out<<1;
rem_r=rem_r|next_bit;
}
else
rem_r=sub_out;
}
}//endfor
*remainder=rem_r;
returnquo;
}
2.4添加测试文件
添加测试文件.
#include
#include
#include"radix2div.h"
//////////////////////////////////////////////////////////////////////////////
quotient_tradix2div(
dividend_tdividend,//(numerator)
divisor_tdivisor,//(denominator)
remainder_t*remainder//
);
//////////////////////////////////////////////////////////////////////////////
inttest_divider(dividend_tdividend,
divisor_tdivisor
)
{
quotient_tquotient;
remainder_tremainder;
quotient=radix2div(dividend,divisor,&remainder);
fprintf(stdout,">>>>>>>>>dividend=%u,divisor=%uquotient=%uremainder=%u\n",
dividend,divisor,quotient,remainder);
fprintf(stdout,">>>>>>>>>--------------------\n");
if((quotient==dividend/divisor)&&(remainder==dividend-(divisor*quotient))){
printf("PASS\n");
}
else{
printf("FAIL\n");
return1;
}
}
//////////////////////////////////////////////////////////////////////////////
intmain(){
inti,j;
dividend_tmax_num;
max_num=0;
j=LOOP_MAX-1;
for(i=0;imax_num=max_num+pow(2,i);
}
//////////////////////////////////////////////////////////////////////////////
test_divider(max_num,1);
test_divider(2,pow(2,9)-1);
test_divider(max_num,pow(2,9)-1);
test_divider(8,1);
test_divider(99,10);
//////////////////////////////////////////////////////////////////////////////
}
2.5创建solution
创建solution,时钟约束,并选器件.
打开包括工程信息VivadoHLSGUI.
3CValidation
在将c/c++/systemc转换成RTL之前,必须先验证C设计,确保其功能是正确的
点击“RunCSimulation”图标,
4CSynthesis
现在可以对设计做C综合,生成RTL代码.当综合完成,,GUI更新综合结果.包括资源使用,latency等。
为了达到了预先要求为3个时钟周期,将latency的directive设置为3。
5Explore不同新的Solution
project->newsolution。
在同一个工程里面,可以使用同一套源代码,进行不同solutions的尝试。