用ADI官方源码构建任意Xilinx的ZYNQ平台下的ADI芯片控制程序(1)——硬件平台搭建篇.
用ADI官方源码构建任意Xilinx的ZYNQ平台下的ADI芯片控制程序(2)——软件程序调试篇.
用ADI官方源码构建任意Xilinx的ZYNQ平台下的ADI芯片控制程序(1)——硬件平台搭建篇
全文以在Xilinx xc7z020clg400-2平台下控制AD7616为例讲解,对于其他xilinx平台、其他ADI芯片方法都是差不多的
1、下载准备文件
首先进入ADI的官网https://www.analog.com/cn/index.html,找到构建ZYNQ的Block Design文件所需要的源文件,我需要构建AD7616的工程,在官网搜索:AD7616 HDL。
点击下面的AD7616 No-OS/HDL Drivers进入网页,然后拖到网页最下面,单击进入AD7616-SDZ HDL Project.。
这个时候会跳转到Github,单击这个master,可以找到自己需要的分支,每个分支对应于不同的vivado版本,可以查看里面的文件来知道这个分支对应的vivado版本。但是不推荐使用这种方法,因为需要对Github有一定了解,而且不太直观方便的查看整体对应关系。推荐使用下面的方法。
这里推荐另一种下载HDL文件的方法,退回到刚才的AD7616 No-OS/HDL Drivers页面,在这个页面找到箭头所指的网页,单击进入。在新的页面中找到右边悬浮窗里面的Backlinks,然后单击进入到该页面。在Backlinks页面找到Releases,并进入该页面。在Releases最底部可以看到不同的源文件,找到自己的vivado工具对应的HDL文件版本,我使用的是vivado2018.3,所以我下载的是hdl_2019_r1。
2、用tcl文件构建Block Design
对于构建方法,ADI官网给了教程https://wiki.analog.com/resources/fpga/docs/build.,但是我觉得设置过于复杂,而且我没有linux的工程经验,不太能理解这种方法。所以我用了另一种比较费时但不费脑的方法。
对于刚才下载的源文件,建议不要改名,就保持下载下来的文件的名字和他们内部的相对位置,对于文件的存放位置建议放到某个盘的根目录,不要放到某个盘的好几级文件夹下,到时候可能导致路径过长。 务必重视我上面说的这些,不然到时候会出现很多奇奇怪怪的问题,如果后面熟练了可以尝试做些更改。
在后面的调试中我发现老是有一条警告,说找不到ghdl文件夹的路径,后面我干脆把我下载hdl-2019_r1文件夹名称改为了ghdl,这也是唯一我改了它文件名称的一次。
再说一次本文以AD7616,vivado2018.3为例。
我直接把文件夹放到了桌面上,首先需要编译库文件,到下载的文件里面找到projects→ad7616_sdz→zc706→Makefile。打开该文件,可以看到该工程包含了这几个Lib。
打开刚才下载的文件,进入library文件夹,找到和上面lib_deps同名的文件夹,以上面文本中第一个库axi_ad7616为例,进到axi_ad7616文件夹之后找到axi_ad7616_ip.tcl文件,上面文本中后面需要编译的几个库文件,在进入对应文件夹后,要找的都是后面加了_ip.tcl的文件。
打开vivado 2018.3 tcl shell软件后输入:cd 路径,以我的工程为例:cd C:/Users/Administrator/Desktop/ghdl/library/axi_ad7616,注意这里是“/”,回车,输入source ./axi_ad7616_ip.tcl,再回车,软件就会自己编译库文件,并且生成在vivado2018.3工具下的axi_ad7616的ip核,可以到axi_ad7616_ip.tcl文件目录下查看生成的IP工程。生成完成之后的命令窗口如图。按照上面的方法对Makefile里面提到的剩下几个库文件完成编译。
按照上面将我们已知的库文件编译之后就可以试着新建BD工程了,在projects→ad7616_sdz→zc706文件夹中,打开system_project.tcl,注释的大概意思是ad7616_if如果定义为0会生成串行通信控制AD7616的工程,定义为1会生成并行通信控制AD7616的工程,大家根据实际需要自行设置。我这里需要并行的,所以把参数改为了1,默认是0。
同样是vivado 2018.3 tcl shell中输入:cd C:/Users/Administrator/Desktop/ghdl/projects/ad7616_sdz/zc706,回车,source ./system_project.tcl,回车。
这个时候从命令窗口中的信息知道并没有生成成功,在里面找CRITICAL WARNING,之后的过程中如果没成功需要找的都是CRITICAL WARNING。
从提示信息知道,大致是因为缺少ip库文件。从这段话知道缺两个库util_cdc和util_axis_fifo。这个时候先关闭vivado 2018.3 tcl shell软件,然后到projects→ad7616_sdz→zc706文件夹中,把刚才生成的工程文件全部删除。可以根据文件日期来判断哪些是刚生成的,不要把官方例程包里面原来的文件删了
之后重新打开vivado 2018.3 tcl shell软件,按照上面编译库的方法,对这上面这两个库进行编译,然后重新输入创建BD工程的那条命令cd C:/Users/Administrator/Desktop/ghdl/projects/ad7616_sdz/zc706,回车,source ./system_project.tcl,回车。
之后还会提示失败,然后按上面的方法到CRITICAL WARNING中找到漏的库,然后关软件,到projects→ad7616_sdz→zc706删除刚才生成的工程文件,再打开软件编译刚才提示漏掉的库文件。然后输入创建工程的那条命令,之后会看到软件一直运行,一段时候后就能到projects→ad7616_sdz→zc706中看到生成的工程文件了,生成完成的标志是你可以在命令窗口中输入新命令。下面是我在zc706平台下创建AD7616用到的所有命令
按照这种方法重复个两三次就能新建成功,而且只要注意我上面说的这些一般都不会出错。但是这种方法有些繁琐,不过不用去下载软件,更改电脑设置,但是如果长远来看,还是官网教程效率高一些,而且一劳永逸。
3、构建自己Xilinx平台的Block Design
按上面的方法操作完成之后可以到projects/ad7616_sdz/zc706中看到刚才生成的工程文件,用vivado打开它。从工程总结中可以知道这个例程是针对特定的板子ZC706,主控芯片是xc7z045ffg900-2,打开Block Design之后会发现有几个脚没连线,没连线的这几个脚是由上面system_project.tcl中参数的设置决定的,我选的是并行控制有四个应用于串行通信的脚没连线。
要用这个例程构建适合自己Xilinx平台的BD文件,我能想到的有两种方法。
方法1:
一是到工程总结中更改主控芯片的类型,即把xc7z045ffg900-2改为我的xc7z020clg400-2,然后再到工程里面更新IP。我用这种方法改之后报了几个警告,没有错误。然后查看了警告里面提到的IP,和原来的对比了一下,接口类型从AXI3变为了AXI4,我也不知道有什么影响就没管,更改了引脚约束和zynq的ip核参数,编译通过后导出硬件,launch SDK,在程序里面写了一个打印函数,结果一直没打印信息,反复试了几次都不行。所以不太推荐这种方法,理论来说我只写一个打印函数,无论其他ip核状态如何,只需要zynq的ip核参数设置对就可以了。
而且在反复试的过程中,还出了这个错误,翻译过来是生成失败:没有错误。excuse me?不过虽然报错了但是还是能综合通过
方法2:
这里推荐使用下面的方法。因为我是第一次做,不太熟,所以新建的流程比较复杂。后面熟了之后可以跳过①。
①构建例程
我第一步也是在原工程上修改,不过我的目的是确定哪些IP核要留下来,从上面的BD文件可以看到有很多IP核,但是对于自己的特定应用来说很多是没有用的。目前已知的是这三个IP核是肯定需要的,那个axi_hp1_interconnect是系统连线自己生成的,这个可以先不管。
对于其他的IP来说,需要从官方提供的SDK中的程序来确定哪些是需要的,这里可以先看我的另一篇博客,用ADI官方源码构建任意Xilinx平台下的ZYNQ程序(2)——软件程序调试篇,把no-OS的程序包下载下来。从no-OS-2019_R1→ad7616-sdz文件夹中的程序可以知道除了这三个IP核,其他的IP核都没有进行调用,而且中断也没在程序中初始化,所以我把除了这三个IP和一些时钟和复位模块留了下来,其他的ip、中断和没连线的引脚都删除掉。除此之外,zynq上还挂了一个200m时钟在FCLK_CLK1上,但是它并没有与其他模块相连所以也可以把它去掉。
对于其他的ADI芯片的例程最终留下来的模块可能和我的不相同,因为我需要用官方给的SDK的程序,所以我需要根据no-OS里面程序决定留什么下来。
因为删除了一些模块导致zynq核上的一些总线、时钟和复位接口空了出来,所以需要到zynq核中把这些总线、时钟和复位接口去掉选中,不然后面会出错。
按上面更改之后,按照对一般的BD文件进行操作。保存,validate design,然后generate output products(选global),最后删除BD文件的wrapper文件。删除wrapper之后保存工程,然后关掉vivado软件,一定要关掉然后再打开工程。这个时候再对BD文件重新生成wrapper并且让vivado自己管理和更新wrapper文件。
正常情况下如果我们创建wrapper文件选了让vivado自己管理和更新wrapper文件,我们按上面的操作后,wrapper会自己更新,但是我们删了很多模块,那些模块的接口仍然在wrapper文件中,证明没有更新成功。后面查了之后发现是vivado软件自身的问题。只有先删除wrapper,然后关掉重启软件,新生成的wrapper才会剔除多于的接口。假如不重启软件,无论怎么重新生成wrapper那些接口都会一直在。
按照上面的方法操作之后还要去修改工程的顶层文件,去掉多于的引脚和模块例化。因为我创建工程时是选的并行,所以顶层文件是system_top_pi,串行是system_top_si。大家根据新生成的wrapper去修改顶层文件system_top_pi,这里就不细讲怎么修改。同时把约束文件中那些没用到的引脚也删除掉。所有修改完后就能生成Bitstream。
上面做了这么多工作,我的目的就是要弄出一个只有我需要的模块,而且又能够生成Bitstream的工程版本,这样我在后面自己做BD文件时候假如出了错,能够很好的去定位问题在哪里
②自己新建工程
注意,按照上面的方法编译ADI的库文件有很大问题,在新建自己的工程前要自己重新再打包一次IP核。因为①中确定了需要哪些IP核,就可以完成我们的工程需要,所以重新打包IP只需要打包那两个就可以了
在搭建好软件平台,上fpga联合调试时,发现一直有问题(最终发现软件和硬件都有问题)。在查看IP核库文件时,结果发现编译库时很多库都缺了文件,这里截一个ADI的DMA的库,其他的库也有这种情况。
唯一的解决办法就是手动找到这些文件,并且加到路径里面。像正常构建FPGA工程那样添加源文件就行,不过这里重点说这些源文件都在哪里,尤其是其中有一个真的特别难找。下图中后面这个是模块的名称,下一个“搜索everything”软件,然后在里面输入要找的文件名称就行,一般模块名和.v文件名字一样。
其中有一个文件,直接搜索这个文件名fifo_address_sync会发现找不到,其实它的文件名是address_sync。
我当时是直接到github上去搜索这个名字。结果发现他的.v文件命名是address_sync。
在文件全部添加成功后,编译整个工程,然后打开这个.xml文件,开始包装ip核,把packeting steps列表每个有小红点的选项都merge changes一次即可,最后re-package ip
按照上面的操作把需要的IP都重新包装一次就可以新建工程了
自己新建工程时,建议和例程建在同一路径上,对于新手来说,这样后面不容易出错,因为我换过路径结果编译时报过IP核出问题。假如要修改文件夹名称,比如hdl-2019_r1改为ghdl,那一定要在你编译库文件之前改
如果看的仔细会发现我博客截图中的工程路径出现过两个,一个文件夹名称是ghdl,一个hdl-2019_r1。因为我以hdl-2019_r1命名,在后面联合调试时一直有问题,我怀疑编译时的警告会对我的结果有影响,所以我删除了我第一次以hdl-2019_r1命名的文件夹,然后重新解压官方源文件,改了文件夹名称,对所有的库进行了重新编译。(这篇博客写的早,有些截图更改方便的都改了,有些懒得重新截图就保留原来的了)
这是我自己新建的路径,新建工程的主控芯片选择我的xc7z020clg400-2
大家根据创建BD文件方法自行创建,这里不细讲。这里说一下怎么加IP核路径,我下面这张图是已经加好了的,路径直接定位到Library文件夹就行,它会自动把上面编译过的IP核包含进去(这张图就是我没改文件夹名称前截的)。
按照在①中构建的例程添加和设置ADI的IP的参数、设置zynq的ip核。例程的PS端添加了一些用不到的接口,在自己新建时可以去掉。下面是我自己留下来的PS端接口,我的开发板用的是UART1串口和电脑通信。自己新建的工程对ADI的IP核的配置和①中例程一样,但是对于zynq的ip核根据自己的板子来设置,对于PS端哪些要保留可以根据官方给的no-OS中的程序和自己的需求来斟酌。我下面保留的是我反复调试sdk中程序与bd文件,然后没问题后最终留下的,第一次新建可以保留官方例程中ps端接口,但是接口参数要按自己板子的实际情况来
在添加完模块并且完成连线后根据①中例程的ip核和引脚的命名来改自己新建的工程中这些东西的名字,这样就可以不用去修改顶层文件system_top_pi
在修改ddr和fixed_io的名字会发现改不了,可以先把连线时系统自己生成的DDR和FIXED_IO引脚删掉,然后自己make external,这个时候就可以修改这两个引脚的名字了。最后再把①中例程的顶层文件system_top_pi和约束文件加载到自己的工程,根据自己硬件平台修改引脚位号和引脚电平就可以了。
对于这15个脚,sdk中没有程序对他们控制,而且对于ad7616的控制也没有作用,所以,这15个脚我也去掉了。最后编译,生成Bitstream,导出硬件(包含Bitstream),launch SDK。这个时候硬件平台就搭建完毕。