前言
在此之前的在线升级篇已经介绍了在线升级的原理,FPGA的在线升级能够解决运营过程中可能需要根据应用需求只需更改固件而无需物理更换芯片问题。对于不同需求应用都能得到良好的解决,从而满足更新的应用。在产品设计中考虑成本可以选择本地升级,只需要开发本地软件,本设计采用USB接口按照自定义的协议对FPGA固件进行升级。
一、在线升级系统设计
本系统设计采用xilinx FPGA +MFC通过USB进行数据传输,达到升级效果。在设计烧写文件时,我们当然认为已经对DOWN文件是熟悉的,在此再繁琐的介绍下:
(1)Bitstream(bit):Bitstream是一种二进制文件格式,用于存储FPGA的配置信息。它包含了FPGA逻辑元件的连接和功能等详细信息,以及配置所需的时序和逻辑设置。Bitstream文件通常由FPGA开发工具生成,并通过不同的配置方式(如JTAG、SPI等)加载到FPGA中。
(2)Binary(bin):Binary也是一种二进制文件格式,但与Bitstream不同,它通常是指纯粹的二进制数据文件,没有特定的FPGA配置结构。在某些情况下,可以将FPGA的配置数据导出为二进制文件,这样可以方便地进行备份、传输或其他处理。
(3)MCS(Motorola S-record):MCS是Motorola S-record文件的缩写,是一种常见的文本文件格式(ASCII文件),用于存储数据和程序代码。在FPGA领域,MCS文件通常用于存储FPGA的配置数据。MCS文件包含了地址、数据和校验等信息,可以用于直接编程或烧录FPGA。
应用中的基本框架还是比较简单,设计中MFC实现数据传输上位机编写,通过USB驱动将FPGA烧写的配置文件下发至FPGA版本内部RAM中,然后通过内部SPI擦写模块对FLASH进行擦写。通过简单的握手完成升级通信。
二、FPGA设计
采用xilinx FPGA 设计搭载QUAD_SPI block design方式,方便可灵活更改和调试。当然大家也可以使用逻辑去实现FLASH端的SPI的编程,HOST端一次传输FIFO深度大小的数据,满足一定条件后HOST端再次请求发送数据,直到完成整个配置文件数据的传输。采用USB3.0相对于串口当然提高了升级效率,在设计中也可以设计成选择不同的接口。
三、应用设计
(1)创建工程
新建MFC应用程序之后,需要在项目属性里添加调用动态链接库路径如图所示。
1)将USB库及其他库文件拷贝到工程目录下,然后右键弹出菜单中点击“工程属性”,将dll添加到工程中。然后在附加包含目录中,在附加库路径中输入用到链接库文件路径。
2) 在需要用到 SDK 的地方,包含头文件。
// UpdataContrlDlg.h : 头文件
//
#pragma once
#include "Driver_app.h"
#include "afxcmn.h"
#include "afxwin.h"
#include "CPCIAcquisitionCard.h"
// CUpdataContrlDlg 对话框
class CUpdataContrlDlg : public CDialogEx
{
// 构造
public:
CUpdataContrlDlg(CWnd* pParent = NULL); // 标准构造函数
// 对话框数据
#ifdef AFX_DESIGN_TIME
enum {
IDD = IDD_UPDATACONTRL_DIALOG };
#endif
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
// 实现
protected:
HICON m_hIcon;
// 生成的消息映射函数
virtual BOOL OnInitDialog();
afx_msg void OnSysCommand(UINT nID, LPARAM lParam);
afx_msg void OnPaint();
afx_msg HCURSOR OnQueryDragIcon();
DECLARE_MESSAGE_MAP()
public:
afx_msg void OnBnClickedButtonReadFile();
afx_msg void OnBnClickedButtonStart();
afx_msg void OnBnClickedButtonOpen();
afx_msg void OnBnClickedButtonClose();
DWORD static WINAPI processThread(LPVOID lpParam);
DWORD static WINAPI processThread2(LPVOID lpParam);
CProgressCtrl m_MyProgress;
int m_MyProCount;
void OnProgressShow(int MyProCount);
CComboBox m_SelectDevice;
LRESULT ShowProgramPercent(WPARAM a_wParam, LPARAM a_lParam);
CComboBox m_FlashIndex;
};
3)实现配置文件拷贝到及执行文件传输线程。
DWORD WINAPI CUpdataContrlDlg::processThread(LPVOID lpParam)
{
CUpdataContrlDlg *dlg = (CUpdataContrlDlg *)lpParam;
long re_size = statbuf.st_size;
unsigned int step = floor