第一章 Altera FPGA远程更新

        在使用开发板做FPGA开发时,下载程序最常用的方式是使用JTAG接口。但是在实际的项目中,产品交付后,很难再使用JTAG接口进行固件升级。此时需要使用FPGA的远程更新功能:使用产品自带的通讯接口(如串口,以太网接口等)传输待更新的固件,将固件写入EPCS等非易失性存储器,最后触发FPGA使用新的镜像文件进行重配置。

        本章我们将介绍如何在Altera Cyclone IV系列的FPGA上使用串口实现远程更新,主要包括以下几个部分:

                 1.1  FPGA远程更新简介

1.2  实验任务

1.3  硬件设计

1.4  程序设计

1.5  下载验证

1.1  FPGA远程更新简介

        FPGA可重配置的特点为设计带来了很大的灵活性,因此基于FPGA的设计或产品往往也有后期更新的需求。例如在红外摄像头的机芯中,一般会使用FPGA来实现非均匀性校正、对比度调节等图像处理算法;在新的算法开发出来之后,便可以重新配置到FPGA中,从而实现产品性能升级,延长产品生命周期。

        在FPGA的开发过程中,配置FPGA最常见的方式是通过下载器连接FPGA电路板上的JTAG接口;然后在上位机中打开FPGA开发工具的编程界面,通过下载sof/bit文件来配置FPGA。如下图所示:

图 1.1.1 通过JTAG配置Xilinx FPGA

       在产品交付之后,我们通常无法像图 1.1.1所示的那样使用上位机和下载器对FPGA进行现场升级。原因有很多,比如产品的外壳不方便拆卸,或者产品部署在相对复杂的环境中(例如无线通信设备安放在通信塔台上)。此时我们需要对FPGA进行远程更新,即使用产品自带的通讯接口(如串口、网口等)来更新FPGA的镜像文件,并使用新的镜像文件重新配置FPGA。

       在Altera Cyclone IV器件上进行远程更新(Remote Update)的步骤如下图所示:

图 1.1.2 Cyclone IV FPGA远程更新过程示意图

在图 1.1.2中用红色圆圈标志出了远程更新过程中的三个主要步骤:

  1. 文件传输:首先我们将需要更新的镜像文件从远程位置的计算机发送给FPGA设备,由FPGA内部的控制模块(Control Module)接收镜像文件。这一过程可以根据FPGA设备上的通信接口来选择所使用的通信协议,如网口可以选择TCP/IP协议、UDP协议,串口可以选择UART协议等。
  2. 更新镜像:FPGA在接收到远程发送的镜像文件之后,由控制模块将其写入FPGA的配置存储器(Configuration Memory)中。该配置存储器通常为非易失性存储器(Flash),如EPCS/EPCQ等。
  3. FPGA重配置:FPGA内部的控制模块发起一个重配置周期,使用更新到配置器件中的镜像数据重新配置FPGA。

        以上过程中的“控制模块”可以是Nios II处理器,也可以是用户自己编写的逻辑。可以看出该模块在远程更新的过程中不仅负责接收镜像数据,还要将镜像数据写入Flash,并触发FPGA的重配置。控制模块与FPGA内其他模块之间的连接示意图如下所示:

