千兆网动态配置FPGA小结(1)
最近实验室的师兄分配了我一个任务,用千兆网配置FPGA。研究动态配置FPGA,我的研究对象为altera 系列FPGA,首先我们得了解下 quartus生成各种配置文件的特点:
sof是SRAM Object File,下载到FPGA中,断电丢失。 pof是Programmer Object File,下载到配置芯片中,上的重新配置FPGA。 rbf文件为紧密二进制文件,大小比sof和pof的大小小很多,因为这种文件是不含comma的下载文件,可以用来配置文件,我的第一版程序就是用这种文件生成的,但是这种文件读取之后与epcs中的数据是反向的 例如 文件中有个数据为0x48而从epcs中读取的数据为0x12. hex文件,altera所生成的hex文件是满足intel hex 格式的,所以在第二版程序我希望能把quartus和nios程序同时下载到epcs中时我所用的就是这种格式的文件,具体格式百度百科hex就能得到答案。这块程序我也没有做只是从网上随意找了个hex>bin的程序搞定的。 其实做这个程序我也参考了许多网上的资料,本来自己也没什么写东西的情况,但是看到有篇博文上面写的如果不写对自己就是一点点小小积累,但是对于别人来说有可能是比较大的帮助,所以我在这里也只是分享下我自己的经验,防止后来人也走同样的弯路吧。 下面我们看看操作EPCS的例子: 下面是适合我工程的epcs的操作流程 #include <stdio.h>#include <unistd.h> #include "system.h" #include "alt_types.h" #include "sys/alt_flash.h" #include "sys/alt_flash_dev.h" #include "sys/alt_sys_init.h" { #include "altera_avalon_epcs_flash_controller.h"//注1 } alt_u8 epcsbuf[32]; int ret_code; alt_flash_fd* my_epcs;//定义句柄 main() { alt_sys_init();//注2 my_epcs = alt_flash_open_dev("/dev/epcs_controller");//打开FLASH器件,获取句柄 ? ? ret_code = alt_epcs_flash_get_info (my_epcs,®ions,&number_of_regions);//获取配置芯片信息? ? if(my_epcs) //信息获取成功 ? ? { ? ? //example application,read general data from epcs address 0x70000 ? ? ? ? ret_code = alt_epcs_flash_erase_block(my_epcs,regions->offset+0x70000);//擦除第8块 ret_code = alt_epcs_flash_write(my_epcs,regions->offset+0x70000,epcsbuf,32); //写32字节//注3 ? ? ? ? ret_code = alt_epcs_flash_read(my_epcs,32); //读32字节 ? ? } ? ? while(1) ? ? { ? ? } } 注1:我的工程是用C++作为开发语言的所以如果当我包含altera_avalon_epcs_flash_controller.h这个文件的时候总是出现那几个flash操作函数没有包含的错误,主要的原因是altera_avalon_epcs_flash_controller.h在这个头文件里的函数用到了C语言里面的结构体,但是C++不支持这种数据结构,解决方法就是在生命的地方加入extern “C”但是那个是系统的库不好意思直接改人家头文件 所以我就在包含的时候直接加个extern就很轻松的解决了 注2:不知道大家出现过这样的情况没有在nios调试的时候总是第一次无法打开epcs器件,然后第二次就什么问题都没有了,我去baidu google了半天也没有解决,最后我搜初始化的时候无意间在头文件的时候看到了有这样一个文件alt_sys_init.h里面有对epcs器件进行初始化的函数,我就抱着试试看得心态在我的工程加入了这个函数 结果确实蛮不错。 注3:在对epcs进行写操作的时候 难免要用这个函数,这个函数要强调的是不论第三个变量的意义是表明向epcs中写入的字节数与第二个参数的类型无关 当时我想用32位的数组宽度来写epcs没注意到这个问题耽误了不少时间,而且对EPCS操作虽然?regions->offset+0x70000可以随便设定,但是由于epcs操作是按一片一片操作的,所以当你对于一片的数据操作,这个片没操作的地方都会变成0xff。最后我选择的是用个65536字节的数组来对epcs操作(囧),需要额外说的对于不是8位的数组来说,低位存在低地址高位存在高地址 ,估计大家都知道~~~ ok 这次 我的第一篇小帖子就到这里了~~~如有疑问请联系我 qq510808284;lsw_hehe@qq.com (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |