|
编程文件格式的转换 MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下: 1. 进入数据转换对话框 图1 进入数据转换对话框 2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释) 图2 选择相应的输出数据格式 在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。 V8 C2 e- }! Q
CPU程序设计
@2 Y7 ?. P9 [ f- Z以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。
本设计的CPU源程序 void InitPORT(void) { // 初始化PB口相应位:7 E' x2 r G* j- l
// PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出
! }4 T3 m( y2 k2 d' v% R' S# J, \IMMR->pip_pbpar=0x00000000;, I& A5 |+ l- y' e7 k: c7 I0 S
IMMR->pip_pbdir=0xFFFFF5AF;/ R* o" Z4 ]6 G% x, P, k K0 k1 z
IMMR->pip_pbodr=0x00000000;
( N6 ]- M8 h5 I/ h Q! L9 S' uIMMR->pip_pbdat=0xffffff57;
( b& O0 H* k7 T" m- }} UBYTE Fpga_DownLoad(void)9 y3 `2 W0 p+ \- j& t! x! G3 v) `
{ // FPGA配置
) s) B& P W UUBYTE *Bootaddr;
1 k/ s d# ^, IUWORD CountNum=0x0;
7 }4 K6 w, S0 TUBYTE FpgaBuffer, i; // 获得Boot区首地址& f7 d0 V5 |$ Y! D. ~( x" h; G
Bootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000); Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态5 @6 O# @6 u- f6 v) U2 j4 y$ E
Set_DCLK(0);
, H1 _2 ` a- z$ _; |& BDELAY5us();* l' \9 I4 \7 ~2 t, ~) w
if (Read_nSTATUS() == 1)9 `3 r7 U+ H7 r/ s" f9 a
{ // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错
% y) c1 l, w1 L- ~5 zErr_LED(1);
5 K6 j& R, X0 ^- m2 E" T) B: w* x+ Dreturn 0;
1 \% X, P. }6 S# p' t}
, z2 K5 ~2 P5 m z: b" i+ FSet_nCONFIG(1);
; y' d G% {* [8 tDELAY5us(); + B' ~7 L) `$ v# {9 H9 \
// 开始输出配置数据:
: W# t6 W! b4 Gwhile(CountNum <= 0x0e74e)
' g0 M' b& O, M+ Y F( J. [{
, |. _# J8 e$ x0 I/ o5 O5 p) e; @FpgaBuffer= *(Bootaddr+0x70000+CountNum);3 n6 r' R3 g$ |6 @
for (i=0; i<8; i++)
( @+ K' A5 n( E{ // DCLK="0"时,在Data0上放置数据(LSB first)& N9 b( R% X+ A3 A# N8 i- @
Set_Data0(FpgaBuffer&0x01);! J. v& }# R- \4 I( U6 y2 T# o, @% D' I
Set_DCLK(1); // DCLK->"1",使FPGA读入数据
. W, l1 V- p0 ?: ]2 L! _; eFpgaBuffer >>= 1; // 准备下一位数据
5 r$ M; ^2 |. ^if (Read_nSTATUS() == 0)9 O5 t+ f/ A, d$ e4 P" q3 Y8 Q9 C1 L. _
{ // 检测nSTATUS,如果为"0",表明FPGA配置出错 " y* r4 |* ^6 D E/ p
Err_LED(1);! Z9 H5 Q1 H- ^! h4 J
return 0;2 B1 A7 E A' a
}
4 @+ H; R8 ?! H" Q: GSet_DCLK(0);
; J- g# Y' R* {; U8 ~- G# {}
# U! D7 o) U+ j% A8 f `' q WCountNum++;
D6 Y# _1 ^1 ? ]/ U) j7 u4 r, Q} 8 c6 P5 z- t, i+ t1 f$ G" `
// FPGA初始化:+ F% B& X$ h$ I5 {/ E
// ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期1 W' E" Z* {. h3 b
for(i=0; i<10; i++)& j5 X! m. L: ]4 h
{4 {2 g8 I0 s9 V- |9 T. z: l
Set_DCLK(1);
4 z" [, K r8 N% l5 |0 ] QDELAY100us();2 j! q+ l. H2 k
Set_DCLK(0);
( M! \( r' V6 ADELAY100us();( Q9 G7 P$ R( w9 H- z
}) G# A" Z0 V+ T. e: V6 \
Set_Data0(0);) b$ y) s q: M5 k' v/ ] x
if (Read_nCONF_Done() == 0). _5 P$ x/ S0 y0 [ K/ v$ I
{ // 检测nCONF_Done,如果为"0",表明FPGA配置未成功
|2 m0 b2 B5 C2 rErr_LED(1);
* T( K! c* F8 Areturn 0;$ ?& b2 m; y/ P' T
}
/ H+ n+ q, O# H8 \* H. p! q% E) ireturn 1; // 成功返回
: v$ ^ P) y4 p8 `; w5 i$ m5 M} // Data0输出
2 @/ P9 V: p- |% zvoid Set_Data0(UBYTE setting)# @, @7 R( C5 K$ R
{ // PB24* }$ t$ f% w- P; E+ _0 G6 @
if (setting) IMMR->pip_pbdat |= 0x00000080;3 b1 t4 z. B8 J5 a
else IMMR->pio_pbdat &= 0xFFFFFF7F;2 L" `* n( H- _2 f
} // 读nSTATUS状态
- M) m( k; x3 h1 n, Y# vUBYTE Read_nSTATUS(void)+ V+ p' ^# i! v# i5 m
{ // PB25
' Y$ h: B; [1 M4 w6 `if (IMMR->pio_pbdat & 0x00000040) return 1;
4 M# I- Y: [' a: N9 S Y6 Kelse return 0;
8 O" o( E) o: ^: u$ S1 E9 [} // 设置nCONFIG电平- K4 q4 u5 c/ N2 Y. l" C i
void Set_nCONFIG(UBYTE setting)
' \; S; \1 v% x8 _ \" s3 r{ // PB26
0 o3 Y0 [! l8 I* n( c) h/ d! ^; P7 Bif (setting) IMMR->pip_pbdat |= 0x00000020;
8 u0 e) c* _ V4 celse IMMR->pio_pbdat &= 0xFFFFFFDF;
8 N7 C2 u# y0 }} // 读nCONF_Done状态& P1 ?1 X& G1 r+ K
UBYTE Read_nCONF_Done(void)
) g* ^3 o2 A! Z{ // PB27; ?) w2 i& v) f0 p9 j7 P8 S' w
if (IMMR->pio_pbdat & 0x00000010) return 1;* S% l8 Y& {7 e( b6 i" ^& y1 j
else return 0;( ^$ l; Z3 m' c" h% q# u; I
} // 输出DCLK
) G+ K- V. o! B3 v5 Y3 ovoid Set_DCLK(UBYTE setting)
! }( u. g6 X* S" Q8 m) q{ // PB28
7 x- e) T' x% D/ M. E1 V. Uif (setting) IMMR->pio_pbdat |= 0x00000008;
, T; r, a- _/ h9 X6 ]8 G5 V( [: k; Telse IMMR->pio_pbdat &= 0xFFFFFFF7;
4 U1 Z6 d$ f7 D* _$ t7 W}) D: Q' W" x7 T5 T- ^ \" [
// 结束 |