Vivado开发套件设计笔记(3)——加法器设计——指针(上)

1 简介

在上一篇博文《Vivado开发套件设计笔记(2)——加法器设计——变量(上)》《Vivado开发套件设计笔记(2)——加法器设计——变量(下)》中,笔者非常详细地介绍了 Vivado开发套件 的一个 变量加法器 设计流程:首先在 HLS 软件上利用C语言写一个变量加法器并转换成 IP核 ,然后在 Vivado 软件上把 ZYNQ处理系统加法器IP核 连接起来,最后在 SDK 软件上调用 加法器IP核 完成变量的加法运算。

希望对这个操作流程不熟悉的读者可以把上一篇博文跟着过一遍,熟悉这套操作的读者不妨也把笔者所用的词看一下,因为之后再写的对你有用的博文的操作关键词也会沿用上一篇博文的关键词,再多花几分钟过一下那些文字可以防止与读者所熟悉的操作关键词产生混淆或是误解。再者,之后所写的博文为了节省篇幅不会再像这头两篇博文一样非常详尽,而只会把关键的要素列出来供读者阅读,而那些固定不变的操作就会省去,所以不论如何,还是希望读者可以把这两篇博文看一下,以防产生“这个笔者怎么不讲人话”的想法,阿里卡托。

下面 直接进入主题 。笔者认为,通过这一个从 HLS到Vivado再到SDK 的开发技巧相对于 纯FPGA编程 而言,应该是更具有效率上的优势,尤其是在开发者需要实现一个稍微复杂的算法的时候, 纯FPGA编程 的开发周期一定长很多,而且要求开发者有相当高的FPGA编程能力,这也是这一开发技巧出现的原因之一。那么,仅仅利用上一篇博文实现的变量加法器作为地基去把复杂的算法搭建起来还是有点天方夜谭,还缺少很多必要的元素,其中就包括指针(数组)的使用。比如我们之后要实现的 FFT算法 ,其输入输出都是一个长数组,这种情况下,用变量的方式显然是不现实的。再者,看过上一篇博文的读者一定记得, IP核 所用的输入输出的形参都是 int型 ,而实际很多算法,我们都需要用到 float 型变量存储数据。于是这一篇博文应运而生。

这篇博文首先在 HLS 构建 IP核 完成 float型 数据的加减乘除操作,并利用 二维矩阵 存储输入和输出数据,然后在 Vivado 软件上完成电路连接,最后在 SDK 软件上调用 四则运算IP核 验证设计。

2 HLS设计

首先在Vivado HLS上设计我们所需要的四则运算IP核

(1)创建工程

按照红色框框来,先创建工程。

在这里插入图片描述
放到全英文路径,命名工程。

在这里插入图片描述
点击 New File… 创建所需的文件,一是头文件,二是顶层函数文件。IP核 就是根据 顶层文件 综合出来的,非常重要。相继添加 arith.cpparith.h 。添加完成后 Design Files 框中就会有刚添加的两个文件,此时上面的 Top Function 框是还没有东西,这里等我们写完程序后再在工程中设置就可以。

在这里插入图片描述
然后添加testbench测试文件,这在做C综合过程中也是必不可少的,添加方法更上面添加顶层文件和头文件是一样的。

在这里插入图片描述
然后选择硬件,我用的开发硬件是黑金的AX7020板子,根据芯片型号这里选择的是 xc7020clg400-2 ,读者在开发的时候需要根据自己的硬件选择一致的。左边的 Solution 不用变,之后的博文会介绍。

在这里插入图片描述
这样就完成工程创建了,如果出现以下错误不用管它,直接点 CloseOK 就可以了。

在这里插入图片描述
然后软件就会打开设计界面,如下图所示。

在这里插入图片描述

(2)程序设计

双击 arith.cpp ,如上图所示,并添加 顶层文件 的代码。如下:

#include "arith.h"
void arith(float data[2][2], float res[2][2])
{
	res[0][0] = data[0][0] + data[0][1];
	res[0][1] = data[0][0] - data[0][1];
	res[1][0] = data[1][0] * data[1][1];
	res[1][1] = data[1][0] / data[1][1];
}

然后双击 arith.h ,添加 头文件 的代码。如下:

