编程文件格式的转换 MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下: 1. 进入数据转换对话框 图1 进入数据转换对话框 2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释) 图2 选择相应的输出数据格式 在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。
5 t5 j, d7 R5 n$ }& i, K+ T! Y- ~CPU程序设计 9 S9 y& `# _! n! a2 I; E: F
以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。 本设计的CPU源程序 void InitPORT(void) { // 初始化PB口相应位:
' f' O6 d4 c$ p// PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出3 i, C$ f5 e) t9 W
IMMR->pip_pbpar=0x00000000;1 G6 j0 d( N2 A0 S# E9 z/ L4 c
IMMR->pip_pbdir=0xFFFFF5AF;
; C$ t; o; J' r q0 A- L& DIMMR->pip_pbodr=0x00000000;
0 |, e" y. E) x5 q0 {9 w/ uIMMR->pip_pbdat=0xffffff57;; ~5 l- @7 k: X6 h9 W- _
} UBYTE Fpga_DownLoad(void)
2 A" [8 q( Y! J5 a- R{ // FPGA配置
& y) |% q4 V+ _2 D2 B oUBYTE *Bootaddr;
, E" a) A: G U/ T! ^- Z5 M3 eUWORD CountNum=0x0;! s& N5 O8 U. ?5 n" R+ _
UBYTE FpgaBuffer, i; // 获得Boot区首地址
5 q9 v+ j8 X: w* L6 Y8 x2 T0 EBootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000); Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态3 z; }; i- @7 d! e ?: c( A
Set_DCLK(0);3 f: O7 F# u/ U) L: P
DELAY5us();4 X; X0 p4 ]5 u# E( ]
if (Read_nSTATUS() == 1)2 X3 }' e5 B* e: y% L0 M& n# _
{ // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错6 o; P0 D. E* G/ R
Err_LED(1);
/ ]! F8 {( e# Q- r0 Qreturn 0;4 G) c) l7 x! y* U. _1 ?
}
9 j" d& y1 _6 L/ ~! g( y( eSet_nCONFIG(1);
: O Q( T) [: Q+ o4 Z7 \( |DELAY5us(); % n& c2 Q8 N0 P0 }+ R
// 开始输出配置数据:3 d. r0 l% t/ R& [" i0 M
while(CountNum <= 0x0e74e)' d2 q" e' H* J5 Q6 m- n, L: W
{
7 d3 I' t6 Q9 R1 G+ |. ?" n1 K" jFpgaBuffer= *(Bootaddr+0x70000+CountNum);
3 _/ y1 a O4 `/ }+ }, k6 Ofor (i=0; i<8; i++)
( M1 U) m/ J5 g3 K8 t& v{ // DCLK="0"时,在Data0上放置数据(LSB first)
, c: g6 t6 j( ?- Z. j' O0 WSet_Data0(FpgaBuffer&0x01);$ _; C2 N6 C+ V# W( d
Set_DCLK(1); // DCLK->"1",使FPGA读入数据
+ {& N3 z8 `. j6 d( `FpgaBuffer >>= 1; // 准备下一位数据
/ p6 _3 o2 z- y8 n( \4 A2 Z6 Uif (Read_nSTATUS() == 0)4 T, D. [, @) L/ H9 [3 \
{ // 检测nSTATUS,如果为"0",表明FPGA配置出错 2 e o7 x6 a: \# ]% D7 M6 ~
Err_LED(1);
K& U e" n- ]3 j+ x2 t7 sreturn 0;
/ ]$ M, R. n; ~7 i+ _; V/ z}" q/ g, e: b b- z( q# t& _) d+ H
Set_DCLK(0);7 M b, h; d! v1 o0 V
}3 T; C/ w3 Z% j: G( B
CountNum++;! d( i4 v: J3 X! p. Q! N
}
3 V) Y7 h1 y2 o6 [$ @// FPGA初始化:
. V3 U) B- z; G; K( f0 G// ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期
( \! z% r$ A' ^for(i=0; i<10; i++)
\- _: ~+ k |6 d6 ~, _{0 R1 |: ?; \% G0 A' D
Set_DCLK(1);
* R% a8 ?; I8 E2 FDELAY100us();( j2 W$ d: ?4 h5 M6 ^* Z" Y" \
Set_DCLK(0);
% R% R1 b0 g- a9 Z: rDELAY100us();7 p. j) Q" {3 J* P9 `
}' J1 \# E" o8 B
Set_Data0(0);3 ~! z( ~$ d" y+ i: ?. r4 ^6 E6 w
if (Read_nCONF_Done() == 0)
2 A( F3 @" R0 B{ // 检测nCONF_Done,如果为"0",表明FPGA配置未成功+ Y3 {, @1 w% i0 u) `6 x
Err_LED(1);
( K% y9 e6 d8 \$ H% \7 O% ~/ E& o6 freturn 0;7 b% q- g! W% _. x& C% G$ s/ f
}5 u& v) s7 z$ ?; x* u6 p
return 1; // 成功返回, q3 f. Q; v! M2 {' z( H
}
// Data0输出
! r5 P( t$ J4 h8 zvoid Set_Data0(UBYTE setting)9 L' c) E9 G# k5 ~; z
{ // PB243 z% F# `( C! r! p
if (setting) IMMR->pip_pbdat |= 0x00000080;
4 e3 h% z+ Q- u ^else IMMR->pio_pbdat &= 0xFFFFFF7F;! r5 d6 H+ | `9 D2 ]& B) O
} // 读nSTATUS状态
" N( Q1 q- K. |) Q" `UBYTE Read_nSTATUS(void)6 `# R) P% M! D' ?8 S
{ // PB25' f/ h0 X! y) u( W
if (IMMR->pio_pbdat & 0x00000040) return 1;5 x5 A! c$ F4 h! D6 ?
else return 0;
$ d" R( f5 u+ a$ c) {( p) m} // 设置nCONFIG电平2 o' \, G6 B" }8 p" O, A8 f
void Set_nCONFIG(UBYTE setting)
9 a" ~8 B& |, x# A, Z9 R4 v; ?6 H{ // PB26
/ j8 v+ W: v, P( Jif (setting) IMMR->pip_pbdat |= 0x00000020;$ d# G. G% Y* ^" {
else IMMR->pio_pbdat &= 0xFFFFFFDF;
- ]8 c& ?- b+ G { u. q} // 读nCONF_Done状态2 v7 Y; p% {% F
UBYTE Read_nCONF_Done(void)" @( c5 `2 A* P# l& X% D
{ // PB27
\# n* D2 ~$ A: Dif (IMMR->pio_pbdat & 0x00000010) return 1;
: {+ u/ d+ P* I4 Y2 \# velse return 0;
* {8 g6 I" R+ L% V5 h# f& j} // 输出DCLK7 o) Y: c. A2 d1 a
void Set_DCLK(UBYTE setting)
; W5 R# E3 y& y/ R0 B{ // PB28; W% {8 x4 S' ^' ~/ {
if (setting) IMMR->pio_pbdat |= 0x00000008;' R2 Y+ g. p6 l% N4 g9 e5 j9 i5 \
else IMMR->pio_pbdat &= 0xFFFFFFF7;0 n/ {* [ e j) H/ U6 d* m3 t
}" n8 d8 Y3 r N% p0 y! a4 k, ^8 z% m
// 结束 |