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

【ZYNQ】EBAZ4205 ZYNQ 7010矿板改造开发板 前言 EBAZ4205是矿机的控制板,价格便宜;现在咸鱼上大约50左右就可以收到一块成色不错的。 EBAZ4205硬件资源丰富,其使用XILINX XC7Z010-1CLG400I 作为主控芯片,芯片的SOC包含两个硬核ARM A9,以及ARTIX-7逻辑。板子还有一颗128M x 16 bit DDR3 CLK800MHz,一块128M字节 NAND FLASH,PS端 33.333Mhz晶振;板子预留有一个JTAG调试接口,一个4Pin串口,一个网口,数量众多的PL端引出的引脚(PH2.0插座)…具体可 阅读详情
AI摘要

本文介绍矿卡EBAZ4205改造为开发板的过程。先介绍其参数,明确学习要点与目标。接着阐述成品板改造步骤,包括焊接等操作。还介绍板载外设配置修改,如TF卡、PWM电路等。最后详细说明裸机Hello World程序调试与固化到NAND Flash的方法。

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

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

【Zynq7010 ebaz4205矿渣变废为宝(此教程包含如何更改PL侧的电路,使得能够正常使用PL侧的资源)】 FPGA ebaz4205矿渣变废为宝(此教程包含如何更改PL侧的电路,使得能够正常使用PL侧的资源) 阅读详情

相关推荐

ZYNQ入门,EBAZ4205开发平台从头开始搭建

EBAZ4205 ZYNQ7010开发板平台搭建。

weixin_42157664的博客 9362

EBAZ4205矿卡控制卡

EBAZ4205矿卡控制卡 写在前面: ​ 前一段由于学习需要,在某鱼入手了一张EBAZ4205的控制卡,当时号称最便宜,最具性价比的ZYNQ开发板,对于穷学生一枚的我,果断入手,仅消耗30。然而在继续研究时发现,自己还是太天真了,板子是便宜,但是板子的下载器相当不便宜,某宝平均一张毛爷爷。犹豫再三,最终选择继续某鱼之旅,耗时半天以半张毛爷爷加包邮拿下,到手一看还是新的,经测试,功能完美,遂喜出望外。 1. EBAZ4205介绍 名称 说明 主控 XC7Z010CLG400

a18833260807的博客 6634

【ZYNQ】EBAZ4205矿板低成本改造实战:从硬件调试到Hello World

本文详细介绍了如何将EBAZ4205矿板低成本改造为功能完整的ZYNQ开发板。从硬件供电、调试接口改造到启动模式设置,再到使用Vivado搭建软件环境、创建首个点灯工程,并最终通过SDK实现Hello World程序下载与固化,提供了从硬件调试到软件开发的完整实战指南。

redis7keeper的博客 707

EBAZ4205踩坑记录

这块ZYNQ-7000的二手板子很经典,最早在2019年被人发现。板子资源还是不错的,共引出了3*14个PL侧的IO,可用来研究PL、PS-PL交互,学习PS侧SDK,Linux开发。唯一的遗憾是Bank电压固定为3.3V,没法玩LVDS。

leida_wt的博客 3287

【ZYNQ】EBAZ4205矿板低成本改造:从硬件调试到Hello World实战

本文详细介绍了如何将EBAZ4205矿板低成本改造为功能完整的ZYNQ开发板。从硬件供电、调试接口焊接、启动模式切换等关键改造步骤,到使用Vivado配置ZYNQ 7010芯片、编写PL逻辑、创建SDK工程并最终烧录运行Hello World程序,提供了从零开始的完整实战指南,帮助开发者以极低成本入门ARM+FPGA异构计算。

cc789的博客 1067

EBAZ4205矿板避坑指南:从NAND启动切换到JTAG模式的实战细节

本文详细解析了EBAZ4205矿板从NAND启动模式切换到JTAG模式的完整实战方案。针对基于ZYNQ 7010的这块热门开发板,文章深入剖析了ZYNQ启动流程,并提供了硬件电阻移位与软件FSBL配置两种核心方法,帮助开发者彻底解决启动障碍,实现高效的裸机调试与系统固化。

cc789的博客 837

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

前情提要: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二) 文章目录0. 声明7. 让我们移植一个Ubuntu吧!(基于Debootstrap)7.1 宿主机环境配置7.2 使用Debootstrap生成最小Rootfs7.3 系统配置(1)Debootstrap第二阶段展开(2)创建登录用户(3)为apt工具换源(4)修改网络连接8. 让我们移植一个Ubuntu吧!(基于Ubuntu Base 20.04)8.1 宿主机环境配置8.2 系

Turix附属空间[已停用] 4000

告别拨码开关:在EBAZ4205矿卡上,用软件搞定ZYNQ启动模式切换与NAND固化

本文详细介绍了在EBAZ4205矿卡上实现ZYNQ启动模式软件切换的创新方法,解决了传统拨码开关缺失带来的开发难题。通过修改FSBL源码,开发者可在NAND固化配置下灵活切换至JTAG调试模式,显著提升开发效率。方案兼容Vivado开发环境,适用于ZYNQ7010平台的嵌入式开发。