#ifndef arith_h_
#define arith_h_
void arith(float data[2][2], float res[2][2]);
#endif

最后双击 arith_tb.cpp ,添加 testbench 的代码。如下:

#include "arith.h"
#include <iostream>
#include <cstdio>
#include <fstream>
int main()
{
	float data[2][2];
	float res[2][2];

	// Input data
	data[0][0] = 10.5;
	data[0][1] = 5.5;
	data[1][0] = 8.0;
	data[1][1] = 0.5;

	// Reference result
	float ref[2][2];
	ref[0][0] = 16.0;
	ref[0][1] = 5.0;
	ref[1][0] = 4.0;
	ref[1][1] = 16.0;

	arith(data, res);

	if(ref[0][0] == res[0][0] && ref[1][0] == res[1][0] && ref[0][1] == res[0][1] && ref[1][1] == res[1][1])
	{
		printf("Verify correctly\n");
		return 0;
	}
	else
		return 1;
}

关于这些程序的写法,相信有过C语言基础的读者应该比较清楚,篇幅有限,笔者暂且不过多阐述。这里值得一提的是,testbench文件 中一般都会有一个验证顶层函数是否正确的语句,比如这里我用的 ref[0][0] == res[0][0]表示加法的输出与预想一致,如果四个结果值均与参考值一致,那么返回值为0。如果一个 main 函数的返回值是0的话,程序就是正确的,如果返回值是1的话(条件是我们自己设定的),程序在做C仿真的时候是会出现错误的。

(3)四步曲

第一步,做 C仿真(C Simulation)

在这里插入图片描述
看到下图就是 C仿真 成功了,上面打印出了 Verify correctly 标识,与我们程序设定的验证成立条件是一致的,这里读者可以自己改一下数字尝试,看验证不成立的时候是不是会出现仿真出错的提示,这里留给读者尝试。
在这里插入图片描述
第二步,做 C综合(C Synthesis)。首先给输入输出和顶层函数添加 Directive 引导,选择 AXI协议端口 ,如下图所示。

在这里插入图片描述
在这里插入图片描述
对顶层模块 arithdatares 都做一样的操作,得到如下图所示的 Directive

在这里插入图片描述

点击下图红色框框的按钮,就在上一步 C仿真 的右边。

在这里插入图片描述
会出现下图错误,因为我们刚才没有 指定顶层模块 。根据提示做就可以了。

在这里插入图片描述
点击菜单栏 Project —— Project Settings… —— Synthesis ,然后根据下图点击就可以了。

在这里插入图片描述
之后再点击一次 C综合(C Synthesis) 按钮,就会出现下图所示的结果。

在这里插入图片描述
第三步,做 C/RTL联合仿真(C/RTL Cosimulation) ,点击下图中的红色框框,在上一步 C综合 的右边。

在这里插入图片描述
红色框框不用设置,直接点击 OK 就可以。

在这里插入图片描述
联合仿真之后出现下面的结果就是没有问题的。

在这里插入图片描述
第四步,点击下图红色框框的按钮,导出RTL(Export RTL) 也就是我们一直在说的 IP核 了。

在这里插入图片描述
直接点击 OK 就可以了。

在这里插入图片描述
导出后如下图所示,左边的四个框从上到下是刚做完的四步曲对应的四个结果,从上到下分别对应到 C仿真导出RTLC/RTL联合综合C综合

在这里插入图片描述

3 Vivado设计

(1)创建工程

首先创建工程项目,命名并存放在全英文路径中,然后点击 Next

在这里插入图片描述

点击下一步选择项目类型为 RTL Project ,下面的选项框选上,然后点击 Next

在这里插入图片描述
最后选择硬件型号即可,跟前面在 HLS 中选择是一样的。

在这里插入图片描述

(2)硬件电路连接

第一步,把 自定义IP核 添加到 IP目录 中,如下图点击 IP Catalog ,然后在窗口中右键,再选择 Add Repository

在这里插入图片描述
然后找到之前利用 HLS 生成的项目路径,找到其中的 ip 文件夹,如下图所示。

在这里插入图片描述
出现下图所示的 IP核 ,点击 OK 即可。

