基于串口的QuickBoot远程升级

前言

注:需要本工程源码或者有任何问题可以联系我!

系统架构

  • 串口转换芯片为 Silicon Labs CP2102GM,最大支持 1Mbps 传输速率,本实验使用 750000bps 波特率进行设计;

  • FPGA 芯片使用 AMD 7系列 xc7a35tfgg484-2,Bitstream 大小为 17,536,096 bits;

  • Flash 芯片使用 Numonyx 的 QSPI Flash N25Q128,接口时钟最大支持 108MHz,最小擦除单位 Subsector 为 4KB,Sector 为 64KB,本实验使用 QSPI 模式,接口速率 25MHz。

在这里插入图片描述

名称典型值最大值单位
页编程时间int(byte/8)*0.015,向上取整(256 Bytes 时间为 0.48)5s
Subsector 擦除时间0.22s
Sector 擦除时间0.73s
串口传输 1 Byte(包含校验位)11/750000 ≈ 14.67us
串口传输 256 Bytes 升级数据(实际需传输 264 Bytes)264*11/750000 ≈ 3.872ms
总擦除时间(1 个 Subsector + 34 个 Sectors)24s

Flash 大小计算

  • 由于本实验 Flash 结构为 uniform 不能使用子扇区擦除指令(SSE),所以最小擦除单位为 1 个扇区(64KB)
名称大小
QuickBoot header,part 164KB
QuickBoot header,part 2256 bits
Golden Image17,536,096 bits
总计17,569,120 bits
换算成 Sector 个数35 Sectors = 17.5Mb
所以最小 Flash 大小为17.5Mb + 34 Sectors = 34.5 Mb(update区域少去 part1 一个扇区大小)

Flash 地址分配

在这里插入图片描述

串口通信协议

升级起始帧

偏移地址字节数定义内容
02帧头0xBCBD
22帧长度单位 byte,不包括帧头、帧长度和帧类型
41帧类型0x01
54update 起始地址MSB 在前
94update 程序大小单位 byte

升级数据帧

偏移地址字节数定义内容
02帧头0xBCBD
22帧长度单位 byte,不包括帧头、帧长度和帧类型
41帧类型0x02
53包序号从 1 开始
81-256写入数据

升级状态帧

偏移地址字节数定义内容
02帧头0xBCBD
22帧长度单位 byte,不包括帧头、帧长度和帧类型
41帧类型0x03
51操作状态bit7:校验成功(1);bit6:回读校验完成(1);bit5:页编程完成(1);bit4:擦除完成(1);bit3:回读校验中(1);bit2:页编程中(1);bit1:扇区擦除中(1);bit0:子扇区擦除中(1)

QuickBoot 远程升级步骤

生成出厂文件

远程升级

  1. FPGA 通过串口接收升级起始帧,FPGA 解析 update 起始地址 和 update 程序大小;
  2. FPGA 进行 Subsector 擦除操作(地址 0x00),即修改 critical switch word 值为 OFF;
  3. FPGA 进行 Sector 擦除操作(地址为 update 起始地址);
  4. 擦除完成后,等待写入数据缓存 FIFO 足够 256 Bytes(页大小)时进行一次页编程;
  5. 完成编程后,重复步骤 3-5;
  6. 完成 update 程序烧写后,回读 update 程序进行 CRC 校验;
  7. 若 CRC 校验正确则修改 critical switch word 值为 ON,否则上报 CRC校验错误状态。

注:golden 和 QuickBoot hear 的第二部分内容 (warm boot jump sequence) 都不允许更改。

QSPI 设计

QSPI 操作流程

  1. 接收到升级开始标志;
  2. 默认上电 Flash 为 单线 SPI 模式,需要写 VECR 寄存器使能四线模式(也可以写 NVCR 寄存器,但是NVCR 寄存器更改后下次上电才生效,但更改后除非重新写 NVCR 寄存器才能更改配置;而 VECR 只有每次写后才生效,断电重启后会恢复为 NVCR 的配置);
  3. 执行 SSE 指令;
  4. 执行 RFSR 指令获取 Flash 状态直至 Flash 为空闲状态;
  5. 执行 SE 指令;
  6. 执行 RFSR 指令获取 Flash 状态直至 Flash 为空闲状态;
  7. 等待写入数据缓存 FIFO 足够 256 Bytes(页大小)时执行 QCPP 指令;
  8. 执行 RFSR 指令获取 Flash 状态直至 Flash 为空闲状态;
  9. 重复 5-8 步骤,直至烧写完 update 数据;
  10. 执行 QCFR 指令,回读 update 数据进行 CRC 校验;
  11. 校验完成且结果正确,则执行 QCPP 指令,写 0xFFFC 地址写入 0xAA995566 同步字;
  12. 写 VECR 寄存器改为单线模式,否则 jtag 无法固化程序;
  13. Flash 操作完成。

Flash 时序

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述

Extend SPI 指令

在这里插入图片描述

WREN

在这里插入图片描述

WRVECR

在这里插入图片描述

QIO-SPI 指令

在这里插入图片描述

QCFR

  • 指令 0Bh, 6Bh, EBh 的结果都一样

在这里插入图片描述

WREN

  • 手册该指令时序图错误,还是上升沿采数,下降沿传输

在这里插入图片描述

QCPP

  • 需要先执行 WREN 指令

在这里插入图片描述

SSE

  • 需要先执行 WREN 指令
  • 手册该指令时序图错误,还是上升沿采数,下降沿传输

在这里插入图片描述

SE

  • 需要先执行 WREN 指令
  • 手册该指令时序图错误,还是上升沿采数,下降沿传输

在这里插入图片描述

RFSR

在这里插入图片描述

WRVECR

在这里插入图片描述

寄存器定义

Volatile Enhanced Configuration Register

