用CPU配置FPGA(三)软件操作
2013-03-05
标签:

编程文件格式的转换

MAX+plusII或QuartusII生成的SOF或POF文件不能直接用于CPU配置FPGA中,需要进行数据转换才能得到软件可用的配置数据。在MaxplusII中的具体步骤如下:

1. 进入数据转换对话框

图1 进入数据转换对话框

2.选择需要转换的SOF文件,对于配置多个FPGA的场合,应选择所有的SOF文件并排好次序。输出文件的格式我们选则二进制的rbf(Sequential)。 (也可以选择其他格式,如HEX等,在CPU软件编写上会与本文例子略有区别,关于不同文件格式的区别,在altera的AN116号文档上有详细解释)

图2 选择相应的输出数据格式

在QuartusII软件的file菜单下,同样可以找到类似菜单进行格式转化。

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;

}

// 结束

可能会用到的工具/仪表
相关文章
推荐文章
热门文章
章节目录
本站简介 | 意见建议 | 免责声明 | 版权声明 | 联系我们
CopyRight@2024-2039 嵌入式资源网
蜀ICP备2021025729号