|
编程文件格式的转换 MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下: 1. 进入数据转换对话框 图1 进入数据转换对话框 2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释) 图2 选择相应的输出数据格式 在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。 * s4 Z! |) x3 N2 `( h( m
CPU程序设计
3 l1 U7 L6 E6 c以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。
本设计的CPU源程序 void InitPORT(void) { // 初始化PB口相应位:
- D3 T8 i/ x; {% {// PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出6 b( g: H q; | x
IMMR->pip_pbpar=0x00000000;
) D& M* k, z+ N# N' m, d6 TIMMR->pip_pbdir=0xFFFFF5AF;
; v, N$ C* W% c- s$ R2 hIMMR->pip_pbodr=0x00000000;
5 {8 d! U9 n0 FIMMR->pip_pbdat=0xffffff57;
: L8 \+ F1 V" I# |* T. c! c2 e} UBYTE Fpga_DownLoad(void)( g% C3 r8 o$ _8 ^2 ]( ]
{ // FPGA配置
/ }4 H) V/ S W1 x. \: A. C6 `UBYTE *Bootaddr;
, f4 e0 Z& T* b$ v/ L! g( bUWORD CountNum=0x0;$ k" j8 ], k' o, ]" h' N1 F, W4 {
UBYTE FpgaBuffer, i; // 获得Boot区首地址, t3 k) N4 `9 }8 u) }
Bootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000); Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态* r" Q' C0 Q9 G t7 I2 ]
Set_DCLK(0);! a: P* l' [# R' W
DELAY5us();
* Z' U6 Y( _1 u- Zif (Read_nSTATUS() == 1)
" f* V7 H2 n/ A{ // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错5 l' c' N% R2 h. Y5 o- r; D- y
Err_LED(1);
. J4 s4 q% q2 m% _' `" ?9 E/ ~return 0;( A: H0 P8 q5 l* a
}
- j- K& P3 p' j2 K% WSet_nCONFIG(1);% [1 s' `. v# R! v; k: S" e1 h' J
DELAY5us(); $ ~0 }4 R( g. {/ X# q2 L
// 开始输出配置数据:
% y6 J* u% m8 r B1 A3 H* fwhile(CountNum <= 0x0e74e)3 L/ {! z% F" X* u
{2 N/ k( M( s0 u; C$ B4 t
FpgaBuffer= *(Bootaddr+0x70000+CountNum);6 U5 ^$ @" t2 V/ M9 i- s; h
for (i=0; i<8; i++)
0 E, b" q$ K$ E/ G0 F; b Z{ // DCLK="0"时,在Data0上放置数据(LSB first)
# q4 O6 [2 h* i% i3 t: CSet_Data0(FpgaBuffer&0x01);! a' g7 R% s( ]4 h% I! J7 k
Set_DCLK(1); // DCLK->"1",使FPGA读入数据! W4 h$ Y5 ]! [1 s$ {
FpgaBuffer >>= 1; // 准备下一位数据
* @; ?7 @2 z+ M4 i( B' eif (Read_nSTATUS() == 0)
$ T9 ?: {- o) `& H4 y& W8 I{ // 检测nSTATUS,如果为"0",表明FPGA配置出错
& v* W, G! o/ z: ?$ mErr_LED(1);' t9 p N; x# b6 e5 c! X: Z
return 0;
# Q$ y" k* \, g}
' G' l* w* P$ u; p: r* ISet_DCLK(0);
. {6 L) f' v0 a7 [" ]+ q2 D7 z}. y6 g, G; z0 c6 j
CountNum++;7 q. Z$ t2 y! m! T" n% l' _+ A
}
) }) Y. ]2 W" M' i, X// FPGA初始化:- z% g) |; Z! X: `
// ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期
' i- Q% x" A- ~9 |+ u' B/ Vfor(i=0; i<10; i++)
! [& j. W$ t* i( ?4 I$ N{
1 ~) b) k8 A0 N+ qSet_DCLK(1);4 L7 c: K1 j2 V. n9 q
DELAY100us();
- g3 V( n0 Y, SSet_DCLK(0);( P% I& o+ L% E, C. |) @1 r
DELAY100us();" m1 B- r* i0 Y" q, m; ]" |; z' z
}* L( `! U) r7 y
Set_Data0(0);
! \9 d& X: }, R, M$ u! Rif (Read_nCONF_Done() == 0)7 m6 n4 w! v" Q7 ]( R& I% e. X! c* r A
{ // 检测nCONF_Done,如果为"0",表明FPGA配置未成功
0 {4 w/ ?3 `7 C% e3 K! RErr_LED(1);
, f6 E0 A' _4 r4 g" N# Ireturn 0;& h1 m0 h2 V5 L) I/ K Z, @
}, R `; Y3 X/ a9 E6 M' c$ c* E
return 1; // 成功返回
* J) |1 l0 j, z( T2 D}
// Data0输出
) e* h2 E7 Q0 m3 O" qvoid Set_Data0(UBYTE setting)' ]# [* S9 W) z1 f+ f
{ // PB24
0 ]7 B3 v% f! `' p' hif (setting) IMMR->pip_pbdat |= 0x00000080;
+ ~4 G8 p. h. u2 ~0 welse IMMR->pio_pbdat &= 0xFFFFFF7F;
. _& [. H6 P- W( {. W} // 读nSTATUS状态2 D) P( S8 T- Z5 w/ ]+ ^
UBYTE Read_nSTATUS(void)2 C6 u9 {: z% T$ i( x3 K
{ // PB257 H7 a* k: j& T. A8 y' @1 g" g
if (IMMR->pio_pbdat & 0x00000040) return 1;
2 e. Y, J2 Z" G" Z! Y3 w: ]" Aelse return 0;
\2 y9 v! m& u: D) |} // 设置nCONFIG电平* b! R. r0 T% S# c
void Set_nCONFIG(UBYTE setting)
/ P d1 A3 L! z0 O- P. w2 H{ // PB26
/ d$ T, G2 b! T" dif (setting) IMMR->pip_pbdat |= 0x00000020;# m( J- `8 L: E8 s% g# |$ S: b8 O
else IMMR->pio_pbdat &= 0xFFFFFFDF;
/ H8 d1 W7 {/ Z8 A6 j} // 读nCONF_Done状态
; F/ v6 g2 \; \UBYTE Read_nCONF_Done(void)
) m5 ?( B7 M# G{ // PB27
% K9 g! j9 o7 @' Z6 L: Oif (IMMR->pio_pbdat & 0x00000010) return 1;
/ a! p6 m( h& d$ z8 O; Delse return 0;
* @" Q/ F$ N4 |/ t+ B" F. l4 |9 P} // 输出DCLK/ F' l* [! D# W$ {9 V+ i
void Set_DCLK(UBYTE setting)
' W0 r' d7 q+ y; ]{ // PB28+ h: C+ }& h+ f1 O
if (setting) IMMR->pio_pbdat |= 0x00000008;
2 u, Q1 |+ I! v% m# L N5 r/ |else IMMR->pio_pbdat &= 0xFFFFFFF7;9 C4 S# H% O1 f. C& l0 c5 U
}; j" { i$ J: B: S
// 结束 |