实际项目过程中很多时候产品定型之后是不能通过JTAG进行程序升级的,往往只能选择远程升级在线进行程序更新,Xilinx官方推荐的升级方式有multi boot及quick boot,具体可以参考 xapp10812文档,当然如果项目中选择BPI FLASH,可以直接通过借助MCU控制BPI的高位地址,强行将FLASH进行空间划分,通过切换高位地址,从而达到不同片区的效果,但是这种方式需要借助其他的主控MCU芯片才可以完成远程升级。 xilinx介绍的的quick是不借助外界芯片,直接在线更新程序,原理是将FLASH中的数据划分为golden 和update区域,通过关键字进行跳转 官方例程提供的DEMO只是针对他们特定指定的两款芯片,如果刚好设计硬件是它们 那就直接可以用,当然需要增加上层的数据接口,如果不是指定的芯片,需要将底层读写函数重新实现,我这里选择的是S29GL01GS11DHIV10,所以官方的东西都需要修改,具体可以参考手册说明 最后程序接口
在这里插入代码片
entity BpiFlashProgrammer is
port
(
-- Clock and control signals
inClk : in std_logic;
clk_osc_100m : in std_logic;
inReset_EnableB : in std_logic;
inCheckIdOnly : in std_logic;
inVerifyOnly : in std_logic;
-- Data
inData32 : in std_logic_vector(15 downto 0);
outFifoRd_en : out std_logic;
inFifoData_count : in std_logic_vector(11 downto 0);
-- Status signals
outReady_BusyB : out std_logic;
outDone : out std_logic;
outError : out std_logic;
outErrorIdcode : out std_logic;
outErrorErase : out std_logic;
outErrorProgram : out std_logic;
outErrorCrc : out std_logic;
outErrorBlockLocked : out std_logic;
outErrorVPP : out std_logic;
outErrorCmdSequence : out std_logic;
outErrorTimeOut : out std_logic;
outStarted : out std_logic;
outInitializeOK : out std_logic;
outCheckIdOK : out std_logic;
outEraseSwitchWordOK: out std_logic;
outEraseOK : out std_logic;
outProgramOK : out std_logic;
outVerifyOK : out std_logic;
outProgramSwitchWordOK: out std_logic;
-- Signals for BPI flash
-- Change outAddress32 width to your BPI flash address width
outAddress32 : out std_logic_vector(31 downto 0);
inoutData16 : inout std_logic_vector(15 downto 0);
outFCSB : out std_logic;
outFOEB : out std_logic;
outFWEB : out std_logic;
outFWPB : out std_logic
);
end BpiFlashProgrammer;
`
``通过串口或者网络将MCU文件下发到FPGA进行读写FLASH完成远程更新
|