|
编程文件格式的转换 MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下: 1. 进入数据转换对话框 图1 进入数据转换对话框 2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释) 图2 选择相应的输出数据格式 在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。 $ K7 @* @+ b( z1 i# _; H/ S% v
CPU程序设计
( p% O* Y3 V c8 n1 c! i以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。
本设计的CPU源程序 void InitPORT(void) { // 初始化PB口相应位:7 t: a/ }8 R/ R8 w$ u( S
// PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出, B, l5 l' F2 r
IMMR->pip_pbpar=0x00000000;, L5 h6 D0 V! A( v
IMMR->pip_pbdir=0xFFFFF5AF;
1 j/ t) V" f% E5 Z' r$ V& zIMMR->pip_pbodr=0x00000000;; R+ q8 e; L4 r7 m6 S: }
IMMR->pip_pbdat=0xffffff57;! t8 }; q6 w- W" ?' Y# h
} UBYTE Fpga_DownLoad(void)( @* G$ z4 N6 O J, i7 e
{ // FPGA配置
; I; h+ |, k7 d3 z; m8 bUBYTE *Bootaddr;
7 V: Z c3 ^2 D( F$ ~" I0 ~UWORD CountNum=0x0;" W5 P4 F1 l$ X1 z- @+ ~
UBYTE FpgaBuffer, i; // 获得Boot区首地址 ?# |1 I$ A$ @2 [3 D. l$ U1 o
Bootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000); Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态
/ X3 ^0 v! i, fSet_DCLK(0);
% V$ [7 I# h9 @1 fDELAY5us();
6 }3 Z7 n; T" B4 ?/ Y' i2 Cif (Read_nSTATUS() == 1)+ Q" n+ [: M9 `' k6 I
{ // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错
7 G8 a! v6 A: V& q8 o; AErr_LED(1);
" ^- t0 d/ z. o8 ~3 @ b( _return 0;3 q. h {! {' Q3 b, P+ x w9 n! {
}% E6 z9 |/ e: l3 ?$ R; U
Set_nCONFIG(1);
' ^" @- y# r; w. EDELAY5us();
7 R8 H# w0 ^8 j# e/ g0 {7 t// 开始输出配置数据:
4 n5 H0 M6 ^7 Z, K0 }) @- i9 bwhile(CountNum <= 0x0e74e)- a3 I& v% J1 p8 x- G2 c3 v* d
{8 }- M* b$ \! [
FpgaBuffer= *(Bootaddr+0x70000+CountNum);
$ o& K, E! G( j, r4 K' bfor (i=0; i<8; i++)- x- `) N& r! r: Z, n( ?
{ // DCLK="0"时,在Data0上放置数据(LSB first)
! W. b `) |. q9 u. o+ [Set_Data0(FpgaBuffer&0x01);
# R4 ?* V. v4 b6 X5 lSet_DCLK(1); // DCLK->"1",使FPGA读入数据
+ i/ T) M" s4 m4 y; |( tFpgaBuffer >>= 1; // 准备下一位数据
, \- g9 c+ z( T' Lif (Read_nSTATUS() == 0): z+ j ?2 i( Z3 g8 _4 ]$ ?' n* w
{ // 检测nSTATUS,如果为"0",表明FPGA配置出错
[" q% b) d; {7 @' x4 ?Err_LED(1);
+ G' Q9 l, X% wreturn 0;
$ P5 ~# w3 G+ M" d3 p}
: M ?* q/ L8 G7 i# JSet_DCLK(0);# u$ k8 G0 o" L/ v! Q# U( a. A
}* l3 |& w7 c% `3 P
CountNum++;# B- g) h( ?% v$ S
}
$ i" R1 Q) K# G// FPGA初始化:; I5 T$ Y) q1 {7 {% F% F( ~+ A' L- ~
// ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期5 y' g/ i) \& Z& x7 ^+ ~
for(i=0; i<10; i++)
! M) s5 s5 v2 B! F{+ P( F9 Z5 u# f; X0 O( h6 K! O! ^
Set_DCLK(1);- `' z% F9 D% j O, ~1 n/ Q
DELAY100us();% a: C+ H1 u( O: J; A q0 y
Set_DCLK(0);
6 ^0 [6 [: P+ a/ H W7 A9 gDELAY100us();
+ W5 y4 a. B/ k" [+ J0 l}
6 V4 R# i) T* Q0 o6 i& DSet_Data0(0);
! T% G! w* w7 S+ wif (Read_nCONF_Done() == 0) ]- ?. q% w7 S$ o3 w) n( A( F
{ // 检测nCONF_Done,如果为"0",表明FPGA配置未成功
2 V i4 u5 K+ PErr_LED(1);
w3 M5 Y, X. O& g5 f1 G2 a5 @7 ^$ wreturn 0;
$ @/ C) S% b' h$ J+ R}
8 [( g0 u% `1 ?( |return 1; // 成功返回4 R4 h! ^6 r5 [% S* V- C; F( d+ f
}
// Data0输出
7 ?" ]1 O( D$ O* m: F$ yvoid Set_Data0(UBYTE setting); E5 S( r# T- z4 H$ e5 z% X
{ // PB24
9 t7 k- l! {; n% j) [- o, S- _7 cif (setting) IMMR->pip_pbdat |= 0x00000080;
7 t6 V" N; _, h0 t: R/ Delse IMMR->pio_pbdat &= 0xFFFFFF7F;' V: _0 h& j% s4 D* C c0 f+ }
} // 读nSTATUS状态
0 ?/ k1 Z/ s' c7 ? p5 oUBYTE Read_nSTATUS(void)$ Q. Q* g6 f/ C% `9 g% q* Y5 B
{ // PB25. f3 r/ H" g7 e* Y+ a# t+ P, E, }# u
if (IMMR->pio_pbdat & 0x00000040) return 1;
. g" C; @3 ]. `, n' `4 jelse return 0;* h: t; T$ N- @6 \
} // 设置nCONFIG电平
. c; K/ C6 H1 F0 svoid Set_nCONFIG(UBYTE setting)1 l9 S% q" ^# N! ^, V6 I
{ // PB261 w2 X1 g* n- c) w% o$ d O
if (setting) IMMR->pip_pbdat |= 0x00000020; y$ _9 @- D" d0 N& V
else IMMR->pio_pbdat &= 0xFFFFFFDF;2 k% a4 t. T% _
} // 读nCONF_Done状态+ [1 [1 Y6 p7 M8 n" ~7 ~. d u" m
UBYTE Read_nCONF_Done(void)
v0 X7 q2 H% V4 V) m% w{ // PB27
3 D; w W: ]; `: xif (IMMR->pio_pbdat & 0x00000010) return 1;- `" X0 I/ t, Z
else return 0;
+ o! U; \& \/ t" Y# }8 J} // 输出DCLK
r! _" x/ l6 c+ t. g' Rvoid Set_DCLK(UBYTE setting)
( E2 P' X1 S+ X0 i4 w; D/ w3 i{ // PB28( A4 T x$ R7 B t. R% Z" Q& @- q! p
if (setting) IMMR->pio_pbdat |= 0x00000008;
8 Y# k7 [( U& g3 F9 ]else IMMR->pio_pbdat &= 0xFFFFFFF7;7 F# K: J) {: ~! D
}
9 h( T- G" |) \4 v; p+ G// 结束 |