altera CPLD通过nios在线升级

一,生成hex文件

逻辑工程的qsys编译好以后会生成sopcinfo文件,software里面首先generate bsp,然后编译software,编译完成后右键software->make targets build,选择mem_init_generate->build,然后就会生成hex文件
在这里插入图片描述

二,生成sof文件

重新编译整个逻辑工程,或者如果逻辑工程已经编译过了,仅仅更新nios,为了节省时间可以采用如下步骤:
1,在quartus里面processing->update memory initialization file
2,processing->start->start assemble
就能生成sof文件了

三,生成升级所用的bin文件

此处需要.sh文件,放到software目录下,内容为:

echo Generate application binary file.

sof2flash --input=".\..\..\qii\output_files\power.sof" --output="hw.flash"  --epcs --verbose
objcopy -I srec -O binary hw.flash hw.bin 
#bin2flash --input="hw.bin" --output="NiosEMIF.flash" --location=0x100000 
bin2flash --input="hw.bin" --output="NiosEMIF.flash" --location=0x0
 
#sof2flash --input="..\..\prj\output_files\NiosEMIF.sof" --output="NiosEMIF.flash"  --epcs --verbose



rm hw.flash

然后跟生成hex一样调用一下这个脚本,生成bin文件
在这里插入图片描述

四,通过上位机实现flash写入

升级代码如下:

void setImg(UpDateBag *UpDateData)
{
	if( 1 )		//
	{
		soflength = UpDateData->length;

		// reset
		if(UpDateData->faddr == 0)
		{
			bufpoint   = 0;
			sofOffset  = 0;
			erase_cnt  = 0;
			erase_size = 0;

			if (epcs_flash == NULL)
				epcs_flash = alt_flash_open_dev(EPCS_FLASH_CONTROLLER_0_NAME);
		}

		dataBuffer = UpDateData->data;
		bufpoint  = bufpoint + UpDateData->flen;

		if (UpDateData->flen > erase_size)
		{

			alt_erase_flash_block(epcs_flash, erase_cnt*FLASH_BLOCK_SIZE + APP1_IMAGE_BASE, FLASH_BLOCK_SIZE);
			erase_size += FLASH_BLOCK_SIZE; erase_cnt++;
		}

		if ((bufpoint + sofOffset) >= soflength)
		{
			if(epcs_flash)
				alt_write_flash_block(epcs_flash, APP1_IMAGE_BASE+sofOffset/FLASH_BLOCK_SIZE*FLASH_BLOCK_SIZE, APP1_IMAGE_BASE+sofOffset, dataBuffer, bufpoint);

			erase_size -= bufpoint;
			sofOffset  += bufpoint;
			bufpoint    = 0;
		}
		else
		{
			if(bufpoint == 1024)
			{
				if(epcs_flash)
					alt_write_flash_block(epcs_flash, APP1_IMAGE_BASE+sofOffset/FLASH_BLOCK_SIZE*FLASH_BLOCK_SIZE, APP1_IMAGE_BASE+sofOffset, dataBuffer, bufpoint);
				erase_size -= bufpoint;
				sofOffset  += bufpoint;
				bufpoint    = 0;
			}
		}
	}

	if(sofOffset == soflength )
	{
		replyCmdBuf[PACKET_HEAD_LEN>>2] = LVDS_CMD_OK;
		ReplyMessage(4);

		usleep(20000);

		#ifdef BOOT_MODE
			rsu_factory_trigger_reconfig(RSU_CYCLONE4_0_BASE, (APP_IMAGE_BASE)>>2, 0x00);
		#else
			rsu_app_trigger_reconfig(RSU_CYCLONE4_0_BASE);
		#endif
	}

//	if(sofOffset == soflength )
//	{
//		replyCmdBuf[PACKET_HEAD_LEN>>2] = LVDS_CMD_OK;
//		ReplyMessage(4);
//
//		usleep(20000);
//
		IOWR(REMOTE_UPDATE_0_BASE, 0x4, 1);
//
//		//Trigger reconfiguration
//		IOWR(REMOTE_UPDATE_0_BASE, 0x6, 1);
//	}
}

与之对应的升级模块为qsys里面添加 epcs_flash_controller,flash对应的几个引脚有的片子要求连上,有的片子不用连(只能是那几个引脚)
在这里插入图片描述

需要注意的是代码写入成功后的跳转模块,有的片子需要用rsu_cyslcone4模块跳转,有的需要用remote update模块实现跳转。

五,制作boot程序

boot升级那块跟应用程序一样,只不过main函数刚跑起来多一个app跳转功能,代码如下

void SwitchToApp(void)
{
	rsu_factory_get_previous_reconfig_status(RSU_CYCLONE4_0_BASE,&condition_1,&condition_2,&boot_address_1,&boot_address_2);

	if(condition_1 <= 1)
	{
		rsu_factory_trigger_reconfig(
				RSU_CYCLONE4_0_BASE,//REMOTE_UPDATE_CONTROLLER_BASE,					//	alt_u32 rsu_base,
				(APP_IMAGE_BASE)>>2,//( HW_APP1_IMAGE_BASE + HEADER_LENGTH ) >> 2,	//	alt_u32 boot_address_value,		// MSB 22-bits of 24-bit address
				0x00//hw1_header_g.res_wd_tmo							//	alt_u32 watch_dog_value			// MSB 12-bits of 29-bit timeout count
		);
	}
}

固化boot程序需要做jic文件,就是在生成sof以后通过 quartus->file->convert programming files
在这里插入图片描述

做好jic文件以后通过bluster烧录固化进去

六 没有nios只有逻辑的情况下的jic

生成sof以后方式跟上面一样,只是没把hex加进sof而已。没有nios的情况如何远程升级我还没学会,学会再加。
展示一下两个sof做到同一个jic里
在这里插入图片描述

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在实际工程应用中,我们时常会遇到为解决某个老产品的BUG,需要在工程现场更新设备的FPGA代码,或者参加电信测试时需要现场升级设备FPGA程序以便于调试。公司现阶段所用的Altera FPGA程序代码一般存放于芯片配套的FLASH存储器中,而常见的对印制板上FLASH编程有几种方法,原始的方法是使用编程器,这种方法需要要将芯片取下,十分不便,或者通过JTAG接口连接到PC机上,但需要专用下载软件(一般由芯片生产厂商提供)。在测试现场或调测机房现场,要找到FPGA的专用下载线是比较困难的,且Altera FPGA的专用下载软件并不是每个PC设备上都有的。有时仅为了更新一个FPGA的程序就需要研发或客服人员亲自到现场去烧写程序,这既不便捷,也使得设备维护成本大大增加。  经过可行性与成本的考虑,我们找到一种既方便实用又低成本的方法来实现FPGA程序的在线升级。即在MCU中(单片机或ARM均可)用软件来模拟XModem协议,将程序文件传输到FPGA的FLASH中。这种方法使用WINDOWS自带的超级终端软件来传送文件,无需安装专用软件,硬件支持仅需要一根通用串口线,只要在目标板MCU上增加一段实现XModem协议传输的代码,就可以方便的实现FPGA程序下载了。这种特点不仅方便了客服人员,也给研发和生产人员在现场调试和软件升级、修改中带来极大方便。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值