CPU程序设计 以MPC860为例,我们可以将转换完成的RBF文件作为二进制文件,直接写到MPC860系统的某一ROM/Flash区域。由于这段数据的起始地址和长度都是已知的,相应的软件编写是很方便的。
本设计的CPU源程序 void InitPORT(void) { // 初始化PB口相应位: // PB24-输出,PB25-输入,PB26-输出,PB27-输入,PB28-输出 IMMR->pip_pbpar=0x00000000; IMMR->pip_pbdir=0xFFFFF5AF; IMMR->pip_pbodr=0x00000000; IMMR->pip_pbdat=0xffffff57; } UBYTE Fpga_DownLoad(void) { // FPGA配置 UBYTE *Bootaddr; UWORD CountNum=0x0; UBYTE FpgaBuffer, i; // 获得Boot区首地址 Bootaddr=(UBYTE *)(IMMR->memc_or0 & IMMR->memc_br0 & 0xFFFF8000); Set_nCONFIG(0); // nCONFIG="0",使FPGA进入配置状态 Set_DCLK(0); DELAY5us(); if (Read_nSTATUS() == 1) { // 检测nSTATUS,如果为"0",表明FPGA已响应配置要求,可开始进行配置。否则报错 Err_LED(1); return 0; } Set_nCONFIG(1); DELAY5us(); // 开始输出配置数据: while(CountNum <= 0x0e74e) { FpgaBuffer= *(Bootaddr+0x70000+CountNum); for (i=0; i<8; i++) { // DCLK="0"时,在Data0上放置数据(LSB first) Set_Data0(FpgaBuffer&0x01); Set_DCLK(1); // DCLK->"1",使FPGA读入数据 FpgaBuffer >>= 1; // 准备下一位数据 if (Read_nSTATUS() == 0) { // 检测nSTATUS,如果为"0",表明FPGA配置出错 Err_LED(1); return 0; } Set_DCLK(0); } CountNum++; }
// FPGA初始化: // ACEX 1K和FLEX 10KE需要10个周期,APEX 20K需要40个周期 for(i=0; i<10; i++) { Set_DCLK(1); DELAY100us(); Set_DCLK(0); DELAY100us(); } Set_Data0(0); if (Read_nCONF_Done() == 0) { // 检测nCONF_Done,如果为"0",表明FPGA配置未成功 Err_LED(1); return 0; } return 1; // 成功返回 }
// Data0输出 void Set_Data0(UBYTE setting) { // PB24 if (setting) IMMR->pip_pbdat |= 0x00000080; else IMMR->pio_pbdat &= 0xFFFFFF7F; } // 读nSTATUS状态 UBYTE Read_nSTATUS(void) { // PB25 if (IMMR->pio_pbdat & 0x00000040) return 1; else return 0; } // 设置nCONFIG电平 void Set_nCONFIG(UBYTE setting) { // PB26 if (setting) IMMR->pip_pbdat |= 0x00000020; else IMMR->pio_pbdat &= 0xFFFFFFDF; } // 读nCONF_Done状态 UBYTE Read_nCONF_Done(void) { // PB27 if (IMMR->pio_pbdat & 0x00000010) return 1; else return 0; } // 输出DCLK void Set_DCLK(UBYTE setting) { // PB28 if (setting) IMMR->pio_pbdat |= 0x00000008; else IMMR->pio_pbdat &= 0xFFFFFFF7; } // 结束 |