文章目录

  • 0. 声明
  • 1. 矿卡EBAZ4205介绍
  • 2. 学习要点和目标
  • 3. 成品板?开发板!
  • 4. 板载外设们
    • 4.1 TF卡及TF卡启动配置
    • 4.2 PWM输出电路的修改
    • 4.3 LED
    • 4.4 按键
    • 4.5 PS端时钟源
    • 4.6 PL端时钟源
      • (1)与IP101GA共享时钟源
      • (2)使用有源晶振
      • (3)MRCC和SRCC
  • 5. 裸机的Hello World(调试&固化)
    • 5.1 启动镜像和开发工具说明
    • 5.2 Vivado工程创建
      • (1)调用ZYNQ的IP核
      • (2)配置UART
      • (3)配置DDR
      • (4)精简其它配置项
      • (5)完成配置&验证
      • (6)创建HDL封装
      • (7)生成Bitstream文件
      • (8)导出硬件
      • (9)启动SDK
    • 5.3 SDK工程调试
      • (1)创建Hello World示例工程
      • (2)调试前硬件的准备工作
      • (3)配置板端调试
      • (4)启动板端调试
    • 5.4 将裸机镜像固化到NAND Flash
      • (1)ZYNQ启动流程概述
      • (2)NAND的适配和Vivado工程修改
      • (3)创建FSBL工程
        • ·1)创建启动镜像使用的FSBL
        • ·2)创建烧录NAND Flash使用的FSBL
      • (4)生成启动镜像
      • (5)下载启动镜像
  • 参考资料
    • 1. 相关信息
    • 2. 参考描述

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口的对应位置如图所示:


以上三处的焊接后样式如图所示:


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及其对应的电阻关系如下表所示:


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

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

4.2 PWM输出电路的修改

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


在一些版本中,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)》。如图所示:


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:3121Connected to hw_server @ TCP:127.0.0.1:3121
Available targets and devices:
Target 0 : jsn1
Target 1 : jsn2
Target 2 : jsn-DLC9LP-00000000000000Device 0: jsn-DLC9LP-00000000000000-4ba00477-0Device 1: jsn-DLC9LP-00000000000000-13722093-0Retrieving 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 infoPerforming 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 @燕卫博————

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

  1. 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(四)

    前情提要: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(三) 文章目录 0. ...

  2. EBAZ4205矿卡控制卡

    EBAZ4205矿卡控制卡 写在前面: ​ 前一段由于学习需要,在某鱼入手了一张EBAZ4205的控制卡,当时号称最便宜,最具性价比的ZYNQ开发板,对于穷学生一枚的我,果断入手,仅消耗30.然而在继 ...

  3. 成本低廉的深度学习与渲染显卡购买方案--英伟达矿卡P106

    此方案适用于个人或小型企业,此方案有不稳定性,如果预算充足请购买Tesla 显卡 转载请注明出处 视频:https://www.bilibili.com/video/av35317062 渲染,深度学 ...

  4. 用矿卡P106升级tensorflow深度学习服务器

    PS:本文绝不是广告,也和淘宝店主没任何关系!!! 最近发现淘宝上的矿卡便宜的让人心动,虽然去年已经买了一块技嘉的大将1066显卡,但是如果错失这个大好良机,那势必会给自己留下难以抹去的遗憾!400元 ...

  5. ZYNQ学习之路17.自定义SDSoC硬件平台

    前言 在前面的学习中,我们已经学会了使用Vivado及SDK开发环境,熟悉了硬件开发与Linux软件驱动之间的联系及开发流程.本系列教程我们学习SDSoc的开发,在SDSoc IDE中,Xilinx为 ...

  6. ZYNQ学习之路13.创建PetaLinux工程

    在前面的学习中,我们知道如何根据PetaLinux BSP设计去创建一个工程,现在,我们结合Vivado设计我们自己PetaLinux系统. 开发环境:Ubuntu16 64bit, PetaLinu ...

  7. Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK

    原文:Android学习-- 基于位置的服务 LBS(基于百度地图Android SDK)--定位SDK 版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.ne ...

  8. 5分钟学习基于Go,go-microservice-template,Minke的微服务

    本文讲的是5分钟学习基于Go,go-microservice-template,Minke的微服务,[编者的话]本篇文章介绍了Go语言下构建微服务的例子,作者利用一个helloword讲解了如何使用他 ...

  9. 随想录(zynq学习)

    [ 声明:版权所有,欢迎转载,请勿用于商业用途. 联系信箱:feixiaoxing @163.com] 最近学习zynq较多,这里做一个笔记,供日后参考使用.zynq是xilinx公司出的一款soc, ...

最新文章

  1. linux 查找 jdk 安装路径
  2. JavaScript之引用类型
  3. C语言实现二叉树(附完整源码)
  4. TensorFlow的基本使用
  5. TOAD连接Oracle数据库失败:OCI_INVALID_HANDLE解决
  6. Hungary(匈牙利算法)——二分图最大匹配
  7. C/C++中的近指令、远指针和巨指针
  8. ubuntu nginx 伪静态 设置
  9. iOS 数组模型排序
  10. PPT设计制作与美化
  11. HttpSession详解(简称session)
  12. [系统安全] 十一.那些年的熊猫烧香及PE病毒行为机理分析
  13. GD32实战14__RTC
  14. laravel添加语言包
  15. 利用Python爬虫批量下载百度图库图片
  16. 计算机页面下没有桌面图标,电脑下面小图标没了怎么办
  17. ##配置 SEP+RRPP 混合环组网
  18. android 该文件包与具有同一名称的现有文件包存在冲突
  19. 模拟手机预览(非F12)
  20. opencv图像对齐与图像相减python

热门文章

  1. 推荐8个值得推荐的神器软件和网站
  2. 虚拟机centOS6 Linux系统关于yum install mirror报错 路径报错
  3. 回顾在江西博微科技工作9个月回顾(吐槽)
  4. c4d在运行时候显示计算机内存不足,C4D R19 保存空文档时显示没有足够内存怎么办 空文档都不行 存哪都不行...
  5. 静态时序分析—串扰延迟分析(Crosstalk Delay Analysis)
  6. 历史在重演:从KHTML到WebKit,再到Blink
  7. 面试常见问题之OWASP top10
  8. 新手程序员成长之路的五本必读书籍(附资源下载)
  9. 100万量子比特,PsiQuantum要怎样实现?
  10. stm32心率监测系统(心率监测,wifi上传,APP显示,上位机显示)