|
编程文件格式的转换 MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下: 1. 进入数据转换对话框 图1 进入数据转换对话框 2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释) 图2 选择相应的输出数据格式 在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。 ! k8 M9 ~" o! ]- m# u( p
CPU程序设计 , Y! B) X% F# ?" G/ M3 _/ W
以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。 本设计的CPU源程序 void InitPORT(void) { // 初始化PB口相应位:
9 E1 c! v% G% c( k# y// PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出
" ~" R6 ]% C1 OIMMR->pip_pbpar=0x00000000;
# u j% K' p, f' u6 c, q# o9 ]IMMR->pip_pbdir=0xFFFFF5AF;( O5 \/ A% R2 c4 J2 \+ x0 }
IMMR->pip_pbodr=0x00000000;
j+ @3 z/ b: O$ H& F- eIMMR->pip_pbdat=0xffffff57;
* ^5 r; p% W8 X8 m- ?) A7 x} UBYTE Fpga_DownLoad(void)
4 W# v" x8 m* c) P/ z" E# V{ // FPGA配置5 N1 S* [9 V7 ?; ]5 o" e) i8 R
UBYTE *Bootaddr;' O* t, M8 ^& ]) F' x# h
UWORD CountNum=0x0;; D9 }; O! c4 _6 R. c
UBYTE FpgaBuffer, i; // 获得Boot区首地址( \$ s: d5 y* w8 X
Bootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000); Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态9 ~# m* g2 [6 O. D! `
Set_DCLK(0);* d- U7 M+ v2 h( Q+ b' p( f3 {
DELAY5us();! |$ }1 g+ `) e i0 K, p5 O
if (Read_nSTATUS() == 1)
3 q6 l3 e3 o' x2 _1 s8 `+ q1 n{ // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错
! A' Z3 ~1 E9 X6 ~Err_LED(1);8 q9 o, h$ n% z( [5 \/ @
return 0;
1 n+ |" R @' Q* n}% p1 }, `. {. c; f/ B
Set_nCONFIG(1);, Q ?$ \5 \7 X' r
DELAY5us();
- u! y! r5 l4 [" Q; M// 开始输出配置数据:
$ X5 o0 W4 @ O$ y1 G2 Bwhile(CountNum <= 0x0e74e)
- ?* p' O8 E2 k% n: o{
- s" u* V$ p9 r& ^) j- D4 fFpgaBuffer= *(Bootaddr+0x70000+CountNum);
b+ y# i; k$ P& f. X, j0 Qfor (i=0; i<8; i++)
+ V8 z% @4 E6 N4 X; X: B{ // DCLK="0"时,在Data0上放置数据(LSB first)0 H6 Y# p7 t3 B
Set_Data0(FpgaBuffer&0x01);) E0 c& k, _/ |) ]" z, H! J- j; W
Set_DCLK(1); // DCLK->"1",使FPGA读入数据
, j/ J9 e) |7 c, _/ D3 Y; P+ uFpgaBuffer >>= 1; // 准备下一位数据6 J, q/ b4 r+ J$ k7 a
if (Read_nSTATUS() == 0)
: b( K% X4 J# Z$ l5 ?/ ]# o6 r3 D{ // 检测nSTATUS,如果为"0",表明FPGA配置出错
5 C/ L+ u/ K0 |+ F! rErr_LED(1);
$ x; K, g: ^2 W# x. Vreturn 0;8 r& U |# \! c) O
}8 h# O# p6 W7 N: z6 M) L! b
Set_DCLK(0);& D; F+ R" j( ?& ~4 ]; S
}, \& Y, Z9 S0 \/ K4 w. U% m. e
CountNum++;
! u0 a* s& b( g/ |) W( ]}
: Q8 v4 X3 E/ {: D// FPGA初始化:
$ k0 o% g" h1 E: ]6 ` N// ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期1 H/ C! ?) s% ]# J5 l' E8 T
for(i=0; i<10; i++)
$ L, t) `4 F V' u9 Y3 w5 T2 B% K{4 H2 y* m1 w2 ?3 ]2 i
Set_DCLK(1);
' ~+ ^: Q. q; S9 iDELAY100us();( f, e1 L* a$ x, U
Set_DCLK(0); k7 s0 d) x% i1 \& a$ ?! z4 }
DELAY100us();( T; {0 y/ H2 w' c( C3 m# q4 `
}/ ^# w5 I9 }6 ^
Set_Data0(0);( z/ K' b) ^7 g' u& F \
if (Read_nCONF_Done() == 0)) U$ n Y% D6 F v
{ // 检测nCONF_Done,如果为"0",表明FPGA配置未成功* m' F' v( C8 Z7 J5 r3 ?
Err_LED(1);7 r' z7 D( X. `
return 0;
) @3 I" o. Z6 Y) V}6 {" o+ {2 |' [( l, @( i4 P
return 1; // 成功返回4 {# V* o' H+ |7 K5 N+ |3 K
}
// Data0输出9 s( w8 K8 [ S& z+ ?# n
void Set_Data0(UBYTE setting)
& R/ _9 |3 t( x0 E: v. G$ H7 b0 _{ // PB24
1 U8 ~/ Z; }( Iif (setting) IMMR->pip_pbdat |= 0x00000080;
# q& |1 U: i/ i }else IMMR->pio_pbdat &= 0xFFFFFF7F;
7 ~& w. k. U0 i, X V} // 读nSTATUS状态* Q, o4 p: i, E/ \( S! G6 s) d& F
UBYTE Read_nSTATUS(void)) D( E7 g2 A5 j4 b
{ // PB25 \* r6 s9 j/ k" _( S; N. d
if (IMMR->pio_pbdat & 0x00000040) return 1;
* Q3 d5 E1 Q9 lelse return 0;! ]! H1 e% {+ j4 {6 }, O
} // 设置nCONFIG电平2 L, g" f' ]& u! }
void Set_nCONFIG(UBYTE setting)
H( @% L8 p8 b/ ^+ d- g) b0 }% G{ // PB26
- O4 J, W7 L6 _: tif (setting) IMMR->pip_pbdat |= 0x00000020;
9 \' b- i; c$ t) l0 R/ `else IMMR->pio_pbdat &= 0xFFFFFFDF;
. ]( u* o3 T' N" v} // 读nCONF_Done状态& I/ M! ]+ K( _; W# A9 P% t- ]
UBYTE Read_nCONF_Done(void)" R/ F+ l2 ?+ f4 U
{ // PB27
4 k+ z6 s+ K* {1 jif (IMMR->pio_pbdat & 0x00000010) return 1;
' h( R1 Y6 b0 l' F9 xelse return 0;; E" A! s2 \, O
} // 输出DCLK4 I9 }/ E1 ], |' {
void Set_DCLK(UBYTE setting)
0 j$ l5 I4 b! I7 `% w) |{ // PB28 W" s6 K# c( r. c, n
if (setting) IMMR->pio_pbdat |= 0x00000008;0 N3 S- n) ]6 \( Y" T
else IMMR->pio_pbdat &= 0xFFFFFFF7;
+ i* _4 U3 K& u" Q% u9 k}6 h( B$ Z$ b) K( S( |% W0 j @/ M
// 结束 |