编程文件格式的转换 MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下: 1. 进入数据转换对话框 图1 进入数据转换对话框 2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释) 图2 选择相应的输出数据格式 在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。 ) ]& T7 ?' x1 P+ r# }/ Q
CPU程序设计 . I S2 l, g' Q- @
以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。 本设计的CPU源程序 void InitPORT(void) { // 初始化PB口相应位:
4 }0 M# w# y% K+ G// PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出- n `: L1 I% M6 i
IMMR->pip_pbpar=0x00000000;
, C5 R$ \+ E% z; ]) d, i2 XIMMR->pip_pbdir=0xFFFFF5AF;7 q6 w5 x: b, i" t! y( ^5 ^" I! i
IMMR->pip_pbodr=0x00000000;# E* Z/ p) x) @4 E' q$ P. K
IMMR->pip_pbdat=0xffffff57;& }+ U G- {4 m7 }+ @* X: m1 X
} UBYTE Fpga_DownLoad(void)% ?* ^9 c' M1 R% A/ e9 J
{ // FPGA配置
. S+ e. }& [4 \0 G# }. o. ~- a. mUBYTE *Bootaddr;* U# v1 l+ \6 `7 Q& r" ?
UWORD CountNum=0x0;
$ R9 P+ l" C; J+ S( z' @UBYTE FpgaBuffer, i; // 获得Boot区首地址0 @8 e, @2 `" a5 W3 { r
Bootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000); Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态; M7 ^& a0 ]* d
Set_DCLK(0);
7 Q$ ^* R8 {, u4 Z$ \, C& DDELAY5us();
- P0 t. _$ X9 Q0 n7 A; Mif (Read_nSTATUS() == 1)- i, q1 o( K4 x( G8 H6 x
{ // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错4 @' y) w7 G8 U! ~2 J) y
Err_LED(1);
, L% o- g* y$ M" p3 _: s$ i# greturn 0;
: I& C! H. a2 j! B: c}( Z( `4 O0 l! l |2 f
Set_nCONFIG(1);$ r5 `8 P: l+ U3 i! c# q1 R4 I
DELAY5us(); 6 E0 g0 s& Q* m+ g# N' ~* m6 o1 M+ a
// 开始输出配置数据:
" F% O( L" e8 H* J* Hwhile(CountNum <= 0x0e74e)3 V+ u: p2 G5 B2 M6 X) i
{& V' o# i: f8 I- Z) m
FpgaBuffer= *(Bootaddr+0x70000+CountNum);0 d. m; ?% L( H7 L- y
for (i=0; i<8; i++)1 j1 @& W4 j' g. d
{ // DCLK="0"时,在Data0上放置数据(LSB first)+ l: i" t2 ^( z5 V* ~1 Z+ l
Set_Data0(FpgaBuffer&0x01);
3 O; Z3 L# q9 ~. f" V; y) tSet_DCLK(1); // DCLK->"1",使FPGA读入数据) Q& C+ q d$ L; p
FpgaBuffer >>= 1; // 准备下一位数据
% O# s) o0 [$ W$ Y+ Wif (Read_nSTATUS() == 0)
0 M# p0 i! I2 c: u. n{ // 检测nSTATUS,如果为"0",表明FPGA配置出错
3 t; v' P+ _/ g, T6 a& A- MErr_LED(1);+ Z" B9 }: D+ ?
return 0;
2 i0 }' a+ S3 M/ \}
# r- Y& o/ p' @1 VSet_DCLK(0);
7 |" W5 A& P1 Y: |3 `/ Y! k3 h}+ \. f# E2 B6 J+ \
CountNum++;' P1 {5 Q- I2 `# X* k- D6 d' o
}
% _! Z, i7 a4 q// FPGA初始化:( e3 x9 a7 a) s* x
// ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期6 V" q) s, p! ?$ |( x
for(i=0; i<10; i++)8 i: X: W+ L' a; i: ]$ o
{0 J4 G6 e8 z( o, k0 ?, o: l
Set_DCLK(1);4 r9 |# K2 B0 s) _2 L8 k* s
DELAY100us();! y4 @" m- U9 |) U# o; h4 C* l
Set_DCLK(0);2 `+ o% x2 T+ s
DELAY100us();
8 v- ~* P( j( i. q/ y2 }1 q1 Y}1 `0 G k' z' j3 C* k4 p \6 X
Set_Data0(0);. b& H1 m7 k, A0 _8 J7 O' Q
if (Read_nCONF_Done() == 0)3 R& k0 I+ g: W, w8 r" O
{ // 检测nCONF_Done,如果为"0",表明FPGA配置未成功
5 `5 l/ d; Q4 ~- tErr_LED(1);
$ ^ G$ W* j K* q' T# r: Kreturn 0;; T: T$ C7 ^, n! ~) w! G
}: [* P) |, E8 |* e6 w0 ]4 T
return 1; // 成功返回
+ M. p0 R9 R& M: M7 V2 \}
// Data0输出
) `0 i# m# l: J' ^; H1 I$ M, ^void Set_Data0(UBYTE setting)
5 Z: E" ?4 t0 _9 z; O{ // PB243 `+ Y( \' z% @- W
if (setting) IMMR->pip_pbdat |= 0x00000080;" W& ^/ p5 {1 H: g
else IMMR->pio_pbdat &= 0xFFFFFF7F;
/ j* W1 k3 ^% J( M- G) c% U} // 读nSTATUS状态. J+ i3 a; f3 Z m: w* j; A
UBYTE Read_nSTATUS(void), b/ Y: K5 W5 |. j1 t
{ // PB253 |! E- G3 ^) C ]
if (IMMR->pio_pbdat & 0x00000040) return 1;0 [" I! W+ J7 B* e, i0 Z9 G
else return 0; h$ ]/ ?- w/ o* |
} // 设置nCONFIG电平
: l7 Q4 y5 J! w7 u8 V* \# Pvoid Set_nCONFIG(UBYTE setting)+ w& \& @; P6 I& R, w
{ // PB269 Z4 g0 N% D1 x, K' F# M; E' _
if (setting) IMMR->pip_pbdat |= 0x00000020;
* n$ f7 p9 ~) A. selse IMMR->pio_pbdat &= 0xFFFFFFDF;
8 H. O, _$ K Y% Y4 e} // 读nCONF_Done状态
+ b8 d4 s+ o) m8 `5 vUBYTE Read_nCONF_Done(void)
4 V4 b# X$ B. x( w$ d! X1 |. ~{ // PB27
; l) D$ M* n5 n+ Sif (IMMR->pio_pbdat & 0x00000010) return 1;
3 F* L8 |1 W) r; `2 I4 Relse return 0;% G7 B! n: x) R' Z, E9 o9 {
} // 输出DCLK
; a" i2 T( d& _5 M2 @ Mvoid Set_DCLK(UBYTE setting)
; P. \! X) w9 C{ // PB28
! X; F) ?% A2 ]- S D) qif (setting) IMMR->pio_pbdat |= 0x00000008;7 g% s6 w4 z3 q" X7 u F
else IMMR->pio_pbdat &= 0xFFFFFFF7;# O A9 a5 Y* x6 o: d6 O; I
}
5 ?/ ]) X2 m' y) l// 结束 |