打印

NIOS II 软核中EPCS配置芯片的存储操作(1)

[复制链接]
2552|1
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
zjd1|  楼主 | 2009-12-18 23:41 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
NIOS II 软核中EPCS配置芯片的存储操作
最近用CYCLONE FPGA做的视频图像叠加板需要存储一些用户配置信息,而EPCS4配置芯片除了存储FPGA配置信息和NIOS II程序外,还有很多存储空间剩余未使用,刚好可以用来做用户配置信息存储。
折腾了挺长时间,看了不少文档,都只是提到可以用ALTERA提供的HAL函数来调用EPCS相关的函数。最后只能硬着头皮看“altera_avalon_epcs_flash_controller.c”函数(路径为:\\altera\72\ip\sopc_builder_ip\altera_avalon_epcs_flash_controller\HAL\src)。看了两天还是有些参数概念不是很明确。
还好搜到一个老外写的关于NIOS IICPCS器件操作的帖子,他是花了一个多月才摸索到怎么操作,然后给出了一个简单的例子。正如他帖子里说的,我发现了他的帖子,“very lucky”。也许他用的NIOS IDE版本还比较早,有些函数他当时还不能用, 需要对他和程序做一些修改和调整。他的帖子写的很简单,但为我提供了重要信息,帮我省了很多时间。经验就是这样,花了很多时间收获的东西,你收到自己的箱子里藏起来是自己的一小份财富,也许之后永远不会再发挥它的价值。但如果你爱它,就把它写出来把它复制无数份,让它尽可能的去发挥它的价值J
呵呵,不扯废话了,说正题。
先看一下这个简单程序
#include <stdio.h>
#include <unistd.h>
#include "system.h"
#include "alt_types.h"
#include "sys/alt_flash.h"
#include "sys/alt_flash_dev.h"
alt_u8 epcsbuf[32];
int ret_code;
alt_flash_fd* my_epcs;//定义句柄
main()
{
my_epcs = alt_flash_open_dev("/dev/epcs_controller");//打开FLASH器件,获取句柄

ret_code = alt_epcs_flash_get_info (my_epcs, &regions, &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字节


ret_code = alt_epcs_flash_read(my_epcs, regions->offset+0x70000, epcsbuf, 32); //
32字节


}


while(1)


{


}

}
上面的程序就是对EPCS配置芯片操作的流程和方式。首先打开器件获取句柄my_epcs,然后的读写及擦除操作都是通过句柄my_epcs来操作的。“/dev/epcs_controller”中的“epcs_controller”是用户在配置NIOS核时自命名的,可以在system.h中查到,即“EPCS_CONTROLLER_NAME”。通过IDE调试的话可以查看my_epcs指向的FLASH相关参数。EPCS器件只有一个区(regions),EPCS4区内有8个块(block),每个块是65536字节。(注:只有EPCS1每个块32768字节,其余配置芯片是每块65536字节。)

相关帖子

沙发
zjd1|  楼主 | 2009-12-18 23:41 | 只看该作者
alt_epcs_flash_erase_block(my_epcs, regions->offset+0x70000);//擦除第8
这个函数是擦除整块的函数,第一个参数是刚才获得的句柄,用于指示是对刚刚打开的FLASH进行擦除,第二个regions->offset的值其实是0,是由EPCS控制模块自己管理的。FPGA配置文件和NIOS核中的程序是从前边存储的,即从regions->offset+0x00000开始的地址。我的用掉不到4个块,还剩4个块可以用于自定义的存储。为便于将来进行功能扩展,尽量空余低块以备将来使用,优先使用高地址空间(第8块,起始地址为regions->offset+0x70000)进行用户配置信息存储。
alt_epcs_flash_write(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字节
epcsbuf数组中的连续32字节写入regions->offset+0x70000开始的EPCS4芯片内。如果是写入第6块的第0x100开始的地址,那么可用regions->offset+0x60100代替regions->offset+0x70000
alt_epcs_flash_read(my_epcs, regions->offset+0x70000, epcsbuf, 32); //32字节
EPCS4中的第8段起点regions->offset+0x70000读取连续32字节存到epcsbuf数组内。
调试过程中可以在执行alt_epcs_flash_write前手动修改epcsbuf数组内的值,在执行alt_epcs_flash_read前再更改epcsbuf数组内的值为其他值,如果执行alt_epcs_flash_readepcsbuf数组内的值恢复到执行alt_epcs_flash_write前的值,那么对EPCS芯片的读写操作已经成功了J

DSP FPGA和模电及高速信号感兴趣,欢迎有兴趣的朋友一起探讨。
更多个人经验信息可查看个人主页:http://user.qzone.qq.com/37564275/
邮箱:zjd01#126.com (#换为@)

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

39

主题

103

帖子

18

粉丝