当前位置:   article > 正文

Altera Cyclone IV FPGA 远程升级(完整版)_altera remote update

altera remote update

前言

        继前面做完简易版的远程升级后,最近一个星期除开外出实验就是在研究remote_update这个ip的使用,在上周五成功上板测试完成所以今天简单记录一下开发过程(在阅读此文章前建议先阅读上一篇简易版)。

一、ALTERA FPGA远程升级原理

        在上篇文件已经简单描述过,这里讲一下完整版与简易版不同的地方。

        1、简易版的flash中只会加载一个镜像,所以如果在升级过程中出现断电或者其他导致数据传输中断的问题会导致升级失败且不可挽回,只有重新通过jtag下载jic文件去升级没有容错;而完整版的flash中会包含一个工厂镜像和一个应用镜像,我们在升级过程中的擦除以及写入数据都是对应用镜像的地址进行操作,不会对工厂镜像进行操作,所以即使在传输过程中出现错误或者中断在重启fpga后也可以正确的加载工厂镜像从而在工厂镜像下重新对fpga进行远程升级操作。

        2、由于在flash中包含两个镜像数据,所以我们还会需要用到remote_update ip,通过操作这个ip去实现fpga的重配置以及看门狗等功能。

二、ALTERA ASMI IP使用

        1、还是讲一下与之前不同的地方,由于flash中有工厂镜像与应用镜像两个镜像所以我们在操作的过程中不能操作bulk_erase批量擦除,而是要使用sector_erase扇区擦除。之前没有理解sector是扇区的意思以为和单字节写入的操作一样一个字节一个字节操作,在上板擦除的过程中发现速度很慢其实理解了扇区的意思就简单每次操作都是擦除一个扇区。在我的工程中使用的epcs128,扇区地址如图所示:

        我的应用镜像在flash中对于的地址为'H400000 ~ 'H7FFFFF,所以只需要擦除16~31扇区的地址就可以。

        2、写入还是用的单字节写入,因为在测试过程中批量字节写入也不能加快写入速率反而要去控制fifo的读写容易出错,目前我这边的速率瓶颈是在串口不是asmi ip有兴趣的可以去研究一下ip核的极限速率。

三、REMOTE_UPDATE IP使用

                                                        remote_update ip接口

        我个人觉得相较于asmi,remote_update的文档写得没有那么清楚导致我花了很长的时间去了解这个ip的用途以及升级过程的具体操作。还有一个原因是因为手册中示例使用的是Avalon-MM 接口,在生成ip核时可以选择添加

        选择这个选项以后ip就会提供一个用户接口供你使用,你可以通过这个用户接口去操作寄存器控制ip核。

         最后我使用的原始ip接口,为了方便操作时钟与asmi ip一致使用12.5Mhz时钟,复位高有效。

        操作可以分为写操作与读操作以及重配置操作。

        写操作如下图所示:

        读操作如下图所示:

        重配置操作如下图所示:

具体操作:

        1、读主状态机当前状态,确定状态跳转。

        2、读上一次重配置的状态寄存器,确认状态跳转关系到升级过程中出错后能否正常加载工厂镜像。

        3、写看门狗超时值,超过时系统重新加载工厂镜像。

        4、写看门狗使能。

        5、写应用镜像引导地址,与生成jic文件时地址设置应用镜像起始地址一致。

        以上操作全部完成后拉高reconfig信号,还有一些操作我这边没有需求就没有使用了。

        注意在打开看门狗使能后,工厂镜像和每次更新应用镜像中都需要定时对看门狗计时器进行复位。

 

        复位拉高时间每个器件去对应的文档查询,Cyclone IV的复位拉高时间最少为250ns。

四、具体操作步骤

        1、生成工厂镜像和应用镜像1合并的jic文件

        用工厂镜像sof文件与应用镜像sof文件生产合并的jic文件通过jtag下载进入flash。

        2、固化完成重新上电,通过串口访问版本寄存器:串口写入8'hCC,返回版本号为01。(应用镜像0版本号)

        3、串口写入8'hBB:擦除FLASH地址'H40000~'H7FFFFF,默认状态。擦除成功串口输出 8'h55 (一分钟左右)

        4、擦除完成后直接重启设备(模拟停电或传输中断);串口写入8'hCC,返回版本号为8’h00(工厂镜像版本号),确保设备在传输过程中断电也能正确加载工厂镜像。

        5、确认正确加载工厂镜像后继续执行步骤3,擦除擦除FLASH地址 'H40000~'H7FFFFF,默认状态;擦除成功串口输出 8'h55 (一分钟左右)。

        6、fpga应用镜像1编译完成后生成的sof在Convert Programming Files生成rpd文件,将rpd文件通过串口发送到fpga。

   写入完成后串口输出8'h88。(115200波特率 三分钟)

        7、串口写入8'h99:从写入完成状态返回默认状态,串口输出8'hFF。(重新执行上述操作可以再次写flash)。

        8、与简易版不同的是还要输入8'hAA,操作remote_update完成fpga的重配置。然后输入8'hCC读版本寄存器,返回8'h02(应用镜像1版本号),远程升级完成。

     (注:步骤4、5是为了模拟传输出错的场景,可以直接跳过)

五、总结

        一个较为完整的远程升级方案,主要思路还是阅读官方的技术手册然后总结网上一些现有博主的资料进行开发。其实里面看门狗以及读配置状态寄存器都是为了升级失败也能够返回加载工厂镜像这个功能服务,我一开始想的是外部一个按钮或者可配置IO来控制加载镜像的切换是最简单的,结果板卡上没有做这个按钮或者可配置IO所以只能去更深一步研究,如果开发的板卡上有的话可以省事很多。有写的不对的地方欢迎一起探讨指正谢谢。

        

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop】
推荐阅读
相关标签
  

闽ICP备14008679号