从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一)

0. 声明

本文由长春理工大学电子信息工程学院C&I实验室所有,已获得原作者发布授权。转载请注明出处。

本文编写过程中参考了很多前辈的记录,在此表示感谢,已将所有参考项列于文末。

当前版本R1.0(预发布)。

作者联系方式:E-mail: WindForest@yeah.net

1. 矿卡EBAZ4205介绍

比特币因着时间的推移渐渐淡出公众的视线,在浪潮中追逐过的人们也随之一哄而散,所剩下来的,也许就是曾经为“挖矿”努力工作过的矿机们,蒙着厚厚的灰尘在无人知晓的角落被人遗忘。本文所基于的硬件便是它们其中的一员。

矿卡正面图
EBAZ4205大概是在2018年(或之前)被淘汰下来的,截至目前市面上的存货量依旧很大,一些大佬们对其进行了逆向(但不是很完整),使其在闲鱼上的价格一度飙到100块+,后来热度逐渐下降,又变回十几块到几十块之间(我购买的时候一块¥25)。虽然作为挖矿机它已经被时代淘汰,但作为开发板,仍有很多可用之处。

下面是对该板的参数说明:

  • EBAZ4205采用ZYNQ7010(XC7Z010-CLG400-1)作为主控。

  • DRAM有两个版本(就我知道的而言),分别是Etron的EM6GD16EWKG-12H(DDR3 SDRAM 2G-Bit 128Mx16 1.5V 96-Pin F-BGA),或者是镁光的MT41K128M16(丝印关键词:D9MPTK)。它们都是256MiB的DDR3(后者是DDR3L)。

  • 存储器使用华邦的W29N01HV,一个128MiB×8bit的NAND。

  • 单口百兆以太网芯片使用WIZnet的IP101GA,LQFP-48封装,3.3V供电。

  • 主板整体供电使用12V直流,但是论坛上有人测试5V似乎也可以跑起来;用于电源供电的接口类型为5557-6pin。

  • 成品板还自带1路PS调试串口、支持XILINX下载器的标准14pin JTAG调试口、2路PWM输出、TF卡槽(未焊接。注:官方手册中描述为SD Card,本文遵循矿卡采用的接口,称其为TF卡。)、两个LED、2个按键(其中之一未焊接)以及14路*3的PL端IO接口。对于PL端的AXI GPIO,已经有商家做出了匹配的转接板,提供RS232、VGA、OV7670等扩展接口,但是价格不菲,如有需要自己画板也是一个很好的选择。

这些资源差不多就是我们最终能够使用的了,详细的电路修改或者使用说明看后面的章节吧~如果时间允许我去搞的话。

2. 学习要点和目标

开始之前一定有一个疑问,为什么不直接使用成品的开发板呢?开发板的资料一定比这种逆向工程的资料要全一些。这是因为穷,如果有第二个原因,那就是:在可能的情况下,对于陌生的东西,自己在主动探索和发现的过程中会得到更多的成长、成就感和喜悦之情。

学习的目的不在于吃透这个板子,它只是工具,而且是性(you)价(bug)比(mei)比(ban)较(fa)高(gai)的便宜货,能学到多少是多少,只管尽力,但不要花费过多的时间和精力。本文只是对其PS端进行学习,学习的要点如下:

  1. 了解成品板基本结构,知道从购买回来到改造成开发板需要做的改动;

  2. 学习ZYNQ7000SoC的PS端工程构建流程;

  3. 掌握在成品板的局限环境下的烧录和调试方法;

  4. 学习NAND Flash相关知识(配置、烧录、启动等);

  5. 学习TF卡相关知识(配置、烧录、启动等);

  6. 学习基于Vivado+Petalinux配置下的PS端Linux对外设的访问;

  7. 学习PS-PL通过AXI总线的通信方法。

最终的目标是,我们可以有足够的资料和经验,将这块廉价的成品板做成实验室可用的开发板。

3. 成品板?开发板!

当购买回一块矿卡之后,需要进行以下修改才能进行基本的测试(查看原有程序的运行输出)。

  1. 焊接D24二极管(可使用SS810),以使矿卡可从5557-6pin接口获得供电。焊接也可使用一根铁丝直接短接,从原理图可知,它主要是起到桥接前后级电源的作用;

  2. 制作电源线。可以使用5557-6pin的端子自己制作,也可以简单粗暴地自己从背板焊出来两条线;

  3. 焊接JTAG排针。板子上的JTAG引脚是完全按照XILINX下载器的顺序定义的,因此为调试带来方便。JTAG口的对应位置如图所示:

