Board logo

标题: 用CPU配置FPGA(三)软件操作 [打印本页]

作者: bjxiong    时间: 2006-11-23 10:31     标题: 用CPU配置FPGA(三)软件操作

共分为四部分,我把链接都写上,方便大家

【连载】用CPU配置FPGA(一)概 述

地址:http://bbs.chinaecnet.com/ecbbs/post.asp?action=edit&BoardID=9&replyID=113949&ID=26969&star=1

【连载】用CPU配置FPGA(二)硬件设计

 地址:http://bbs.chinaecnet.com/ecbbs/dispbbs.asp?boardID=9&ID=26971&page=1

【连载】用CPU配置FPGA(三)软件操作

  地址:http://bbs.chinaecnet.com/ecbbs/dispbbs.asp?boardID=9&ID=27075&page=1

【连载】用CPU配置FPGA (四) 应用实例

  地址:http://bbs.chinaecnet.com/ecbbs/dispbbs.asp?boardID=9&ID=27077&page=1

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

编程文件格式的转换

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

1. 进入数据转换对话框

2mG0Zu1r.jpg


                        图1 进入数据转换对话框

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

 

RWgnmPVk.jpg

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

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

 

[此贴子已经被作者于2006-11-23 11:55:01编辑过]



图片附件: [用CPU配置FPGA(三)软件操作] 2mG0Zu1r.jpg (2006-11-23 10:30, 27.45 KB) / 下载次数 339
http://bbs.eccn.com/attachment.php?aid=321&k=4e3faae62f31069786344fc83466ee88&t=1727561770&sid=sZyD61



图片附件: [用CPU配置FPGA(三)软件操作] RWgnmPVk.jpg (2006-11-23 10:31, 27.41 KB) / 下载次数 311
http://bbs.eccn.com/attachment.php?aid=322&k=7a846b09b60b702f4e4d5de33902a522&t=1727561770&sid=sZyD61


作者: bjxiong    时间: 2006-11-23 10:32

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;
}
// 结束


作者: kzw    时间: 2006-11-23 10:40

恩,好帖子,用cpu配fpga确实是个好办法。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0