weixin_33743661的博客 680

zynq 和fpga区别_使用 Xilinx Vitis 在ZYNQ(EBAZ4205矿机)上实现"Hello World

Vitis是 Xilinx 最新推出的开发平台,虽然Vitis 早就在电脑上安装好了,但一直没怎么使用。现在用低成本的ZYNQ矿机来体验下 Vitis ,看看与之前版本的软件有什么区别。1.Vivado 搭建 ZYNQ 的硬件平台这一步,按照以前版本的使用方法,创建好工程,在 Block Design 里面添加 ZYNQ IP,再对 ZYNQ IP 进行简单设置就 OK 了。可以看到 EBAZ42...

weixin_39740272的博客 914

EBAZ4205 ebit 矿板 PYNQ镜像制作详细步骤 zynq7010

此文章记录使用矿板搭建环境的步骤,和解决其中的问题 1、使用VMware搭建Ubuntu16.04版本的虚拟机,一定要注意虚拟机内存至少4G左右,否则后面会出现很多问题。 shell切换到bash sudo dpkg-reconfigure dash 选NO 2、根据网上教程安装petalinux2018.3 Vivado2018.3 。其中Vivado里面会包含SDK。这两个安装到哪个目录下都行,我一般安装到 /home/user/ 目录下。 有人喜欢安装到 /opt 目录下,安装到这个...

u013276653的博客 2205

EBAZ4205扩展板原理图

EBAZ4205矿板扩展板,搭载了电源输入的TypeC接口,和转3.3V的转换电路,还有HDMI的相关电平转换电路,串口屏的信号线和HDMI接口的HPD信号线和CEC信号线公用(这两个信号HDMI显示的话用不上,是用来实现特殊功能的)并通过跳线帽进行选择。其余的排针都引出来了。

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

前情提要:从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一) 文章目录0. 声明6. 基于Petalinux的镜像构建、验证和烧录6.1 Petalinux介绍6.2 在Ubuntu中安装Petalinux(1)安装包下载(2)参考手册下载(3)虚拟机环境搭建(4)安装依赖包(5)安装Petalinux(6)安装验证6.3 网口、TF卡的适配和Vivado工程修改(1)电路修改(2)修改ZYNQ7的IP核配置(3)修改块设计(4)综合、实现和比特流生成6.4 Petalinux工程构建过程(1)准备工

Turix附属空间[已停用] 8114

EBAZ4205原理图、PCB、测试例程

EBAZ4205原理图、PCB、测试例程。PCB敷铜完整,原理图标注关键IO,测试例程为PL以太网测试。

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

前情提要: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(一) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二) 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(三) 文章目录0. 声明9. 让矿卡从NAND根文件系统启动9.1 制作NAND根文件系统(1)修改Petalinux工程配置(2)修改设备树(3)Petalinux工程编译9.2 下载镜像9.3 启动LOG和验证9.4 对分区的调整(可选)9.5 直连网络验证10. 操作PS_MIO的外设——按键10.1 GPIO的适配和Viv

Turix附属空间[已停用] 5667

RAGFlow源码解析-2、从源码构架ragflow v0.25.0镜像

本文详细记录了从零开始构建自定义RAGFlow镜像lt/ragflow:0.25.0的全过程。首先介绍了环境准备,包括检查Node.js、Docker版本和项目结构。然后详细说明了构建步骤:编译前端、创建自定义Dockerfile、构建镜像和验证。接着讲解了docker-compose配置修改要点,包括网络定义、MySQL依赖处理等。最后总结了部署过程中遇到的五个关键问题及解决方案,包括networks未定义、MySQL服务依赖、tiktoken文件缺失、数据库配置错误和端口映射问题。通过完整的操作流程和问

liutao841204的专栏 364

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库)

sysrepo 开发者指南(一个基于libyang与支持rpc的数据库) 日志记录 默认情况下,所有 Sysrepo 日志记录都处于关闭状态。如果启用,日志消息有 3 种输出。它们可以写入stderr、由 处理syslog或简单地传递给回调。 请务必注意,启用 Sysrepo 日志记录也会修改libyang日志记录设置。错误消息被视为标准 Sysrepo 错误,其他严重性较低的消息完全隐藏。要更改此行为,只需在启用 Sysrepo 日志记录后调整libyang日志记录设置。 此外,几乎每个 Sysrepo

weixin_43489394的博客 9223

zynq7010之EBAZ4205之helloworld

章鱼哥也想学zynq呀,zynq有arm a9双核的ps部分和和fpga的pl部分,突然发现zynq感觉是世界上最有技巧的一款芯片了,arm部分负责算法部分,pl部分可以用来增加外设,想想你的芯片支持好几个vga,hdmi,10几个串口,是不是很惊人。 为什么要有EBAZ4205呢,大家咸鱼一下50块,淘宝一下zynq 1000块。真香 废话不多说,我们这节课开始学习用arm部分的ps端通过串口输...

weixin_42741023的博客 1万+

HALCON实战:用两个工业相机实现无缝大视野拼接(附完整代码与避坑指南)