JTAG调试口定义
以上三处的焊接后样式如图所示:

电源+JTAG+D24焊接
4. 焊接调试串口排针,其定义在板子上已经标出,此处不表。

最基本的操作完成了!把串口连接在开发PC上(可别问用什么连接,USB转TTL嘛),串口终端打开调试串口,通电即可看到输出。此时系统是从板载的NAND启动的,虽然不如TF卡方便,但是现在它有串口、最小系统和网口(可提供下载),已然成为了一块开发板。

4. 板载外设们

只能跑系统,实在是让开发者感到憋屈,更何况它是人造出来的机器,自然也得能和人进行互动才成,为一个系统配备输入和输出是基本的情怀(…也许吧)。所以下面看一看板子上的外设们。

事先声明,这些外设中,有些我也没进行过验证,只是搜集的资料或者随便乱写的,姑且看之吧(笑)。

注:以下对矿卡ZYNQ外设的配置修改方法可根据需求自行决定是否采用,它们不是必须的。

4.1 TF卡及TF卡启动配置

两种版本的矿卡中,TF卡相关电路的已焊接器件均是一样,在原理图中只有R166-10K-1%和R167-0Ω-1%是连接的,其余上拉电阻(R160、R161、R162、R163、R164、R165)和滤波电容(C93、C94)均为空贴,实际上只要焊接TF卡座即可。焊接前建议使用吸锡器清除焊盘上的焊锡再手动依次焊接,因为板子散热较好,风枪和烙铁不容易使焊盘达到焊锡熔点。

ZYNQ的启动模式配置在手册《UG585-ZYNQ7000技术参考手册(v1.12.2)》中,版本之间会有差异,但功能上不变,启动时MIO电平配置与启动方式之间的关系如图所示:

MIO电平配置与启动模式的关系
在矿卡上,这些MIO及其对应的电阻关系如下表所示:

启动配置MIO引脚和对应电阻
因此,将启动方式从NAND改为TF卡只需要将MIO[5]的电平从0改为1,即将R2584电阻换到R2577位。

一定要使用电阻而非短接,这一点是必须的,猜猜看为什么?(后文有答案)

4.2 PWM输出电路的修改

矿卡上共有两组PWM相关接口,它们的丝印分别是J3和J5。每一组有SPEED和PWM两个信号,SPEED线路为信号输入,PWM线路为信号输出,流经它们的信号经过光耦与外界隔离。各引脚的标号、信号流向以及与ZYNQ的连接如下表所示:

PWM组引脚定义
在一些版本中,PWM电路所需的光耦(PC817)和一些电阻未焊接,取而代之的是原理图上标出的一些NC电阻,因此在使用这些版本的PWM之前,电路上需要做如下修改:

  1. 拆除电阻:R2552、R2553、R2554、R2557,这些电阻在原理图上原本是NC;

  2. 焊接四个PC817光电耦合器;

  3. 焊接电阻:R2548-10K-1%、R2549-10K-1%、R2547-10K-1%、R2546-10K-1%、R2544-10K-1%、R2545-10K-1%、R2551-1K-1%、R2555-1K-%1(该电阻在原理图上错标为R3555)、R2550-10K-1%(该电阻在原理图上错标为R3550)、R2556-10K-1%。

4.3 LED

矿卡上原焊接有6个LED,它们(的丝印)分别是:

  1. 接在VCC和GND之间,用于指示供电的LED4;

  2. 接在ZYNQ的DONE_0引脚,用于指示ZYNQ配置完成的LED1;

  3. 接在ZYNQ上W13和W14的红、绿指示灯(暂未做对应)LED6;

  4. 接在IP101GA上的2个网口指示灯。

即可用于自定义的仅有2个。

4.4 按键

矿卡上共有2个按键,它们的丝印是S2和S3(注:没有S1),其中只有S2及其电路是已经焊接好的。

如需焊接S3,首先观察矿卡,确定其版本,使用Etron的DRAM版本的矿卡上,S3的相关电阻、电容均已焊好,只需焊接按键即可;使用镁光的DRAM版本的矿卡上,需焊接C2410-1UF和R2649-0Ω-1%(原理图上标注为R2641A),再焊接按键。