在这里插入图片描述
第二步,创建可视化的顶层文件,并连接电路。如下图所示点击 Create Block Design ,然后弹出对话框,不用改名字,直接点击 OK ,完成 Block Design 的创建。

在这里插入图片描述
在新出现的 Diagram 框中点击 + 号或者在框内右键再点击 Add IP… ,加入我们刚才设计的加法器IP核 Add ,如下图所示。

在这里插入图片描述
在搜索栏中分别输入 ZYNQHLS 以快速找到我们想要的 IP核 ,双击添加到我们的 Block Design

在这里插入图片描述
在这里插入图片描述
出现下图结果,然后需要配置 ZYNQ处理系统 的相关参数。

在这里插入图片描述
双击 ZYNQ7 Processing System ,配置 串口通信UART ,用于在PC上与硬件通信;配置 DDR3 ,用于数据的存储,根据硬件上 DDR 型号选择最相近的即可。如下图所示。最后点击 OK 完成配置。

在这里插入图片描述
在这里插入图片描述
回到 Diagram 界面,分别点击 Run Connection AutomationRun Block Automation ,完成自动连线和引出必要端口,如下图所示。

在这里插入图片描述
Run Connection Automation 对话框中直接点击 OK

在这里插入图片描述
Run Block Automation 对话框中直接点击 OK

在这里插入图片描述
得到如下电路图,然后点击 Validate Design 验证 Block Design 是否有错误。

在这里插入图片描述
出现以下信息框就是电路验证通过了,接下来的操作就是走走流程就可以了。

在这里插入图片描述

(3)硬件信息输出

第一步, 创建HDL封装(Create HDL Wrapper) ,按照下图三个红色方框从上到下依次点击,然后在出现的对话框点击 OK 即可。

在这里插入图片描述
在这里插入图片描述
第二步,生成硬件输出(Generate Output Products) ,如下图所示。弹出的 Generate Output Products 直接点击 Generate 即可,对话框中的 Number of jobs 表示想用几个CPU线程去完成这个输出,线程越多速度生成硬件心机就越快。

在这里插入图片描述
出现以下对话框点击 OK 即可。
在这里插入图片描述
生成完成后会出现下图对话框。

在这里插入图片描述
第三步,点击 Run Implementation 运行项目,对话框一直点击 OK 即可。

在这里插入图片描述
出现以下对话框点击 OK 即可。
在这里插入图片描述
第四步,第三步完成后会出现 Implementation Completed 对话框,可以看到设计的硬件实现的可视化结果图(点击 Open Implemented Design 再点击 OK ),也可以不看,直接生成含有硬件信息的 bit流(Generate Bitstream) ,如下图所示。可以直接在对话框中生成,也可以到左侧 Flow Navigator 导航栏中去操作生成,弹出的 Bitstream Generation Completed 对话框可以不看,直接点击 Cancel ,读者有兴趣的话也可以自行去点开看一下结果。

在这里插入图片描述
在这里插入图片描述
第五步,导出硬件信息(Export Hardware) ,按照下图点击,弹出的 Export Hardware 对话框把 Include Bitstream 选上,然后点 OK

在这里插入图片描述
在这里插入图片描述
搞定,Vivado 软件上的操作到此为止,接下来就是 SDK 的操作了。直接从 Vivado 软件中运行 SDK, 如下图,弹出的 Launch SDK 对话框直接点击 OK

在这里插入图片描述
补充一点,在每一步操作之后,软件右上角都会有一个软件运行状态的指示区,指示现在软件正在干什么活,读者在做完每一步操作都等它提示操作完成之后,再做下一步,避免出现问题。

由于本博文讲的比较详细,篇幅量较大,全部放在一个博文中读者不太方便阅读,所以笔者把剩下的工作放到下一篇博文《Vivado开发套件设计笔记(3)——加法器设计——指针(下)》中,如造成不便还请谅解。


原创性声明:本文属于作者原创性文章,小弟码字辛苦,转载还请注明出处。谢谢~

如果有哪些地方表述的不够得体和清晰,有存在的任何问题,亦或者程序存在任何考虑不周和漏洞,欢迎评论和指正,谢谢各路大佬。

需要代码和有需要相关技术支持的可咨询QQ:297461921

  • 3
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值