图 1.1.3 典型的远程系统升级流程

       从图 1.1.3中可以看出,在FPGA内部除了远程系统升级(Remote System Upgrade)控制模块之外,还包含另外两个模块:“Flash控制器”和“ARU IP核”。其中Flash控制器负责读写配置存储器,将控制模块从网络上接收到的镜像数据写入Flash器件,如上图中红色箭头所示。而ARU(Altera Remote Update,远程更新)IP核使用FPGA内部专用的远程系统升级电路,来实现器件的重配置。当新的镜像文件成功写入Flash之后,由控制模块触发ARU IP核使用新的镜像重新配置FPGA,如上图中蓝色箭头所示。

       一个完整的远程系统升级(RSU)设计应当至少包含两个工程出厂(Factory工程和应用(Application工程,每个工程各有一个配置文件。配置文件(Configuration)也被称之为“镜像(image)”,它是一个要部署到FPGA中的设计,用来实现用户定义的特定功能。

       在远程更新模式下,我们必须将出厂配置镜像存储在启动地址0,对应EPCS的起始地址0x000000。FPGA在上电后自动加载出厂配置镜像,然后由用户定义的出厂配置镜像决定要加载的应用镜像,并触发重配置周期。出厂配置和应用配置之间的转换过程如下图所示:

图 1.1.4 远程更新模式下配置镜像之间的转换

       在上电之后,FPGA自动加载出厂配置镜像。然后出厂配置逻辑通过写RSU控制寄存器来指定要加载的应用配置镜像(记作 Application 1)的地址,然后使用Application 1重新配置FPGA。如果在重配置的过程中发生错误(如指定位置应用镜像文件损坏),则恢复到出厂配置。

       第一次重配置成功后, FPGA中运行的是Application 1。此时如果要重新加载另外一个应用配置镜像(记作 Application 2),则需要先触发FPGA恢复到出厂配置,这是第二次重配置;然后由出厂配置逻辑重新指定Application 2的地址,并再次开始重配置周期(第三次)。

出厂配置镜像中的逻辑是由用户定义的,主要负责实现以下功能:

  1. 根据专用远程系统升级电路给出的状态信息,来处理远程更新过程中的错误情况;
  2. 与远程主机通信,并接收新的应用配置镜像,然后将新的配置数据保存到非易失性存储器;
  3. 决定要将哪一个应用配置镜像加载到FPGA中;
  4. 打开或关闭用户看门狗定时器的使能;
  5. 向专用远程系统升级电路发送指令,以开始重配置周期。

       在成功加载应用配置镜像后,器件进入用户模式。在用户模式下,由应用配置逻辑决定什么时候进行远程系统更新,并在远程系统更新指令到达时,触发FPGA加载出厂配置镜像。

1.2实验任务

        本次实验的实验任务是使用正点原子“开拓者/新起点”FPGA开发板实现FPGA的远程更新:上位机通过串口助手发送更新指令和镜像文件;开发板通过串口接收镜像文件,并将其写入EPCS器件,最后使用新的镜像文件重新配置FPGA。

1.3硬件设计

       正点原子“开拓者/新起点”FPGA开发板上的JTAG接口,以及配置器件(FLASH)的原理图如下所示:

图 1.3.1 “开拓者/新起点”FPGA开发板 JTAG/FLASH 原理图

       从图 1.3.1中可以看到,开发板上使用的配置存储器型号为“M25P16”,它是一种SPI总线接口的串行Flash存储器。由于M25P16可以完全替代Altera官方推荐的串行配置器件——EPCS16(EPCS是一种用来存储FPGA配置数据的Flash存储器),为了与Quartus工具中的名称保持一致,下文将直接使用EPCS16来表示本次实验所使用的配置存储器。

       EPCS16的存储资源共有16Mbit,其组织形式如下图红色矩形区域所示:

图 1.3.2 EPCS16存储资源及其组织形式

          EPCS16共2M字节的存储空间被分成了32个扇区(sector),每个扇区又分成256页(page),每一页包含256字节。

EPCS16各扇区的字节地址如下图所示:

图 1.3.3 EPCS16各扇区的地址范围

1.4程序设计

        由本章简介部分可知,整个设计分为出厂程序和应用程序两部分,我们首先介绍出厂程序。

根据本次实验的实验任务可以规划出整个设计的架构,其中出厂程序的系统框图如下所示:

图 1.4.1 出厂程序——系统框图

        上位机和开发板通过串口连接,使用UART协议传输更新指令和应用镜像文件。

        在FPGA内部有一个“串口接收”模块,负责按照UART协议接收串口数据。同时还有一个“串口发送”模块,可以将串口接收到的数据回传给上位机,这样就可以在上位机观察到FPGA接收的数据是否正确,是否存在数据丢失等。

        串口接收模块接收到的数据传递给“通信控制”模块。通信控制模块从数据中解析出远程更新指令、镜像文件大小等信息,然后将接收到的镜像文件写到FIFO中进行缓存。

        接下来,缓存到FIFO中的镜像文件在“ASMI控制”模块的控制下写入EPCS16中的指定地址。ASMI控制模块内部例化了一个名为“Altera ASMI Parallel”的IP核,这个IP核实现了一个主动串行存储器接口(Active Serial Memory Interface,ASMI),我们可以把它理解成一个串行Flash读写控制器。通过使用ASMI Parallel IP核,我们不需要知道串行接口的细节以及EPCS的读写协议,直接使用IP核提供的并行数据输入/输出接口就可以实现对EPCS器件的读写访问。

        在镜像文件完全写入EPCS16之后,由通信控制模块通知“远程更新”模块开始重配置过程。远程更新模块内部例化了一个名为“Altera Remote Update”的IP核,它使用FPGA内部专用的远程系统升级电路,来实现器件的重配置。

        在使用Cyclone IV器件时,Altera ASMI Parallel 和 Altera Remote Update 这两个IP核的驱动时钟频率不能超过20 MHz在本次实验中提供给这两个IP核的时钟频率是10 MHz,该时钟由“PLL”模块输出,PLL的输入是板载晶振提供的50 MHz系统时钟。

        在FPGA内部还包含一个名为“LED闪烁”的模块,它驱动开发板上两个LED交替闪烁,用于指示FPGA中正在运行的是出厂程序。

出厂程序顶层模块的RTL原理图如下所示:

图 1.4.2 出厂程序——顶层模块原理图

       从图 1.4.2中可以看到设计的输入/输出接口以及各模块之间的信号连接,可以通过放大文档来查看图片的细节。设计的输入端有两个接口:50 MHz系统时钟“sys_clk”,以及串口接收端口“uart_rx”;在输出端共有四个接口,从下往上依次是:出厂程序指示灯“led[1:0]”、串口发送端口“uart_tx”、镜像文件更新完成标志“update_done”,以及FIFO溢出错误标志“fifo_error”。

       正点原子“开拓者/新起点”FPGA开发板上共有四个LED,我们将左侧两个LED用作出厂程序指示灯,当出厂程序在运行时,左侧两个LED灯交替闪烁。在管脚分配时,将update_done信号分配到左侧起第三个LED上,当串口传输的镜像文件完全写入EPCS16时,该LED点亮;最后将fifo_error信号分配到最右侧的LED上,如果在镜像文件的传输过程中FIFO溢出,则最右侧LED点亮,标志着文件更新过程失败。

       本次实验的应用程序共包含两个工程,每个工程各生成一个应用镜像。其中一个应用镜像是和出厂镜像一起,直接由JTAG下载到EPCS16中;另外一个应用镜像则是通过串口远程更新到EPCS16中。

       第一个应用程序的工程名为“RSU_Application_flow_led”,它实现了流水灯的功能,其顶层模块原理图如下所示:

图 1.4.3 应用程序1——流水灯RTL原理图

        相比于出厂程序,应用程序的逻辑比较简单。上图中的“flow_led”模块是用户的应用程序,这里我们用一个比较简单的流水灯功能来代替。

       “PLL”模块输出的两个时钟信号c0和c1分别是50MHz和10MHz。其中10MHz的时钟连接到ARU IP核的时钟输入端clock,需要注意的是该时钟频率最大不能超过20MHz。另外我们把PLL输出的locked信号取反后连接到ARU IP核的复位端reset(高电平有效),在PLL输出的时钟信号稳定之前保持ARU IP核处于复位状态。

       图 1.4.3中的“remote_update”模块就是在简介中提到的远程更新(ARU)IP核。在应用程序中只需要将ARU IP核的“reconfig”接口设置为高电平,就可以触发IP核开始重配置周期,将FPGA恢复到出厂程序。

        正点原子“开拓者/新起点”开发板上有一个触摸按键,在手指触摸的时候,对应的FPGA引脚上会产生高电平。在应用程序中我们将该触摸按键的输入信号“touch_key”连接到ARU IP的“reconfig”接口,这样就可以通过触摸按键来触发FPGA的重配置。

        在Quartus的IP库中搜索“remote update”可以找到并添加ARU IP核,其配置界面如下图所示:

图 1.4.4 Altera Remote Update IP核配置界面

       从图 1.4.4中可以看出,ARU IP核的配置非常简单,只需要设置所使用的配置器件即可,在本次实验中使用的是串行配置器件EPCS16。

       第二个应用程序的工程名为“RSU_Application_breath_led”,它实现了呼吸灯的功能,其顶层模块原理图如下所示:

图 1.4.5 应用程序2——呼吸灯RTL原理图

       从原理图可以看出,应用程序2与应用程序1架构是相同的,差别在于应用程序2实现的功能是呼吸灯,即上图中的“breath_led”模块。

1.5下载验证

要想实现远程更新的功能,在各工程编译之前,需要对工程进行设置,如下图所示:

图 1.5.1 设置工程

然后将出厂程序与应用程序1生成的.sof文件合并成一个.jic文件,如下图所示:

图 1.5.2 page0 出厂配置镜像

图 1.5.3 page1 应用配置镜像

       接下来将合并之后的JIC文件通过JTAG接口下载到EPCS16中,下载完成后重启开发板,重启后开发板会先加载位于page0处的出厂配置镜像。由于系统刚上电,出厂配置程序随即对FPGA进行重配置,将page1处的应用镜像配置到FPGA中,因此开发板上四个LED显示出来的效果是流水灯

       然后我们用手指按一下开发板上的触摸按键,会触发FPGA进行重配置,恢复到出厂配置,此时显示的是出厂配置程序中左侧两个LED交替闪烁的效果

       接下来就可以通过串口将应用程序2的配置文件发送到开发板中,需要注意的是,Quartus编译生成的.sof和.pof文件无法直接下载到EPCS16中。需要在Convert Programming File工具中将.pof文件转换成.rpd格式的文件,如下图所示:

图 1.5.4 将pof转换成rpd

       转换后的rpd格式的镜像文件比较大,共2M字节,但是其中有很大一部分是无效的数据0xFF,如下图所示:

图 1.5.5 rpd文件中的无效数据

       我们注意到rpd格式的镜像与EPCS16的存储空间大小相同(2097152字节),而EPCS16有一部分存储空间是要留给应用配置镜像的,因此需要将图 1.5.5中文件末尾的无效数据删除,删除后的文件大小如下图所示:

图 1.5.6 删除无效数据后的rpd文件

       从图 1.5.6中可以看到,删除文件末尾的无效数据后,镜像尺寸明显减小(仅剩107845字节)。需要注意的是,不能将文件末尾的0xFF完全删除,至少要保留36个字节。

       按下触摸按键后,开发板现在运行的是出厂配置程序,此时可以将精简后的呼吸灯镜像(rpd格式)通过串口发送给FPGA。

       使用mini USB线连接开发板上的USB串口,然后在上位机打开正点原子XCOM串口助手,设置并打开相应的串口端口,如下图所示:

图 1.5.7 使用串口助手更新镜像

使用XCOM串口助手发送镜像文件之前,需要发送起始指令,格式为:

0xAA   0x55   0x00  Size[7:0]   Size[15:8]   Size[23:16]

        其中Size[23:0] 为要发送的镜像文件的尺寸(字节数),发送时低位字节在前。从图 1.5.6中可看到精简后的镜像文件大小为107845字节,即十六进制数0x01A545。

        起始指令发送结束后,开始发送应用程序2的镜像文件。在串口助手中选择前面删减后的rpd格式文件,然后点击“发送文件”。

        开发板在出厂配置下接收镜像文件,在文件接收完毕并将其完全写入EPCS16后,会自动触发重配置,此时四个LED灯同时显示出呼吸灯的效果,说明通过串口远程更新FPGA成功。然后重启开发板,四个LED仍然显示呼吸灯的效果,再次证明了更新的镜像文件已成功写入EPCS16。

交流学习可加V:DaLei_FPGA  加QQ3183701261  ~~~~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值