S2按键连接在ZYNQ的A17引脚;S3按键连接在ZYNQ的A14引脚。按键松开时引脚上为低电平。

4.5 PS端时钟源

PS端时钟输入引脚(PS_CLK)是固定的,矿卡采用一颗33.333MHz有源晶振作为PS端时钟。

4.6 PL端时钟源

总的来说,ZYNQ的PL端时钟有两个来源,它可以配置为由PS端提供,或由外部时钟提供。当使用外部时钟时,矿卡的硬件电路提供了两种选择。

(1)与IP101GA共享时钟源

IP101GA需要25.000MHz的晶振作为时钟来源,该晶振的输出经由电阻R1485(e.g. 33Ω)与ZYNQ的U18引脚相连。

注意:在使用镁光的DRAM版本的矿卡上,该电阻已处于连接的状态,此时需设置PL端通过R1485向IP101GA提供时钟;在使用Etron的DRAM版本的矿卡上,可增加R1485使PL端获取到IP101GA的时钟。

注:在PL和IP101GA共享时钟源时,需要注意PL端IO配置,否则会出现PHY不工作或ZYNQ端检测PHY异常的情况。

另一种时钟来源与IP101GA本身的配置有关,IP101GA的RXCLK和TXCLK分别接到了ZYNQ的U14、U15引脚(硬件线路连接),且IP101GA的Pin1内部接到GND、Pin44外部接到VCC,芯片即工作在MII 100Mbps模式,此时RXCLK/TXCLK的时钟是25MHz,即U14、U15之间为25MHz。相关信息来源已放置在文末参考资料列表中。

(2)使用有源晶振

两个版本中,晶振部分电路均未焊接。使用时,需至少焊接R1372(<50Ω)、有源晶振(3325封装,≤50MHz)、L29电感(可直连)。R277、C362、C363和C364可不焊接。其中,L29电感和C363电容在板子背面。有源晶振的输出连接在ZYNQ的N18引脚。

(3)MRCC和SRCC

注意(其实原理图上也有注明),以上所述时钟源连接的引脚(U14、U15、U18、N18)均具备M/SRCC属性。

注:欲查看XC7Z010-CLG400的引脚位置和定义,可参考《UG865-Zynq-7000 SoC封装和引脚输出产品规格(v1.8.1)》。如图所示:

XC7Z010-CLG400的封装信息
MRCC、SECC是区域时钟的BUFIO,MRCC能驱动相同、上下相邻bank/时钟区域的IO,SECC只能驱动相同bank/时钟区域的IO。

ZYNQ的时钟相关信息可参考《UG472-7系列FPGA时钟资源用户指南(v1.14)》,以及文末参考资料所列项目。

5. 裸机的Hello World(调试&固化)

裸机Hello World程序的意义是:在较少的软件构建下,快速验证ZYNQ最小系统运行条件的完备性。ZYNQ最小系统包括PS处理核心、DDR初始化和调试串口。非常幸运的是,这些操作已经有前人做过、并且留下记录了,但是别人的经验不能直接“拿来主义”,所以这里还是会重写一遍。

本章涉及到的外设有:DDR、UART1。

本章相关信息来源已放置在文末参考资料列表中。

5.1 启动镜像和开发工具说明

制作启动镜像需要以下三个文件:

  1. FSBL镜像:第一阶段引导,用于配置PL和加载用户应用程序;
  2. Bitstream文件(比特流,后文直接使用此翻译名称):用于在启动时配置PL端参数;
  3. 应用程序代码:属于SSBL第二阶段引导,如果是裸机,则开始运行应用程序;如果使用操作系统等,则开始运行U-Boot。

裸机Hello World程序的镜像文件的生成主要用到Xilinx SDK(后文简称为SDK)和Vivado两个软件。与硬件相关的项目,例如接口、时钟配置和硬件比特流生成等,均在Vivado中完成;与软件相关的任务,包括裸机应用程序工程创建、编译和运行调试等,均在SDK中完成。

