|
EDA365欢迎您登录!
您需要 登录 才可以下载或查看,没有帐号?注册
x
FPGA的MultiBoot功能可以支持远程动态更新bitstream images,实现bitstream images的实时切换。在MultiBoot配置过程中检测到错误时,FPGA可以触发fallback 功能,以确保可以将已知良好的设计加载到器件中。
$ G) ~( `) F$ a F" v
* @7 |7 ]5 T* p' W3 B9 MMultiBoot的大致过程如下图:
) b7 ~2 o. I& d& C1 @
9 `: p- o% d$ D( P: W
/ F( P% W) G: u: X+ q/ }7 [
MultiBoot的配置文件由两个比特流文件生成,第一个为备份文件,永远都不会变,称为Golden_image,从Flash的0地址存储。# u0 n( g" d2 L% q: e& E6 g! a
5 D& a7 k; o- [* H: R( O第二个为更新文件,后面远程更新,更新的就是这个文件,称为Update_image,存放在某个地址处,这个地址有热启动地址寄存器(WBSTAR)指定。
$ o' ~& m/ K0 p+ _" p* o6 I4 c* Z8 k$ x7 d5 U; ]: b
配置过程大致如下:FPGA从FLASH的0地址处读取配置,遇到IPROG Command命令时,跳转到WBSTAR寄存器指定的地址,该地址存放Update_image的地址,此时FPGA尝试加载该地址处的比特流文件,配置成功的话,就执行该配置的功能。如果遇到配置错误,则触发FallBack,FPGA重新加载Golden_image。4 E; D \% Y+ z/ d0 K ^
1、ICAPE3 接口
2 D8 d$ [& z _) jFPGA实现IPROG通常有两种方式,一种是通过ICAP配置,一种是把相关指令嵌入bit文件中。与通过bit文件实现IPROG相比,通过ICAP更灵活。
. E2 W8 W# D* Q7 V2 p/ h) v
- F5 p. ~4 o- I) D% t在Xilinx FPGA 中ICAP(Internal Configuration Access Port) 指的是内部配置访问端口,其主要作用是通过内部配置访问端口(ICAP),用户可以在FPGA逻辑代码中直接读写FPGA内部配置寄存器(类似SelectMAP),从而实现特定的配置功能,例如Multiboot。! }4 B# ]3 P# |9 S5 M
ICAP目前为止有三个版本,包括ICAP,ICAPE2以及ICAPE3。UltraScale系列对应ICAPE3,7系列对应ICAPE2,7系列之前的对应ICAP。: e" C- I! E* V
4 F% n( o% n" }/ ]0 s d- f8 ^以下以ICAPE3 为例,ICAPE3 的接口如下:
W* T, L7 v+ X; o% Z: U* n3 O3 W w5 Y. Q) s8 I, I
) L5 ~ m" X* v9 g6 \
6 n/ P ^" B" R T
7 @! w- [! M% V1 Y' o% ?
2、IPROG指令
" f; u) Y5 W5 o; J0 a4 w* k每个UltraScale系列的FPAG包括2个ICAPE3,但实际使用时只能例化并使用一个,默认顶部ICAPE3, 初级玩家采用默认的即可。
4 p# |, a' _" e( E) T9 E4 A
' _8 Y2 a$ R2 j _; h- B) BIPROG指令的作用跟外部Program_B管脚的作用类似,都是对FPGA芯片进行复位操作,该复位操作对FPGA内部的应用程序进行复位,复位过程中除专用配置管脚和JTAG管脚,其他输入/输出管脚均为高阻态,同时IPROG指令不能复位专用重配置逻辑,如WBSTAR寄存器、TIMER寄存器、BSPI寄存器和BOOTSTS寄存器。IPROG指令能够触发FPGA开启初始化流程,同时拉低INIT和Done信号。完成复位操作后,将默认的加载地址用热启动地址寄存器(WARM Boot Start Address,WB-STAR)中的新地址替换。
. s N9 u: H* s9 t# R, w n. B8 j; J% W7 \3 x: \5 _* \. H+ |
通过ICAP发送IPROG指令实现Multiboot的步骤如下:, m/ X8 Q Q R% o
4 M, Y3 J( k6 p4 J; @* ]5 S
( f4 ]- @! q7 n8 A# ?
首先写入同步头 32’hAA995566, 然后将需要跳转到的bit文件的起始地址写入WBSTAR寄存器,最后写入IPROG(internal PROGRAM_B)指令。
3 `$ W! T" K& {1 H- r) g% d+ a+ \: t1 A# q: @1 g; l) F
WBSTAR寄存器的格式,根据自己的要为Update_image分配在FLASH的地址,按照下面的格式生成一个32位数据。例如,我为Update_image分配的flash地址为2000000。8 b; z- }* @# U- |
E" o0 k9 M0 o
9 ?7 \4 G5 K+ T) Q% Y
(1)对于BPI模式来说,可以通过RS[1:0]来控制具体位流的读取,也可以通过STAT_ADDR[28:0]地址来控制具体位流的读取。
# b& z! F9 u8 g: L$ S
0 n+ k" J" W8 [(2)对于SPI模式来说,只有STAT_ADDR[23:0]地址来表征FLASH器件的地址,当使用32位地址的SPI(容量大于等于256Mb)时,需要将实际存储的高24地址赋值给STAT_ADDR[23:0]。因此在位流存储的起始地址早于255时,这就要求位流中的dummy数目要大于256个,否则就会出现易失部分有效位流读取,导致加载失败。为了安全起见,在使用大于等于256Mb的FLASH时,可以适当在位流头前加入Dummy。2 Y+ m+ m8 f. ]" G: f& E
& @: G- k4 z2 \$ T这里需要注意一点,ICAP以及SelectMAP都存在位反转(Bit Swapping),也就是说,上表中所有的数据需要进行位反转之后才能接到ICAP的输入接口,同理,ICAP输出的值需要进行位反转后才能与实际的值对应起来,位反转的示例如下图。& ?0 Z: X/ |; y+ l! b: n( y' I0 f
+ [3 l8 P2 u( J3 m' U( I. j
7 X( G: T7 s+ i- ^
3、ICAPE3 例化示例
" `& I1 n9 O2 _- P/ h% `8 M tICAPE3 进行例化,示例如下:' L7 i1 C; p, U9 J& l3 t+ E: }
+ p7 l( p' r! V! Q// ICAPE3: Internal Configuration Access Port: w* }1 R8 \5 G5 ]+ J3 j
: v3 o3 R# D0 S% w [/ D
// UltraScale
6 \, a+ N x& U1 c; ~( P r: u7 N+ _* m/ F T4 J
// Xilinx HDL Language Template, version 2019.1
- _: I8 Y9 f! ?2 f* z k1 R3 Z
* ~3 w3 X n0 F# M8 h4 y- C" IICAPE3 #(8 U& ]4 F6 v% ~0 G4 y% o" c5 n
' n9 b4 E; V5 O7 S( h c: ~
.DEVICE_ID(32'h03628093),//pre-programmed Device ID value,used for simulation6 t2 l- |; Y' y1 w# A
- V: \8 z5 T6 S2 _1 L( a# I& \' | h
// purposes.: C3 E5 X8 @ E7 k
. ]! s9 M# r# Z4 T, \- L# w+ F.ICAP_AUTO_SWITCH("DISABLE"),//Enable switch ICAP using sync word: L6 Y: F+ x! E# v0 i; F2 O
. y3 O2 ]. j/ I2 x9 F; m- A.SIM_CFG_FILE_NAME("NONE")//Raw Bitstream (RBT) file,parsed by the simulation
7 ?+ ]4 [* w c M6 F9 ^2 c3 N! B$ X; c8 e' \
// model( c' k2 Z1 ?6 r, B
' _- n) ~4 q' u4 E. Z5 |). K/ O7 T2 ^+ ]4 {- N
1 a9 V( y+ A' x2 HICAPE3_inst (" j( b3 ^* {; l W7 g$ u) Z; Y
' x. A# s) S% n: [/ U4 e.AVAIL(AVAIL), // 1-bit output: Availability status of ICAP( L7 ~' }; P" S1 S
- _3 f8 [- S: s& g' `& R.O(O), // 32-bit output: Configuration data output bus
2 X: y. {. K4 X0 N2 i" i# O* [- L0 U" ]: J5 A) \9 L/ p
.PRDONE(PRDONE),//1-bit output: Indicates completion of Partial Reconfiguration
; G5 m1 Y1 ?- @) R( C& L: i4 Z) ^1 ?! l' Q: Y
.PRERROR(PRERROR),//1-bit output: Indicates Error during Partial Reconfiguration
6 |9 ]7 m- y2 J: y" D) J# D
7 x$ s7 T L2 m% a.CLK(CLK), // 1-bit input: Clock input Q4 y0 q) ~" J: a, H8 W
! B6 c( `( Z" N! q% Q+ a0 O.CSIB(CSIB), // 1-bit input: Active-Low ICAP enable
4 ]) x1 V+ f" Z" R+ G/ a
7 B' c$ p" Y7 J9 D3 ].I(I), // 32-bit input: Configuration data input bus
7 S" s; Q; C! P5 D7 a. Y' R# f2 w9 |3 p! G
.RDWRB(RDWRB) // 1-bit input: Read/Write Select input& a% W" ^( ~! c$ B
/ e3 Z0 s/ k$ k4 ?);7 B' w% Z; Q8 W p/ `2 }" Q
: _1 y0 w% L5 K7 d// End of ICAPE3_inst instantiation8 @. L/ f+ I7 h1 ~. \$ V* F
2 p7 ~$ v8 ` J* B8 v5 [4 V7 Z其中设备号DEVICE_ID需要查找USER GUIDE手册,而ICAP原语接口时序跟Select Map接口时序非常相似。SelectMap模式下,FPGA的配置和回读是通过CSI_B,RDWR_B和CCLK来控制的。+ s9 Q6 L, h& q' k/ h) G# c8 |; A
4、程序步骤7 r5 s2 ]* G. j ^) f' ^7 g
在发送IPROG指令之前,将默认的加载地址用热启动地址寄存器(Warm Boot Start Address,WB-STAR)中的新地址。
( c4 W& u" ^7 b6 x/ w( d" l3 [( _% r
然后对ICAP核进行预配置。重载控制模块在收到触发信号后,第一个时钟周期将ICAP核的RDWRB信号和CSIBCSIB信号置高,第二个周期将RDWRB信号置底,CE信号置高,第三个周期将RDWRB信号置底,CSIB信号也置底。! G' U4 S2 L/ d, f- e+ r$ p! d1 r
' w+ i2 J" e1 x' s0 Q, Y) Y+ X接着在下面的8个时钟周期里,将指令队列中的控制命令逐个发出。3 G% h @4 U! }+ S+ \% t1 {6 i# s
: r9 A8 o9 ?* p$ S
运行工程,生成位流Bit,在约束XDC文件中添加压缩等命令即可。* F+ W9 K; q* W; C( _- r' b+ f
, C3 q! B0 F& d: P
! S% [" ?7 L7 c+ J b/ C% C* \
% k8 y2 r/ h& F7 f3 X" x# I+ t% G固化Mcs生成。Xilinx系列的FPGA需要将后缀名为mcs的内存镜像文件固化到外部配置存储器中,FPGA上电后才能自动加载配置文件。一般的mcs文件只包含一个bit流文件,多重启动的mcs固化文件包含多个bit流文件。在将多个bit流整合到mcs文件的过程中,需要指定每个bit流的起始地址,这样FPGA专用配置逻辑才能根据地址找到对应的bit流。在程序设计WBSTAR地址时,确定了Golden位流存储的起始地址为0X00000000,Update位流存储的起始地址为0X00800000,因此在将Bit整合到Mcs过程中需要指定对应的存储起始地址,否则就无法加载成功了。
* E: h, \3 ^8 z8 |" ]1 P$ E: n! H2 n7 Q2 j" y
; K' y4 h6 o. c$ l
( l7 t5 V: n9 z% K
* M a, @* ?+ R+ y- \) e+ u9 `3 k8 x( y! _8 I! n1 _
在SPI的flash里烧写有A和B两个程序,FPGA上电后,自动加载A程序,根据外部给FPGA指示信号,FPGA自动切换加载B的程序,同时在B程序运行期间,根据外部给FPGA指示信号,FPGA自动切换加载A的程序。 |
|