同以前单片机在线升级的做法一样,本质就是通信+Flash操作+跳转。只是FPGA对应的操作与单片机相比稍微复杂一点。
一、通信驱动
我使用的是UDP有线传输,
二、Flash芯片驱动
规划Flash芯片的区域,一般bootloader放在起始位置,APP放在bootloader之后的空白区域。
以M25P80芯片为例:
2.1 芯片参数
使用一个芯片,要仔细拜读官方提供的芯片手册。
基本参数如下:
- 型号:M25P80
- 容量: 8Mbit * 1024=8192Kbit,,
- 扇区:一个扇区512Kbit,8192/512=16总共16个扇区
- 页: 一个扇区可存储512*1024/8=65536Byte(64KByte),一页可存储256Byte, 一个扇区有65536/256=256页
以下两种SPI模式之一运行:
- CPOL=0,CPHA=0
- CPOL=1,CPHA=1
本驱动采用的方式是CPOL=1,CPHA=1(CPOL=1时钟空闲是高电平,CPHA=1偶数边沿数据采样,奇数边沿数据更新)
使用时要关注各个操作需要的时间:
各操作命令号:
2.2 Flash扇区擦除
各个扇区的地址如下:
单个扇区擦除流程:
- 发送写使能指令(1Byte)
- 等待5ns以上
- 发生扇区擦除指令+要擦除的扇区地址(4Byte)
- tse
注:扇区擦除指令+扇区内的任意一个地址即可擦除全部扇区内容
2.3 Flash页编程
我使用的是页编程。
一次写一页(256字节),手册上:超出本页的数据会从本页的起始地址开始写入,先写的数据会被覆盖(例如:本页地址0~255,如果从200地址写入57个字节的数据,那个第56、57个字节的数据会分别被写到地址0、1)
页编程流程:
- 发送写使能指令(1Byte)
- 页写指令(1Byte:0x02)+页地址(3Byte)+数据(256byte)
- tpp
三、ICAP原语跳转
3.1、ICAP简介
在ISE14.7的这里,可以找到ICAP原语的代码,原语是赛灵思内置的操作,类似Flash芯片的操作指令一般,使用时直接实例化即可。
3.2、ICAP模块信号介绍
- .BUSY :1-bit 输出 忙信号
- .O :16-bit 输出 模块输出
- .CE :1-bit 输入 时钟使能段,低有效
- .CLK :1-bit 输入 时钟 ICAP最小周期限制:50.000ns(20.000MHz)
- .I :16-bit 输入 数据输入
- .WRITE : 1-bit 输入 读写控制线,低写、高读
3.3、ICAP操作bit流
起始地址要保证和Flash驱动以及Multboot文件一致:
要注意手册上说了数据需要以下处理:
3.4、生成MultBoot烧录文件
四、 mcs、bit文件的区别
BIN是纯二进制文件,MCS是ASCII格式的文本文件。
4.1 MCS文件
MCS是Intel早期为MCS系列 II ISIS-II 系统 代码固化存储指定的文件格式,成为了普遍遵循的标准,Xilinx 的MCS文件也一样,格式大体如下,文件由行组成,每一行由6部分组成:
- Start code 起始码
- Byte count 字节长度
- Address 起始地址
- Record type 当前记录数据类型
- Data 数据
- Checksum 校验码
MCS文件本质就是hex文件,将后缀名改成hex后用nootpad打开,黑色的数据部分即是要发送给FPGA的程序。
4.2 BIT文件
Bit文件相对多一个文件头。可以通过16进制打开的方式,将文件头去除,然后两个文件就会一致。
bit文件去掉开头的109个字节后,与MCS文件一致。