对于开发平台,本文以2017.4版本的工具作为示例。后文使用的Vivado、SDK、Petalinux均为此版本。这是因为项目适配需要。而如果你使用的是2019.2版本的XILINX开发套件,开发流程会有所不同,在这里也顺便提一嘴,2019.2版本起,Vivado变成Vitis的子项,Vitis取代了SDK成为统一开发平台,板级描述文件的后缀名也从 *.dhf 变成了 *.xsa ,但是依旧使用Petalinux生成需要的内核镜像等。

言归正传,深入了解这些镜像文件的还需学习ZYNQ的启动流程,关于启动流程的说明可参考《UG821-Zynq-7000所有可编程SoC软件开发人员指南(v12.0)》,本章暂时不表。

5.2 Vivado工程创建

打开Vivado,选择“Create Project”:

在这里插入图片描述
点击“Next”:

在这里插入图片描述
输入工程名字和存储位置,点击“Next”:

在这里插入图片描述
保持默认值,点击“Next”:

在这里插入图片描述
搜索匹配的芯片类型,点击“Next”:

在这里插入图片描述
最后确认无误后,点击“Finish”完成。

在这里插入图片描述
在这里插入图片描述
最终完成后,进入到工程主界面。这里都是英文,不过不用害怕,因为在此次示例中,需要用到的功能并不多。

在这里插入图片描述
在主页面中,左边一栏的操作是按照工程从开始到完成的流程顺次排列的。

(1)调用ZYNQ的IP核

点击左侧的Create Block Design(创建模块设计),在弹出的窗口中输入设计名字,目录和资源位置保持默认。

在这里插入图片描述
在Diagram(图表)框中,点击“+”,以增加一个现有的IP核。输入“ZYNQ”进行搜索,选择“ZYNQ7 Processing System(ZYNQ7系列处理系统)”。
在这里插入图片描述
在这里插入图片描述
添加好之后的IP核如下图所示。显然,这众多的引脚和前面所说的“最小系统”有些出入,因此需要对暂时不用的功能进行裁剪,并针对矿卡硬件配置DDR参数和UART参数。

在这里插入图片描述
双击“processing_system7_0”模块,进入ZYNQ7系列处理系统的配置界面。配置界面左侧为导航面板,右侧为信息面板。导航页中的每项可从初始的“Zynq Block Design”项的信息面板中切换过去。以绿色填充的模块为可配置模块。

在这里插入图片描述
导航面板中各项的作用和说明如下:

PS-PL Configuration(PS-PL配置)

用于配置PS和PL之间的通信接口,包括AXI、HP和ACP总线接口。

Peripheral I/O Pins(外围I/O引脚)

和下一项对应,用于配置片内资源对外接口,如资源使能、引脚复用等。

在这里可以看出,片内资源使用的引脚集中在Bank0[0,15]和Bank1[16,53]上。对于矿卡,两个Bank的电压均设置为3.3V。

MIO Configuration(MIO配置)

和上一项对应,用于更详细的MIO配置。

Clock Configuration(时钟配置)

用于配置PS输入时钟、外设时钟、DDR时钟、CPU时钟等。

DDR Configuration(DDR配置)

用于配置DDR控制器。

SMC Timing Calculation(SMC时序计算)

用于SMC(Static Memory Controller,静态存储控制器)时序计算。SMC是PS内置硬核模块。

Interrupts(中断)

用于配置PS端和PL端之间的中断信号。

(2)配置UART

首先进行UART的配置。调试串口在硬件板上的插接件丝印为J7,对照原理图可知其TxD和RxD对应ZYNQ的A16和F15。

在这里插入图片描述
查找引脚号和对应的引脚名称可登陆下面的网站:XILINX Package Files Portal,选择“Zynq®-7000 SoC Package Files”项,选择对应型号和封装,即可查看引脚信息。经过对比可知,矿卡UART的TxD连在MIO24,、RxD连在MIO25。

查看《UG585-ZYNQ7000技术参考手册(v1.12.2)》2.5.4 MIO-at-a-Glance Table(MIO概览表)可知,MIO24和MIO25属于UART1。因此我们照此配置,配置信息和原理图吻合,两者得以相互验证。

在这里插入图片描述
而后在“PS-PL Configuration”中设置UART1的波特率为115200bps(默认已为115200)。

在这里插入图片描述
至此,UART1配置完成。

(3)配置DDR

DDR是ZYNQ运行时所必须的,根据相关描述(已放置在文末参考资料列表中),矿卡使用的256MiB单内存颗粒总线位宽必须配置为16 Bit。配置参数如下图:

在这里插入图片描述
在“Clock Configuration(时钟配置)”中配置PS端输入时钟,矿卡的PS使用33.333MHz晶振,前文已经提过了。

在这里插入图片描述

(4)精简其它配置项

因本例无需PL端资源,因此去除PS-PL连接相关的配置。

1.取消选择“Clock Configuration”->“PL Fabric Clocks”中“FCLK_CLK0”项;

注:该项可作为PS端向PL端提供时钟的输出接口。

2.取消选择“PS-PL Configuration”->“General”->“Enable Clock Resets”中“FCLK_RESET0_N”项;

3.取消选择“PS-PL Configuration”->“AXI Non Secure Enablement”->“GP Master AXI Interface”中“M AXI GP0 interface”项。

(5)完成配置&验证

配置完成后,单击“OK”即可看到ZYNQ的IP核框图完成更新。此时点击“Run Block Automation(运行块自动化)”:

在这里插入图片描述
在弹出的界面中我们可以选择自动连接 IP 模块的接口,包括导出外部端口,甚至可以自动添加模块互联过程中所需的IP。本次设计中只有一个IP模块,在左侧确认勾选“processing_system7_0”,然后点击“OK”。

完成后可点击“Validate Design(F6)(验证设计)”确保设计正确。

在这里插入图片描述
在这里插入图片描述

(6)创建HDL封装

首先,在“Source”视图中右键本次设计,选择“Generate Output Products”:

在这里插入图片描述
在弹出的框中,按照默认配置即可:

在这里插入图片描述
在生成过程中Vivado会为当前设计生成所有需要的输出结果。比如处理系统的XDC约束文件,因此我们不需要手动对ZYNQ PS引出的接口(DDR和FIXED_IO)进行管脚分配。完成后,在弹出的对话框中点击“OK”。

在Sources窗口中,点击“IP Source”标签页,可以看到生成操作的输出结果。

在这里插入图片描述
然后,在之前相同的菜单下选择“Create HDL Wrapper”:

在这里插入图片描述
出现如下界面:

在这里插入图片描述
上面的选项表示:生成允许用户编辑的HDL;下面的则表示:生成由Vivado自动更新的只读HDL。

完成后的Sources视图如下图所示:

在这里插入图片描述

ZYNQ7010_wrapper.v是创建的Verilog文件,前置图标表示当前模块为顶层模块,主要完成对Block Design的例化操作。

另外,由于之前生成HDL时选择了自动更新,因此再次修改Block Design之后不需再重新生成顶层模块,Vivado会自动更新。

(7)生成Bitstream文件

比特流文件用于描述PL端的初始化。如果设计中使用到了PL的资源,则需要添加引脚约束并对设计进行综合、实现并生成比特流文件。

在这里插入图片描述
本次设计不涉及到PL端资源,但依然需要学会如何生成和使用它。

(8)导出硬件

选择“File”->“Export”->“Export Hardware”,出现下图对话框:

在这里插入图片描述
勾选“Include bitstream”选项。点击“OK”完成。

(9)启动SDK

在Vivado工程中启动SDK可免去设置工作文件夹等的麻烦。选择“File”->“Launch SDK”。在弹出的对话框中直接点击“OK”即可。

至此,裸机Hello World工程的Vivado部分配置完成。

5.3 SDK工程调试

在上一步末尾,Vivado将启动SDK并将工程目录等设置为当前设计。这一步我们要先建立Hello World应用程序,并通过JTAG的方式在矿卡上运行它,以了解SDK的调试流程。

在这里插入图片描述

(1)创建Hello World示例工程

选择“File”->“New”->“Application Project”:

在这里插入图片描述

OS Platform表示使用哪种操作系统,裸机情况下选择“standalone”。

输入工程名,其余保持默认即可,点击“Next”,选择Hello World示例工程:

在这里插入图片描述
点击“Finish”完成创建。

工程创建完成后,SDK主界面会打开BSP工程目录下的system.mss文件。MSS是英文Microprocessor Software Specification的缩写,即微处理器软件说明。该文件包含BSP的操作系统信息和硬件设计中各个外设的软件驱动等信息。

SDK会创建一个应用程序工程和板级支持工程,并自动编译工程(手动编译快捷键为Ctrl+B)。完成后,SDK中的工程结构如下图所示:

在这里插入图片描述

(2)调试前硬件的准备工作

矿卡的启动引脚的配置为从NAND启动,这在4.1节已经有所介绍,然而使用SDK进行下载时,ZYNQ必须处于JTAG模式。在市售的开发板上,启动配置通常使用拨码开关或跳线设置,但在矿卡上我们一无所有。

(3)配置板端调试

XILINX下载器(Platform Cable USB)的安装指南可参见《UG344 - USB Cable Installation Guide (v2.2)》,驱动程序下载位置可在https://china.xilinx.com/search/support-keyword-search.html#q=UG344查看,或尝试访问截至目前有效的下载地址:https://china.xilinx.com/member/forms/download/design-license.html?cid=100840&filename=ug344_windows.zip

选择“Run”->“Debug Configurations”,双击左侧“Xilinx C/C++ application (System Debugger)”新建一个配置项,并按如下配置:

如果前面生成了比特流文件,则在此界面中“Target Setup”选项卡下的“Bitstream File”项中导入相应的比特流文件。

在这里插入图片描述
而后切换到“Application”选项卡,配置某核心要运行的应用程序——也就是刚才编译好的elf文件。

因为在“Target Setup”选项卡中选择了“Reset entire system(重置整个系统)”,因此在“Application”选项卡中的“Reset Processor”不可选择。

全部配置完成后点击“Apply”提交更改,而后关闭配置页面。

在这里插入图片描述

(4)启动板端调试

首先保证XILINX下载器的连接。

如果下载器未连接,则SDK连接到TCP:127.0.0.1:3121失败,后续操作将提示以下信息:

在这里插入图片描述
选择“Xilinx”->“Program FPGA”:

在这里插入图片描述
弹出以下对话框:

在这里插入图片描述
点击“Program”将生成的比特流文件通过JTAG下载到ZYNQ中:

在这里插入图片描述

如果不进行这一步,后续操作将提示以下信息:

在这里插入图片描述
在Hello World应用程序工程上右键->“Debug As”->“1 Launch on Hardware (System Debugger)”:

在这里插入图片描述
在弹出的框中选择“YES”则进入到DEBUG窗口,可查看堆栈和寄存器的值,选择“NO”可留在当前窗口。页面右上角可快速切换两种窗口。

点击状态栏上的运行按钮即可在SDK Terminal(SDK终端)查看到输出。

关于SDK Terminal

如果下方没有该窗口,则可以选择“Window”->“Show View”->“Other”,在弹出的对话框中选择“Xilinx”->“SDK Terminal”调出该终端。

在这里插入图片描述

此时在下方会有SDK Terminal出现:

在这里插入图片描述

点击“+”打开一个串口连接,串口为ZYNQ和电脑通过调试UART(即前面配置的UART1)连接生成的端口号。

在这里插入图片描述

点击“OK”,连接后在SDK Terminal中会有相应的提示。

在这里插入图片描述
最终工程的输出如下:

在这里插入图片描述
至此,在PC端使用Debug模式调试裸机Hello World工程完成。

5.4 将裸机镜像固化到NAND Flash

前面我们实现了裸机调试Hello World程序。先使用比特流文件对FPGA(PL端)进行编程,再使用Xilinx系统调试器使目标板运行我们的程序。但是让程序独立在板子上运行才是最终目的。因此本节在前面叙述的基础上尝试制作裸机Hello World的启动镜像。

(1)ZYNQ启动流程概述

想让ZYNQ上电自动运行用户的应用程序,需要了解它从上电开始做了哪些动作,这个流程可参考《UG821-Zynq-7000所有可编程SoC软件开发人员指南(v12.0)》和《UG585-ZYNQ7000技术参考手册(v1.12.2)》,网络上相关信息也非常之多,此处不再赘述。

总体来讲,ZYNQ内部存储了最基本的固件(BootROM),用于开机时的判断和处理逻辑,BootROM的执行过程被称为第〇启动阶段(Stage-0 Boot)。随后BootROM将First Stage Bootloader(即FSBL)载入进OCM并开始执行,FSBL和BootROM一样,都是执行在OCM(On-Chip Memory)上的。

