|
编程文件格式的转换 MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下: 1. 进入数据转换对话框 图1 进入数据转换对话框 2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释) 图2 选择相应的输出数据格式 在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。
( O4 v% F( n( a+ f6 {: QCPU程序设计 ' F6 _1 o) O% [( v- d5 Z
以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。 本设计的CPU源程序 void InitPORT(void) { // 初始化PB口相应位:
5 V! Q K* j) c- s8 [$ {$ `// PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出
& F6 w9 d, N% f8 b- j. yIMMR->pip_pbpar=0x00000000;
, I; F- a: p' c: a* o5 CIMMR->pip_pbdir=0xFFFFF5AF;3 |3 W8 E( E4 y: u+ R
IMMR->pip_pbodr=0x00000000;
, K4 ?# x/ I3 i u* [" Q8 e+ M+ D! yIMMR->pip_pbdat=0xffffff57;( `8 ~# B7 s3 l. k& i
} UBYTE Fpga_DownLoad(void)
1 i4 d5 J! q% |# v; L{ // FPGA配置
( f- r9 P6 y7 r$ J0 @- fUBYTE *Bootaddr;" `% ^% `. a7 P0 e/ ]: s
UWORD CountNum=0x0;
# x8 y X! j, ~) F: W; mUBYTE FpgaBuffer, i; // 获得Boot区首地址8 c4 I: Z2 [; C5 m0 R
Bootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000); Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态
N0 N0 Y4 C6 q$ l7 xSet_DCLK(0);4 N& z* |5 R8 E; j% L
DELAY5us();) R% F9 K7 F E! W: T. B
if (Read_nSTATUS() == 1). l) j& M* \9 c: G
{ // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错! I7 ]& V- F# l) K3 k7 K( X
Err_LED(1);
; |/ w7 ?" |& T/ {$ |return 0;+ A1 l; \1 h' E& t/ [
}
( L6 z o% g5 r: F$ A4 ^" N |5 H' nSet_nCONFIG(1);
; s, x" v$ q$ {. ~% `" y( J( WDELAY5us();
: g2 q3 ^ Y1 V// 开始输出配置数据:: V! e- q8 g5 G7 v
while(CountNum <= 0x0e74e)
3 L( K1 K, z1 y{
7 I% F0 T9 W6 T+ G" z$ f' }+ z/ K1 pFpgaBuffer= *(Bootaddr+0x70000+CountNum);
, p% R9 \, X- mfor (i=0; i<8; i++)
: Y8 Y3 f7 B% }( ^$ O{ // DCLK="0"时,在Data0上放置数据(LSB first)
! ~5 B r- P' l. `8 ?( `Set_Data0(FpgaBuffer&0x01);) m2 b! d7 J) v2 z7 M8 Q* r
Set_DCLK(1); // DCLK->"1",使FPGA读入数据: b( q1 P1 ~) A% W9 ^8 v
FpgaBuffer >>= 1; // 准备下一位数据
" P' U* \/ [+ _, u# s8 w" H+ iif (Read_nSTATUS() == 0)
1 [ K& Q. c; A& [4 L{ // 检测nSTATUS,如果为"0",表明FPGA配置出错 0 m0 V* [7 M% |9 P9 ]
Err_LED(1);; s5 N/ d( U7 @' x4 i
return 0;
5 N2 s' L: ^ x, j. S# Q}
$ j* _ L! Z1 a. g1 TSet_DCLK(0);
1 o" _# J _" f, \( ^% j' O}: G n* P# b/ U f& u; D* u5 M
CountNum++;
* v9 Y8 m6 N" K, Y}
8 }7 \8 `: Q! Z* }* J' Z8 W
// FPGA初始化:3 d |" c. |) e1 @8 |& w
// ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期
0 }) C) l2 O; ~/ J, T7 Rfor(i=0; i<10; i++)6 [2 }: P! O5 a5 n Z
{ @4 W+ [ C' {- \) k
Set_DCLK(1);- |' }1 E7 U" S
DELAY100us();
8 v% _: k/ o' d, F& C& K. \Set_DCLK(0);4 @$ N0 M- H8 u$ i# ~
DELAY100us();
- s* w. E- `) h; ^/ a}5 U( B4 p/ @5 u
Set_Data0(0);! V+ [5 y/ I9 U2 r3 [
if (Read_nCONF_Done() == 0)+ J# m. u6 n9 l4 j. c- Q
{ // 检测nCONF_Done,如果为"0",表明FPGA配置未成功! y- ~7 S3 d+ ^; W
Err_LED(1);* G2 q) Q# F7 n# U% p
return 0;
+ f& f/ d9 q8 ~) f% | E) t5 l} Q& |6 z0 t/ p @" `& v8 x1 u
return 1; // 成功返回
0 Q! f6 {' _& B2 A/ |# s' L( H} // Data0输出. }$ g$ A* X0 ^
void Set_Data0(UBYTE setting)
) v0 w1 ?% |! @' K+ I) O. Y{ // PB245 p$ ?1 W2 x" _6 {
if (setting) IMMR->pip_pbdat |= 0x00000080;. U6 A- C* U6 r1 T
else IMMR->pio_pbdat &= 0xFFFFFF7F;) A* o) [0 k. v0 D
} // 读nSTATUS状态: U K) e! ]% P/ s: V6 j, }5 ?
UBYTE Read_nSTATUS(void)
! m0 S+ s4 _: ^9 T1 s" Q{ // PB25
" n& V8 S9 s; |' `2 h1 s! Z2 rif (IMMR->pio_pbdat & 0x00000040) return 1;6 L" L5 @, ^. p$ s1 Z2 \* `- L# U8 Y
else return 0;2 Z6 k1 v: c( f1 D9 r; O" W
} // 设置nCONFIG电平
( G. I4 c4 q0 S y5 qvoid Set_nCONFIG(UBYTE setting)
" T3 [. l% Y% h# `$ k{ // PB26
4 m; }5 c. C: X7 H/ R- N) hif (setting) IMMR->pip_pbdat |= 0x00000020;
1 G" p- t5 z9 selse IMMR->pio_pbdat &= 0xFFFFFFDF;
( w, c: Y1 t. M% P5 w5 Z- G} // 读nCONF_Done状态( k- q3 B! g1 g! ?, i* L# t* \
UBYTE Read_nCONF_Done(void)
+ r* k4 S2 ?6 w V" {9 \" v{ // PB27+ E/ M1 r }. ^
if (IMMR->pio_pbdat & 0x00000010) return 1;3 S1 h" N! W" Q3 e6 s8 R% D
else return 0;
& P) U; X, j4 Z' n7 W, O! i} // 输出DCLK
. q5 J6 A7 X- x" t6 T) ~void Set_DCLK(UBYTE setting)' y" k" L1 ]$ C. W8 Y
{ // PB28- Z# G+ K: |2 v; ~$ H' e' l3 j( \
if (setting) IMMR->pio_pbdat |= 0x00000008;
$ j3 [* w$ H& S/ N7 X4 R: B2 Ielse IMMR->pio_pbdat &= 0xFFFFFFF7;
2 r; S( d5 u; U& F' Z}
0 }& J- e; c) U// 结束 |