在这里插入图片描述

Flag Status Register

在这里插入图片描述

  • bit7:1(空闲),0(忙)
  • bit6:1(擦除暂停)
  • bit5:1(擦除失败)
  • bit4:1(烧写失败)
  • bit0:1(擦除或者烧写的空间为受保护区域,报错)

CRC32

  • CRC32模型

在这里插入图片描述

  • 回读校验(本工程使用方式一)

    • 方式一:

      对比回读计算出来的 CRC32 值和升级程序里写入的 CRC32 值是否一致,一致则表示校验成功

    • 方式二:

      将回读回来的所有 upgrade 数据(包括 CRC32 值)都进行 CRC32 计算,将计算的 32bits 结果进行反转继续输入进行 CRC 计算,计算结果若为常数 0xC704DD7B 则表示校验成功

  • CRC32 模块接口真值表

在这里插入图片描述

  • 时序

在这里插入图片描述

STARTUPE2 原语

默认无法直接配置 CCLK,所以若要读写程序 FLASH,需使用 STARTUPE2原语才能控制 CCLK 引脚。

   STARTUPE2 #(
      .PROG_USR("FALSE"),  // Activate program event security feature. Requires encrypted bitstreams.
      .SIM_CCLK_FREQ(0.0)  // Set the Configuration Clock Frequency(ns) for simulation.
   )
   STARTUPE2_inst (
      .CFGCLK(),       // 1-bit output: Configuration main clock output
      .CFGMCLK(),     // 1-bit output: Configuration internal oscillator clock output
      .EOS(),             // 1-bit output: Active high output signal indicating the End Of Startup.
      .PREQ(),           // 1-bit output: PROGRAM request to fabric output
      .CLK(0),             // 1-bit input: User start-up clock input
      .GSR(0),             // 1-bit input: Global Set/Reset input (GSR cannot be used for the port name)
      .GTS(0),             // 1-bit input: Global 3-state input (GTS cannot be used for the port name)
      .KEYCLEARB(1), // 1-bit input: Clear AES Decrypter Key input from Battery-Backed RAM (BBRAM)
      .PACK(1),           // 1-bit input: PROGRAM acknowledge input
      .USRCCLKO(qspi_clk),   // 1-bit input: User CCLK input
                             // For Zynq-7000 devices, this input must be tied to GND
      .USRCCLKTS(0), // 1-bit input: User CCLK 3-state enable input
                             // For Zynq-7000 devices, this input must be tied to VCC
      .USRDONEO(1),   // 1-bit input: User DONE pin output control
      .USRDONETS(0)  // 1-bit input: User DONE 3-state enable output
   );

在这里插入图片描述
在这里插入图片描述

  • CFGCLK:Master 模式下一直使能/连接,但除了配置的时候存在时钟,其他时候为无效的高电平;在配置了 USRCCLK 时,在 FPGA 配置结束后三个 clk 该时钟将切换到 USRCCLK。Configuration mode 是根据 M[2:0] 管脚配置的,最常用的是 M[2:0]=001 对应的 Master SPI 配置模式,Master 模式下 CCLK 由 FPGA 输出给 FLASH 的 SCLK;
  • EOS:End Of Start,指示 FPGA 配置的结束,EOS 信号上电后一瞬即由低变高,指示配置完成,因此可用作 FPGA 启动的判断依据;
  • CFGMCLK:配置内部振荡器时钟,是从内部的一个锁相环输出的 65MHz 时钟(不是很准),输出到 GPIO 的信号极其微弱,但 ILA 可以正常捕获,因此此时钟可用于 FPGA 内部逻辑,但不可直接输出(其驱动 I/O 的能力太弱了);
  • USRDONEO:输出到 FPGA 的 DONE_0 管脚。一般而言,在硬件设计中会在这个管脚挂一个 LED 灯,以指示 FPGA 完成配置开始运行;
  • USRDONETS:控制 DONE 管脚的三态门,1 将设置为高阻,0 将会把用户输入的 USRDONEO 输出到 DONE_0 管脚;
  • USRCCLKO:在配置完成后,驱动 CCLK_0 管脚的用户自定义时钟。在配置完成后,前三个时钟周期用于切换时钟源,且不会被输出,但如果使用了 EMCCLK 管脚,则 EMCCLK 信号会出现在 CCLK 管脚上,直到过渡到用户自定义时钟;
  • USRCCLKTS:控制 USRCCLKO 的三态门;
  • GTS:全局三态门使能,要用户自定义 CCLK/DONE 等,此管脚必须置低。

其他信号详见官方手册说明,默认启动设置下,配置期间的时序图如下

IOBUF-IOSTANDARD

默认 IOSTANDARD 为 LVCMOS18,CVGBVS 决定 bank0 I/O支持的电压值,以及配置区间 bank14、bank15 的 I/O 所支持的电压值;

在这里插入图片描述

上位机设计

使用 pyqt5 进行设计,上位机界面如下:

在这里插入图片描述

IP 例化界面

在这里插入图片描述

上板验证

  • 测试升级一次时间为 1 分钟

在这里插入图片描述
在这里插入图片描述

调试总结

  • Flash 结构为 uniform 不能使用子扇区擦除指令(SSE),只有 Top 和 Bottom 结构可以使用

  • Flash 的片选信号需要进行控制,不能一上来就一直是低电平

  • 操作 Flash 之前要先产生时钟信号,用于 STARTUPE2 原语切换时钟源

  • 使用 AX7035 开发板进行测试,SPI 时钟跑 50MHz 时,会出现采集错误,25MHz 没有问题

  • jtag 固化默认使用的是 spix1 模式,若当前 spi 模式操作模式不一致会导致固化失败

评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

FPGA的花路

你的鼓励是我最大的创作动力!

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值