FSBL执行时做了以下事情:

  1. 使用Xilinx硬件配置工具提供的PS端配置数据进行初始化;
  2. 使用比特流(如果提供的话)对PL端进行编程;
  3. 将第二阶段引导程序(Second Stage Bootloader, SSBL)或裸机应用程序代码加载到DDR内存中;
  4. 移交给SSBL或裸机应用程序。

第二阶段引导程序一般就是通常意义上的Bootloader(U-Boot用的多一些…吧),用于继续启动操作系统,这在本例中并不需要。现在,我们已经有了比特流文件和裸机应用程序的elf二进制代码。

(2)NAND的适配和Vivado工程修改

将程序固化在NAND中,需要ZYNQ上电时初始化NAND静态存储器,因此需要对之前的Vivado工程进行一些修改,以增加对NAND的支持。

双击IP核,选择“Peripheral I/O Pins”,在右侧勾选NAND Flash器件,由于矿卡使用的W29N01HV是8bit数据位宽,因此不需要使能date[8:15]:

在这里插入图片描述

这里使用的NAND Flash是3.3V电平的,因此其余配置保持默认即可,如需更换NAND等,需要在“MIO Configuration”中对其详细修改。

而后切换到“SMC Timing Calculation”,按照如下参数配置时序:

在这里插入图片描述
点击“OK”完成配置。

在Vivado主界面依次点击“Run Synthesis”、“Run Implemented”、“Generate Bitstream”已完成工程的重新编译。

或者直接点击“Generate Bitstream”,一路“YES下去,”Vivado会自动完成其它项目。

选择“File”->“Export”->“Export Hardware”,包含比特流,并在提示是否覆盖时选择“YES”:

在这里插入图片描述
而后重新启动SDK编译即可。

(3)创建FSBL工程

SDK中已经提供了FSBL工程模板,所以直接使用它生成我们需要的fsbl.elf就可以了。

·1)创建启动镜像使用的FSBL

选择“File”->“New”->“Application Project”,这一步和创建Hello World示例工程一样,注意板级支持包要选取之前生成的那一个,然后点击“Next”:

在这里插入图片描述

我事先生成过了,所以这里显示不能重复创建。另外,注意这里不要直接点“Finish”。

而后选择FSBL工程:

在这里插入图片描述
点击“Finish”完成。按“Ctrl+B”编译整个工程。

如果生成过程提示“This application requires xilffs library in the Board Support Package.”:

在这里插入图片描述

则在板级支持工程文件夹中的mss文件中添加xilffs库即可。

在这里插入图片描述

·2)创建烧录NAND Flash使用的FSBL

矿卡的NAND Flash和启动引脚共用PS_MIO,如果通过改动启动配置电阻的方式进行下载,那么下载之后还需要把电阻改回到NAND模式,非常的麻烦。

如果简单地在MIO[4]的下拉电阻R2582位焊接开关作为启动模式选择,则会导致NAND读写烧录失败。找出这个忽略了引脚复用导致的问题使我多花费了3天的时间。

因此为了方便调试和配置,可以从ZYNQ的下载流程进行如下考虑:

Xilinx SDK在下载时需要一个额外的FSBL文件,该引导程序仅用于下载,具体内容大概就是一个自动运行Flash烧写并通过JTAG与SDK进行通信的U-Boot。又因为在FSBL的主程序中,会对启动配置进行判断以便转入相应的处理分支,因此,如果我们修改下载用的FSBL程序,使其强制进入JTAG模式,则随后的引导将无视实际启动配置。具体操作过程如下:

  1. 重新建立一个FSBL工程,命名要与先前的不同以防止冲突,这里命名为“FSBL_for_EBAZ4205_JTAG”。板级支持工程同样选择先前那个。

  2. 打开FSBL_for_EBAZ4205_JTAG\src\main.c,搜索“BootModeRegister”变量,并在下图所示上下文进行修改:

    在这里插入图片描述

  3. 保存并编译待用。

(4)生成启动镜像

选中我们的Hello World工程主目录,在其上右键选择“Create Boot Image”:

在这里插入图片描述
注意下面的启动镜像分区中各项的顺序,必须是FSBL->Bitstream File->App。一定注意启动镜像使用的FSBL是用于Hello World的FSBL。

如果烧写到NAND或SD卡,输出格式为BIN;如果烧写到QSPIFlash,输出格式为MCS。

点击“Create Image”生成镜像,生成的镜像在应用程序主目录下的“bootimage”文件夹下:

在这里插入图片描述

