赞
踩
继前面做完简易版的远程升级后,最近一个星期除开外出实验就是在研究remote_update这个ip的使用,在上周五成功上板测试完成所以今天简单记录一下开发过程(在阅读此文章前建议先阅读上一篇简易版)。
在上篇文件已经简单描述过,这里讲一下完整版与简易版不同的地方。
1、简易版的flash中只会加载一个镜像,所以如果在升级过程中出现断电或者其他导致数据传输中断的问题会导致升级失败且不可挽回,只有重新通过jtag下载jic文件去升级没有容错;而完整版的flash中会包含一个工厂镜像和一个应用镜像,我们在升级过程中的擦除以及写入数据都是对应用镜像的地址进行操作,不会对工厂镜像进行操作,所以即使在传输过程中出现错误或者中断在重启fpga后也可以正确的加载工厂镜像从而在工厂镜像下重新对fpga进行远程升级操作。
2、由于在flash中包含两个镜像数据,所以我们还会需要用到remote_update ip,通过操作这个ip去实现fpga的重配置以及看门狗等功能。
1、还是讲一下与之前不同的地方,由于flash中有工厂镜像与应用镜像两个镜像所以我们在操作的过程中不能操作bulk_erase批量擦除,而是要使用sector_erase扇区擦除。之前没有理解sector是扇区的意思以为和单字节写入的操作一样一个字节一个字节操作,在上板擦除的过程中发现速度很慢其实理解了扇区的意思就简单每次操作都是擦除一个扇区。在我的工程中使用的epcs128,扇区地址如图所示:
我的应用镜像在flash中对于的地址为'H400000 ~ 'H7FFFFF,所以只需要擦除16~31扇区的地址就可以。
2、写入还是用的单字节写入,因为在测试过程中批量字节写入也不能加快写入速率反而要去控制fifo的读写容易出错,目前我这边的速率瓶颈是在串口不是asmi ip有兴趣的可以去研究一下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。
用工厂镜像sof文件与应用镜像sof文件生产合并的jic文件通过jtag下载进入flash。
写入完成后串口输出8'h88。(115200波特率 三分钟)
(注:步骤4、5是为了模拟传输出错的场景,可以直接跳过)
一个较为完整的远程升级方案,主要思路还是阅读官方的技术手册然后总结网上一些现有博主的资料进行开发。其实里面看门狗以及读配置状态寄存器都是为了升级失败也能够返回加载工厂镜像这个功能服务,我一开始想的是外部一个按钮或者可配置IO来控制加载镜像的切换是最简单的,结果板卡上没有做这个按钮或者可配置IO所以只能去更深一步研究,如果开发的板卡上有的话可以省事很多。有写的不对的地方欢迎一起探讨指正谢谢。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。