flash读写控制方案
与xilinx相比,intel(altera)提供了读写控制器方案。而且,同时提供了两个方案。
首先,altera似乎没有开放配置flash的pin的控制。如果没有找到办法直接控制这些pin,也就没有办法自行设计flash读写控制器。
自行设计flash读写控制器的优点在于可控性很高,缺点在于需要花费时间设计并进行稳定性测试。相应的,使用提供的flash读写控制器ip,优点是免去设计和测试的成本,但缺点在于兼容性。
由于提供的ip可选项很少,可以使用的操作命令也有限,所以很难保证这个ip能兼容哪些flash。即使能兼容,也可能只能使用基础的操作命令,而部分高级操作比如快速擦写等,不保证能兼容。
方案一:jtag烧录flash
在专栏文章《fpga远程更新设计的需求分析》中,分析了eda工具通过jtag烧录flash的操作。
1.上位机主动发起配置,fpga被动接收数据进行重配置,此时的配置模式是上文提到的基于jtag的被动配置。此操作的结果是将fpga配置为一个flash的读写器。
2.配置完成后,上位机开始发送/接收flash的数据,数据通道为jtag。fpga通过jtag接收到数据之后,根据需求发起对flash的读写操作,将需要更新的数据写入flash,完成更新。此过程是更新flash的过程,烧录过程中flash只收到fpga的控制。
3.flash更新完毕后,在合适的时候让fpga进行重新配置(例如重新上下电),fpga会开始主动配置过程,从flash中读取配置数据完成加载。
配置过程是将原厂提供的jtag-flash读写控制器加载到fpga中,在通过jtag和这个内部的fpga控制器烧录flash。这个jtag-flash读写控制器本身也是一个设计。xilinx并没有将这个设计独立提供出来给用户,不过altera将这个设计以ip的方式提供给用户使用。
上图是串口flash的读写控制器,在ip catalog中还能找到altera parallel flash loader这个ip。这里仅以altera serial flash loader(下文简称asfl)为例做简单介绍。关于ip的具体细节,请参考ip的手册。
将这个ip集成到fpga工程中就可以直接使用。烧录工具为quartus programmer,烧录文件为.jic文件。
在烧录的时候,点选jic文件,上一行会自动勾选上,第一行也会变为factory default sfl image。此时即为下载内置的镜像,将fpga配置为flash读写控制器。如果将第一行勾选去掉,则工具会自动尝试在fpga当前设计中寻找asfl ip。如果找不到,则直接提示错误,不会做任何变化;如果找到asfl ip,则利用jtag进行flash的烧录工作。这里重点提示,使用这个方法的时候务必取消第一行自动勾选上的factory default sfl image。
这种用法的最大限制在于需要使用quartus programmer工具和jtag。如果有条件,在环境中拥有quartus支持的os系统和jtag cable的硬件连接,则可以使用这个方案。由于有os的存在,镜像jic文件可以通过os来管理文件的传输,再通过远程访问os,启动quartus programmer,烧录jic文件。
但是,对于某些环境,os和jtag是无法获取的。所以还需要另一个方案来适配更多的应用场景。
方案二:flash读写控制器
方案一的ip结合了jtag和flash读写控制器,数据通路固定是jtag。而altera asmi parallel(下文简称asmi)这个ip就仅仅是个flash读写控制器,可以自由的设计数据来源。
关于这个ip的使用,可以参考ip的文档。需要进行相关信号控制来控制ip的行为。这里对这个ip的使用不进行详细的描述。
这个方案的一个问题是,ip默认只支持intel(alterad)的flash,所以如果flash是其它型号,则不能保证百分之百兼容。建议查看ip文档,使用比较基础的读写控制命令(通常性能差一些但兼容性好的命令);同时在更换flash之后,进行测试看看是否兼容。
方案一的截图中,有一个配置参数:
方案二的asmi ip配置中,有一个配置参数:
勾选这两个参数,可以让两个方案同时存在与一个fpga设计中。这样,可以更自由地选择使用那个方案来进行更新。由于flash只有一个配置接口,所以两个方案肯定是无法同时使用的。
altera配置文件分析
方案一已经是个完备的方案,无奈对使用环境有着较高的要求。所以方案二才是更通用的方法。不过相对方案一直接使用jic文件,方案二只是一个flash读写控制器,并没有说明将什么数据写入flash。所以需要找到写入文件的数据。
altera常见的几个配置文件:sof/pof/jic/rbf
sof文件是最基本的文件,用这个文件作为基础可以直接用quartus programmer进行jtag下载。同时也可以通过这个sof文件生成其它文件。
pof是针对altera flash的配置文件器。需要用quartus programmer软件,通过jtag烧录flash。由于这个文件需要使用jtag连接flash,所以在很多环境下并不使用这个文件进行配置。
jic是间接配置flash的文件,具体使用已经介绍过了。
rbf文件,从名称看是二进制文件,可能最接近写入flash的文件。
由于并没有在intel(altera)网站上找到几种配置文件的具体数据内容和格式,所以需要手动分析文件内容。实际上这几种格式没有一种可以直接写入flash
这里已经得到最终的数据文件,暂时称之为bin文件,下面直接给出各个文件无法使用的原因。文件基于altera a10系列fpga。
1.sof
对比最终写入flash的数据,几乎看不到正常的数据,怀疑是存在一些quartus工具才能识别的命令。
2.pof文件
pof文件是针对flash的,所以里面内容和rbf文件有大部分都是相同的。
不过差别在于pof文件前面有大量的不明数据,不清楚具体作用,所以
左边为rbf文件,右边为pof文件
和正确的bin文件相比,pof前面的开头部分确实也是多余的。所以rbf也比pof文件更接近于最终的bin文件。
3.rbf文件
rbf文件确实几乎非常接近最终的文件。
左边为bin文件,右边为rbf文件
从文件格式中可以看到,数据可以对应上,只是位序有点不同。
不过比较大的问题是,rbf文件的开头相比bin文件,少了一些内容。
左边为bin文件开头,右边为rbf文件开头
调整位序对fpga开发来说,几乎没有难度。不过开头这些数据的作用,就不太清楚了。如果有条件可以尝试写入rbf文件,试试fpga能否从flash中加载成功。本人尝试过两次,失败后直接尝试bin文件。对于rbf无法成功的原因,并没有深究。所以失败也有可能是操作失误导致的,而rbf文件是可以这样使用的。
4.jic
对比发现jic和pof文件的格式位序一样,但开头依然多出部分数据。多出来的部分长度几乎和pof文件一样,但数据内容由不完全相同,所以怀疑开头部分包括了一些quartus工具的操作命令,如果直接写入flash,可能会导致无法加载成功。
从上述分析可以看到,quartus提供的四种配置文件,并没有保证直接对应flash中的数据,对比后也发现多少都有点出入。由于没有找到对各自文件详细的内容说明,所以也不便于直接修改。
所以这就是使用asmi方案的最大问题,如何获取最终的写入flash的数据。
从这一点说,xilinx的方案其实更直接,直接使用原始的二进制数(bit、bin)文件,或者标准文件——mcs。
flash标准内容文件
xilinx的mcs文件,后缀mcs是xilinx独有的,但是其内容是标准格式。
mcs为文本文件,查看内容,可以看到两种内容。第一种是相对较短的一行,第二种是相对较长的一行。
真实数据是保存在较长的一行。分析后可以看到较长行的长度都是一样的。具体内容是,前端若干位是控制符(包含地址),然后是具体数据,之后是校验码。找到规律后,就可以直接提取其中内容了。
quartus中没有直接提供这个格式的文件,不过quartus下用于nios2开发的套件(nios2eda)中,有一个小工具:sof2flash
在nios2 shell中启动这个工具,可以将sof文件转为.flash文件。查看这个.flash工具,就能发现这个文件的语法结构和mcs文件一样。
那么后面的事情就很容量了,用脚本语言(python)写一个转换工具,生成一个文件,后缀名可以随意取(本人使用.bin这个后缀)。将这个文件以二进制形式读取,直接传给asmi ip写入flash,从实际效果看,没有任何问题,fpga顺利从flash启动。
这里要感谢:武汉芯路恒科技有限公司的小梅哥。当初是小梅哥的提点,才知道有.flash这个文件的存在。
这个方法算是另辟路径,用不是很正式的方法将sof文件转为了一个标准的flash内容描述格式。本人使用的是这种格式。不过,从道理上分析,altera应该是提供了正确的配置文件。
通过朋友向altera技术支持打听,得到一个方案,这里云分析一下。先给出结论:这个方案应该是可行的。
通过quartus提供的文件转换工具,可以将sof转为pof文件。这一步上文已经做了分析,pof并不是直接写入flash中的文件。
再一次使用文件转换工具,利用pof文件,转为rpd文件。这个rpd文件,就是需要使用的文件。
分析一下rpd文件和.flash文件中的内容
左边为.flash文件内容,右边为.rpd文件内容
从开头部分就可以看出,数据是有明显的对应关系,56565656调整位序后就可以得到6a6a6a6a。第10行的20000000和04000000也能看出对应的关系。
从这个结果可以看到.rpd的数据是可以使用的,只是在位序方面需要做一些调整。
这一还有一些地方需要讨论,就是文件大小。
sof文件代表fpga的配置文件,fpga的配置文件都是和fpga的型号相关。与xilinx不同,altera的sof文件似乎无论是否打开压缩,均不会改变文件大小。
bin文件是从.flash文件中提取的,.flash是从sof中提取的。所以bin文件包含的是完整的配置信息。实际使用中可以发现这个bin文件的大小会比sof文件小一些。而.flash文件由于是文本格式,所以无法比较大小。
jic、pof和rpd文件,这三个文件是针对flash的,所以这三个文件的大小是依据flash而变化的。使用中可以发现这三个文件其实比sof/bin文件大很多。但这三个文件几乎是一样大小的。
用一个例子来说明,假设sof文件是20mb,flash是128mb。那么bin文件代表sof文件中有效内容,可能是16mb,而由于flash固定是128mb,则jic/pof/rpd三个文件都几乎是128mb大小,其中只有开头的16mb是有效内容,后面的数据基本为填充的无效数据(或者在生成时添加了其他数据源的数据)
这里有一个例子,rpd文件,二进制用文本展开,32bit一组用8位16进制数表示,一共33554432组,其中ffffffff占了22578142,可以看到几乎大部分都是无效的flash初始数据。
33554432*32bit / 1024/1024 / 8 = 128mb
这个128mb的flash,大概三分之二都是无用的flash数据。
这可以侧面验证,jic/pof/rpd文件虽然很大,但其中有效数据并没有很多。
所以,如果只有一个镜像的远程更新,那么bin文件其实是很方便的,但生成的方法会麻烦一些。如果直接使用rpd文件,代价是要么写入大量无用数据,要么确认一下有效数据的结尾,来避免大量无效数据的写入。
至此,altera平台远程更新设计中flash读写控制器的方案,已经都做了粗浅的介绍。
机器人真的可以像人一样解决数理化难题吗?
骁龙芯专注游戏体验 应对玩手机游戏发热和卡顿问题
5G频谱划分后可能会带来哪些影响?
什么会影响5G的发展
电磁离合器种类
FPGA设计中flash读写工作原理解析
这八个坏习惯不改掉会害了你的一生,你有中招了的吗?
共集电极放大器,共集电极放大器是什么意思
什么是业务补偿?业务补偿设计的实现方式
为什么CAN总线支线长度不能太长?CAN网络中支线过长的解决方案
对于语音识别技术你了解多少呢
OPPO新产品曝光:配备4350mAh电池,支持65W快充
华为2011第四季度成全球第二大移动设备商
印制电路板的常见问题
DC-DC反激式转换器的共模噪声分析
应用在智能眼镜领域中的数字红外接近检测模块
Mini LED背光技术的优势,miniLED能让LCD电视重回巅峰吗?
ADMTV316: 移动电视双通道片上接受机支持T-DMB
高级自动驾驶汽车部署的实际挑战
飞凌嵌入式i.MX9352开发板,让通信安全又稳定