cuter

【原创】自己设计简单算法,进一步熟悉HLS

0
阅读(8113)

设计简单算法,Vivado HLS初体验后续

1、前言:

Vivado HLS初体验》一文中,使用别人设计的yuv_filter demo文件新建工程,添加了文件,基本掌握了新建工程和算法仿真的流程,由于没有完全按照现有的教程进行学习,所以对整个流程有了较好的理解。接下来,为了更好地理解HLS的设计方法,我打算自己设计一个简单的c算法和c testbench,对接下来的几个流程,如综合、RTL仿真、IP打包等,进行学习。

2、目标:

u      C函数进行综合

u      查看RTL仿真结果

u      将设计封装成IP

3、准备工作:

新建工程就不多说了,我们这里设计一个最简单的组合逻辑电路:21选择器。

Top functionmux21

mux21.c源码如下:


#include "mux21.h"
int1 mux21(int1 sig_a, int1 sig_b, int1 select)
{
    if(0==select)
       return sig_a;
    else
       return sig_b;
}

mux21.h内容为:



#include <ap_cint.h>


ap_cint.h这个头文件的包含,是为了使用int1类型,int1表示1位整型数。

testbench mux21_tb.c源码为:

#include <stdio.h>
#include "mux21.h"

int main(void)
{
	int1 res1 = 0;
	int1 res2 = 0;

	res1=mux21(1,0,0);
	res2=mux21(0,1,1);

	if(res1 && res2)
		printf("test passed, well done!\n");

	return 0;
}


这些代码都很简单,就不多做解释了,代码编写完成后,Run C Simulation,发现测试通过,打印如图1所示。


1 C仿真结果

注意:编写代码时,发现错误,修改了之后,IDE可能不会自动检测,这里可以尝试使用Index功能,IDE会检测改动,消除错误提示。

举个例子:我使用了int1类型,但是没有包含ap_cint.h文件,显示效果如图2所示。



错误提示

这时,就算我修改代码,包含了ap_cint.h文件,错误提示依旧存在。需要手动Index C source,提示才会消除。操作如图3所示:Project > Index C Source,或者点击工具栏中的快捷按钮,图3红色方框内的图标。


3 Index C Source



4、对算法进行综合


4.1、综合

如图4所示,在菜单中寻找命令:Solution > Run C Synthesis > Active Solution,点击Active Solution菜单,HLS会自动完成综合工作。


4 综合指令

此外,还可以直接点击工具栏中的快捷按钮(图5红色方框内),在下拉菜单中选择“Active Solution”命令,也能够启动综合进程。


5 综合指令快捷按钮

4.2、查看综合结果

进入工程文件夹,找到综合文件夹,查看所综合出的HDL代码,文件结构如图6所示。


6 目录结构

rpt文件显示“General Information(基本信息)”、“Performance Estimates(性能估算)”、“Utilization Estimates(资源利用估算)”、“(Interface接口)”等信息。

verilog文件夹下是综合出来的.v文件,vhdl文件夹下综合出来的是.vhd文件,打开mux21.v,代码为:


`timescale 1 ns / 1 ps
(* CORE_GENERATION_INFO="mux21,hls_ip_2014_2,{HLS_INPUT_TYPE=c,HLS_INPUT_FLOAT=0,HLS_INPUT_FIXED=1,HLS_INPUT_PART=xc7z020clg484-1,HLS_INPUT_CLOCK=10.000000,HLS_INPUT_ARCH=others,HLS_SYN_CLOCK=1.370000,HLS_SYN_LAT=0,HLS_SYN_TPT=none,HLS_SYN_MEM=0,HLS_SYN_DSP=0,HLS_SYN_FF=0,HLS_SYN_LUT=0}" *)
module mux21 (
        ap_start,
        ap_done,
        ap_idle,
        ap_ready,
        sig_a,
        sig_b,
        select_r,
        ap_return
);
parameter    ap_const_logic_1 = 1'b1;
parameter    ap_const_logic_0 = 1'b0;
input   ap_start;
output   ap_done;
output   ap_idle;
output   ap_ready;
input  [0:0] sig_a;
input  [0:0] sig_b;
input  [0:0] select_r;
output  [0:0] ap_return;
assign ap_done = ap_start;
assign ap_idle = ap_const_logic_1;
assign ap_ready = ap_start;
assign ap_return = ((select_r)? sig_b: sig_a);
endmodule //mux21


主要功能语句:

assign ap_return = ((select_r) ? sig_b : sig_a);

由于这个设计过于简单,ap_startap_readyap_doneap_idle以及ap_return信号的作用不太能体现出来,从命名来看,主要是用于控制模块工作的信号。

vhdl文件不多说了,一样的功能。

5RTL仿真

5.1HLS GUI操作

Solution > Run C/RTL Cosimulation,仿真完成后,需要在Vivado下查看仿真结果。

注意:Dump Trace选项要选择all,否则不会产生波形数据,位置如图7所示。


7 Dump Trace

5.2Vivado GUI操作

打开Vivado,在tcl控制台下键入以下指令:

cd E:/hls/mux21/solution1/sim/verilog/

current_fileset

open_wave_database mux21.wdb

open_wave_config mux21.wcfg

注释:

更改路径

加载工程

加载仿真数据

打开波形窗口


8 仿真结果


注意:此处的仿真结果和我们之前编写的C Testbench文件是对应的,因此,C Testbench要别编写的有针对性,才能很好地体现模块的功能。


我们这个Testbench编写的不够好,编写两个不同频率的方波分别作为sig_asig_b,这样仿真才可以更好地体现mux21的功能。习惯了用HDL编写Testbench,换到C还有点不习惯……

6、封装为IP

Solution > Export RTL,或者点击工具栏快捷按钮,打开Export RTL对话框,如图9所示。


9 Export RTL

命令行会打印提示整个IP封装过程,如图10所示。


10 IP封装打印信息

如图11所示,IP封装完成后,solution1文件夹下会出现impl文件夹,该文件夹下包含ipverilogvdhl三个子文件夹,在这些文件夹中,我们可以找到封装过程中生成的文件。


11

7、结束语

至此,我们完成了利用HLS工具进行算法设计的全过程。IDE使用方面就不多说了,还是比较方便的。

从使用HDL进行逻辑开发的设计员角度来讲,使用HLS完成算法设计还不太习惯,比如说:C Testbench的编写和HDL Testbench的编写有一定的差异;使用C语言设计算法的时候,还是会先考虑用HDL怎么写,然后把HDL翻译成CC设计算法时,会考虑什么样的语句能综合出时钟电路,怎么写才能综合出自己想要的电路等等。这些都是设计思维的问题,是HDL语言和高级语言的设计思维方式不同,习惯了HDL设计电路,乍接触高级语言设计电路,还不习惯,在思维的高度需要做一些转变。

接下来,需要学习如何设计C算法、编写C Testbench等,路漫漫……


版权声明:

本文由博主“cuter”发布。欢迎转载,但不得擅自更改博文内容,也不得用于任何盈利目的。转载时不得删除作者简介和版权声明。如有盗用而不说明出处引起的版权纠纷,由盗用者自负。

博客官方地址:

ChinaAET:http://blog.chinaaet.com/cuter521

EDN China: http://bbs.ednchina.com/BLOG_cuter521_356737.HTM