本文详细介绍了使用HALCON软件实现双工业相机图像无缝拼接的完整解决方案,涵盖硬件配置、相机标定、坐标系转换和图像拼接等关键步骤。通过高精度标定和矩阵变换技术,可构建大视野检测系统,适用于液晶面板、PCB等工业检测场景,显著提升检测效率和精度。

weixin_29050513的博客 188

EBAZ4205 ZYNQ开发板——入门第一步

最近在某宝上看到一款很便宜的拆机板EBAZ4205,将其作为ZYNQ 7000系列开发板还是比较划算的。这块板子的FPGA芯片是ZYNQ 7Z010,其内部含有两块ARM A9硬核和一块Artix-7逻辑。板子上所包含的一些资源如下所示: 一颗主控芯片,型号:ZYNQ XC7Z010-1CLG400I 一颗DDR3芯片,内存容量128M x 16bit,型号:EM6GD16EWKG或者MT41...

leo_xu_的博客 1万+

足球赛事数据API:开发者生存指南(附真实踩坑记录)

作为一个既爱看球又爱写代码的老宅男,我这些年用过的足球API比看过的比赛还多。从最初被各种API文档折磨到怀疑人生,到现在能闭着眼睛调接口,中间的血泪史够写本书了。今天就把这些经验(和教训)分享给各位同好,特别是那些正在为"老板要做个足球App"而秃头的同行们。文档清晰免费层可用响应格式规范API-Sports免费额度大方支持GraphQL有中文文档(难得!Sportmonks数据全面有Webhook支持按需付费。

Happy0970的博客 2189

代谢组数据分析(零):从质谱样本制备到MaxQuant搜库(蛋白质组和代谢组)

本文详细介绍了代谢组数据分析的过程,从LC-MS/MS技术的样本制备、分离、质谱鉴定到MaxQuant软件的使用。LC-MS/MS包括样本制备、液相色谱分离、质谱上机和鉴定等步骤。MaxQuant在蛋白质定性和定量中扮演关键角色,通过搜库和数据处理提供精准结果。此外,文章还涉及了数据采集模式、质谱图谱解析、数据库和软件选择以及结果评估等方面

专注生信领域 8587

EBAZ4205 ZYNQ HDMI扩展板 显示Linux桌面&播放视频

之前的文章介绍了如何生成EBAZ4205矿板的u-boot和Linux内核,使用的硬件只有改完SD卡启动的EBAZ4205裸板,只能通过串口与板子通信。这次尝试启动桌面并播放视频(由于EBAZ4205没有引出USB,仍然通过串口控制),看看双核A9性能怎样。原板子是没有显示接口的,需要自己做一块HDMI扩展板。

helrori 1万+

基于深度学习的茶叶等级检测识别系统:YOLOv8 + UI界面 + 数据集完整实现

随着深度学习技术的不断进步,基于计算机视觉的茶叶等级检测系统可以大大提高检测效率,提供客观一致的评估标准。本系统将利用YOLOv8进行茶叶等级的检测与识别,通过图形用户界面(UI)实现与用户的交互,提供茶叶等级分类的实时反馈。本文将详细介绍如何使用YOLOv8结合UI界面,建立一个完整的茶叶等级检测与识别系统,包括数据集的准备、模型的训练、UI的设计及完整的代码实现。本系统的目标是通过深度学习技术,结合YOLOv8模型和图形用户界面(UI),实现对茶叶等级的自动化检测与识别。

YOLO 972

玩转ebit EBAZ4205 zynq矿机控制卡

参考 基于Z7010的EBAZ4205矿板改造 zynq[1] 矿板helloworld 介绍 Column 1 Column 2 主控 XC7Z010CLG400-1 内存 256MB DDR3 EM6GD16EWKG/MT41K128M16 nand 128MB SLC Winbond W29N01HV 以太网 百兆网Phy芯片IP101GA 供电 12V,...

黑客三遍猪 8626

2020年大连理工大学《计算机控制技术》期末试卷

2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 2020年大连理工大学《计算机控制技术》期末试卷 ...

无名何许人的博客 646

YOLOv11 Neck革新:当SDI遇上BiFPN,带你打造精度飙升的特征融合网络

对于科研:这是一个新颖的特征融合思路,能做出差异化的实验,发论文、做项目都很有价值;对于工程:它能解决小目标漏检、大目标定位不准的痛点,让你的检测系统在工业质检、智能安防等场景下更可靠;对于技术成长:掌握了SDI和BiFPN的设计逻辑,你再去看其他特征融合方法(比如FPN、PAN),会有“一通百通”的感觉,以后优化任何检测模型都能举一反三。如果你之前在目标检测的精度上遇到了瓶颈,不妨试试SDI+BiFPN——它就像给YOLOv11装上了“透视眼”,让模型能看清每一个细节。

FJN110的博客 301
上一篇: 从零开始学习linux的I2C设备驱动框架——写一个简单的SHT20驱动
下一篇: 从零开始的ZYNQ学习(基于矿卡EBAZ4205)(二)
燕卫博
博客等级 码龄7年 312粉丝 49原创
评论 50
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值