注:如果程序有改动或板配置有变化,需重新生成启动镜像。

(5)下载启动镜像

将JTAG和串口线连接到矿卡,和之前的调试一样,需要使ZYNQ启动在JTAG模式。

XILINX下载器连接到就绪会花费一点时间,否则会出现错误。若该过程中无法检测到Cable,可在编程时手动指定设备。“Program Flash”同理。

在这里插入图片描述

检测Cable需要矿卡在上电状态。

选择“Xilinx”->“Program Flash”,确保“Flash Type”项为“nand_8”,并选择先前“FSBL_for_EBAZ4205_JTAG”工程编译生成的elf文件作为下载用的FSBL:

在这里插入图片描述

另外一定注意下载使用的FSBL文件是修改之后的用于烧录Flash的FSBL。具体说明见“创建烧录NAND Flash使用的FSBL”章节。

而后点击“Program”下载,下载完成后断电,从NAND重新启动即可从串口看到输出:

在这里插入图片描述
烧录过程打印信息如下:

cmd /C program_flash -f \
G:\ZYNQ_HelloWorld\ZYNQ_HelloWorld.sdk\hello_world_for_EBAZ4205\bootimage\BOOT.bin -offset \
0 -flash_type nand_8 -fsbl \
G:\ZYNQ_HelloWorld\ZYNQ_HelloWorld.sdk\FSBL_for_EBAZ4205_JTAG\Debug\FSBL_for_EBAZ4205_JTAG.elf \
-cable type xilinx_tcf url TCP:127.0.0.1:3121 esn Xilinx/00000000000000/ -debugdevice \
deviceNr 2 

****** Xilinx Program Flash
****** Program Flash v2017.4 (64-bit)
  **** SW Build 2086221 on Fri Dec 15 20:55:39 MST 2017
    ** Copyright 1986-2017 Xilinx, Inc. All Rights Reserved.

Connecting to hw_server @ TCP:127.0.0.1:3121

Connected to hw_server @ TCP:127.0.0.1:3121
Available targets and devices:
Target 0 : jsn1
Target 1 : jsn2
Target 2 : jsn-DLC9LP-00000000000000
	Device 0: jsn-DLC9LP-00000000000000-4ba00477-0
	Device 1: jsn-DLC9LP-00000000000000-13722093-0

Retrieving Flash info...

Initialization done, programming the memory
BOOT_MODE REG = 0x00000005
WARNING: [Xicom 50-100] The current boot mode is SD.
If flash programming fails, configure device for JTAG boot mode and try again.
and info


Performing Erase Operation...
Erase Operation successful.
INFO: [Xicom 50-44] Elapsed time = 4 sec.
Performing Program Operation...
0%...50%...100%
Program Operation successful.
INFO: [Xicom 50-44] Elapsed time = 39 sec.

Flash Operation Successful

从上面的记录可以看出,修改后的FSBL忽略对启动模式的检测,直接进行了烧录任务。

至此,基于NAND Flash的裸机Hello World工程镜像的制作、固化、烧录和运行成功完成。

参考资料

本文编写过程中参考的所有资料均列在下方。本文若与任何列表之外的文章、博客、视频、教程等描述相同或相似则纯属巧合。

另在此处再次对以下资料的作者们表示感谢。

1. 相关信息

  1. Xilinx 7系列FPGA时钟篇(3)_时钟操作法则
  2. 原理图中的MRCC和SRCC有什么区别…百度知道
  3. SD卡 TF卡 接口引脚定义

2. 参考描述

  1. zynq7010之EBAZ4205入门改造_CSDN
  2. “关于EBAZ4205的PL部分的时钟的说明_OSCHINA”
  3. zynq7010之EBAZ4205之helloworld_CSDN
  4. 100块学会ZYNQ-矿板Nand Flash烧写和启动_CSDN
  5. zynq 制作镜像_CSDN
  6. EBAZ4205 ZYNQ 7Z010 裸机程序NAND固化 JTAG调试方法_简书
  7. 【ZYNQ】EBAZ4205 ZYNQ 7010矿板改造开发板_CSDN
  8. ZYNQ 从NAND flash启动应用笔记_CSDN
  9. zynq[1] 矿板helloworld

————2020-11-17 @燕卫博————

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 深蓝海洋 设计师:CSDN官方博客 返回首页