声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/

一、简介

这一节,我们来聊聊SDRAM吧。作为NIOS系统中最重要的一个外部器件,它担任着重要的角色,大家对它也应该很熟悉。每次上电的时候,FPGA都会把FLASH中的程序送到SDRAM中运行,之所以这样来做就是因为它的速度很快,但它掉电是要丢失数据的,所以要把数据存到FLASH中。

有关SDRAM的理论知识我在这里不说了,不知道的百度google一下都可以。其实在NIOS II开发过程中,就算你对SDRAM的理论知识不了解,也不耽误你对它的使用。SOPC builder都已经完美的将它驱动起来,我们只要知道怎么使用它就可以了。下面,我们就来讲讲他的使用方法,其实真的很简单。

在我们讲第一节的时候,我们就已经讲了如何构建SDRAM的控制器了,我在这里不再重复了,假设你已经构建好了,我主要讲一下有关软件的部分。

二、软件开发

首先打开NIOS II 9.0 IDE软件,打开后,我们来看看system.h文件,确定一下SDRAM控制器模块是否已经加入进来。如果加入,有下面的内容出现

#define SDRAM_NAME "/dev/sdram"#define SDRAM_TYPE "altera_avalon_new_sdram_controller"#define SDRAM_BASE 0x01000000……

接下来,我们开始编写有关SDRAM的软件代码,代码很简单,如下所示

/** ==================================================================
*       Filename:  main.c
*    Description:  SDRAM读写试验*        Version:  1.0.0*        Created:  2010.4.16*       Revision:  none*       Compiler:  Nios II 9.0 IDE*         Author:  马瑞 (AVIC)*          Email:  avic633@gmail.com  * =================================================================*//*----------------------------------------------------------------* Include *----------------------------------------------------------------*/
#include <stdio.h>
#include "../inc/sopc.h"
#include "system.h"
#include "string.h"/*---------------------------------------------------------------*  Variable*---------------------------------------------------------------*/
unsigned short * ram = (unsigned short *)(SDRAM_BASE+0x10000); //SDRAM地址/* * ===  FUNCTION  ===================================================*         Name:  main*  Description:  函数主程序* =================================================================*/
int main(void)
{int i;memset(ram,0,100);//向ram中写数据,当ram写完以后,ram的地址已经变为(SDRAM_BASE+0x10100)for(i=0;i<100;i++){*(ram++) = i;}//逆向读取ram中的数据for(i=0;i<100;i++){printf("%d\n",*(--ram));}return 0;
}

程序很简单,就是向指定的SDRAM中赋值。在这个程序里面有几个地方需要说明一下。首先,我在程序前面定义了一个unsigned short类型的指针变量ram,并将其指向SDRAM+0x10000这个位置。之所以设置为unsigned short数据类型,是因为我们用的SDRAM是16位数据总线的。而将其指向SDRAM+0x10000是因为在NIOS II运行时会用到SDRAM的部分空间,我们必须避开这部分空间,以免运行错误。0x10000这个值不是固定的,只要避开SDRAM的那部分空间就可以了。除此之外还有一个地方需要注意,就是当我们对sdram赋值以后,指针就会向后移动,指向下一个地址空间,每加一次,地址都会向后面移动16位。假如我们现在是在SDRAM+0X10000这个位置,当指针向后移动一次以后,地址就变为了SDRAM+0X10002,再加一次就变为了SDRAM+0X10004,以此类推。这些都是内部自动处理的,不需要我们来参与,我们只要知道就可以了。

其实我讲这部分内容是想告诉大家,SDRAM控制器一旦构建好以后,我们对SDRAM的处理就像对内部地址一样,我们可以随意的进行赋值和读取。对于开发板上的64Mbit的SDRAM其实有很少一部分用给NIOS系统,其余部分都在空闲,大家是不是觉得很浪费呢。其实在有些情况下,我们就可以利用起这部分资源,比如在某个系统中,我们需要将外设接收到的数据缓存一下,我们就可以用这部分空闲的SDRAM空间来处理。

在C语言中,如果我们要接收比较大的数据,还有另一种处理方法,那就是借助堆(heap)。可能有些人对堆和栈还分不清楚,我在这简单解释一下。栈(stack) 由系统自动分配。 例如,声明在函数中一个局部变量 int b,系统自动在栈中为b开辟空间。而堆(heap)需要程序员自己申请,并指明大小。有人用这样一个比喻来解释堆和栈的区别,非常形象贴切:使用栈就象我们去饭馆里吃饭,只管点菜(发出申请)、付钱、和吃(使用),吃饱了就走,不必理会切菜、洗菜等准备工作和洗碗、刷锅等扫尾工作,他的好处是快捷,但是自由度小。使用堆就象是自己动手做喜欢吃的菜肴,比较麻烦,但是比较符合自己的口味,而且自由度大,这个人真是太有才了。下面我来写一个堆的代码,这部分代码是节选的,并不完全,功能是通过xmodem协议接收数据,并将其内容放到堆里面。如下所示

/* * ===  FUNCTION  ==================================================*         Name:  main*  Description:  主函数* =================================================================*/
int main()
{    char *ram = (char *)malloc ( sizeof(char)* 500000 );if ( ram==NULL ) {fprintf ( stderr, "\ndynamic memory allocation failed\n" );exit (EXIT_FAILURE);}        uart.init();/*------------------- FLASH -----------------------------*/while(1){if(uart.mode_flag){ xmodem.xmodem_rx();printf("ram_cnt:%d\n",ram_cnt);parse_srecord_buf(ram,ram_cnt);printf("successful!");ram_cnt = 0;uart.mode_flag = 0;}}free (ram);return 0;
}

看了上面的代码大家应该了解了堆的用法了吧,它是通过malloc向系统中申请空间的。申请成功以后,就会返回申请地址的首地址,失败则返回NULL。到底申请在什么地方,我们可以通过打印指针来得知,但并没这个必要,因为这些都是系统来处理的,我们得到了首地址然后用就可以了。需要注意一点,我们申请完的地址用完以后需要释放,用free来释放就可以了。如果不释放,可能会出现内存泄露问题,到时候麻烦就大了,具体大到什么程度我也不知道,呵呵。

可能有人会问,为什么不用栈来处理这个问题呢?这就跟编译有关系了,在编译过程中,系统会将栈需要的空间加到代码中,也就是说如果你在代码中用栈来处理大的数据,那么你编译以后的代码会非常大,你下载到flash以后,加载到sdram中的时间也会非常之长。而堆这不会,系统对堆的处理方式是何时用合适分配,并不占代码空间。

说到这,有关SDRAM部分的内容讲完了。总结一下,使用SDRAM有两种方法,第一种是直接对SDRAM地址处理;第二种方法就是利用堆来处理。好了,这部分内容就讲到这吧,如果大家对此有疑问,或者发现我讲的内容有问题可以直接跟我联系,邮箱:avic633@gmail.com;qq:984597569。

【连载】【FPGA黑金开发板】NIOS II那些事儿--SDRAM实验(十二)相关推荐

  1. 【连载】【FPGA黑金开发板】NIOSII那些事儿--USB主机模式(二十一)

    声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 上一节,我们讲了USB的设备模式,可以实现计算机与黑金开发板的数据通信.这 ...

  2. 【FPGA黑金开发板】NIOSII那些事儿--基于AVALON总线的IP定制(十七)

    声明:本文为转载作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 简介 NIOS II是一个建立在FPGA上的嵌入式软核处理器,除了可以根据 ...

  3. 【连载】【FPGA黑金开发板】NIOS II那些事儿--硬件开发(一)

     声明:本文为原创作品,版权归黑金动力社区(http://www.heijin.org)所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 前言 从今天开始,NIO ...

  4. FPGA黑金开发板mini版新鲜出炉!!!

        功能描述: 1 – EP2C5Q208C ALTERA FPGA芯片 2 –64Mbit SDRAM 3 –2M*8bit FLASH 4 - EPCS1配置芯片 5 - 20M有源晶振 6 ...

  5. FPGA黑金开发板第一帖

    从今天起,此博客将专注于NIOS II的研究,以及对FPGA黑金开发板的技术支持.如果大家有任何的意见及建议,请留言.

  6. FPGA黑金开发板勘误

    FPGA黑金开发板(型号OSH-2-8)已发现两处勘误:   核心板上的红框的扩展口(图1所示)有两处丝印标注错误,图2中69脚和70脚标注错位,图3中的84脚和86脚指示错位,大家使用时请注意.

  7. FPGA黑金开发板 CYCLONE IV核心板全新上市!!!!

    FPGA:                          EP4CE15F17C8N SDRAM:                       256Mbit    (16M*16bit) SRA ...

  8. 【连载】【FPGA黑金开发板】NIOS II那些事儿--LED实验(四)

    声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 这一节,我将给大家讲解第一个与硬件有关的程序,虽然内容简单,却极具代表性. ...

  9. 【连载】【FPGA黑金开发板】NIOS II那些事儿--外部中断实验(五)

    声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 简介 这一节,我们通过来讲解一下NIOS II的硬件中断的内容,同时借助这 ...

  10. 【连载】【FPGA黑金开发板】NIOS II那些事儿--串口实验(六)

    声明:本文为原创作品,版权归本博文作者所有,如需转载,请注明出处http://www.cnblogs.com/kingst/ 简介 这一节,我们来说说RS232,俗称串口.大家对这东西应该很了解,没什 ...

最新文章

  1. C/C++中switch用法的一种替换方式
  2. 通过分析exevc系统调用处理过程来理解Linux内核如何装载和启动一个可执行程序...
  3. 基础 PHP 数据类型
  4. easyExcel 读取数据为空的一次报错记录
  5. intelliJ Idea 添加 Tomcat部署(详细步骤)
  6. Windows Azure 之服务总线中继服务
  7. [html] 怎样在文本框中禁用中文输入法?
  8. jQuery 教程02-jQuery 语法
  9. ProPublica Illinois如何每天使用GNU Make加载1.4GB数据
  10. 第九届河南理工大学算法程序设计大赛 正式赛(部分题解)
  11. Unity3D 脚本模板插件
  12. 企业微信登陆服务器设置,企业微信怎么登入
  13. 地域和地方的区别_地方、地域、地区、地面、地段的区别_近义词词典_词林在线词典...
  14. 董明珠赞同取消住房公积金 格力员工每人一套房
  15. 【区块链】——区块链与5G技术的结合
  16. [dp][思维]Paranoid String CF1694B
  17. python 批量更改扩展名
  18. 学术界AV1编码优化技术的进展
  19. dreamweaver cs4 css汉化补丁,dreamweaver cs4官方版
  20. 此 Google 帐号尚未与设备关联。要安装应用,请先访问设备上的 Play 商店应用。 了解详情

热门文章

  1. python的标准库——turtle
  2. CSS学习总结(1)——基本介绍
  3. MySQL NULL的小陷阱
  4. VMware网络连接模式——桥接模式、NAT模式以及仅主机模式的介绍和区别
  5. 灵修---士师记第9章
  6. 从面试题中看Java的Reference(引用)
  7. 数据库sqlite3怎么排顺序_【数据库02】MySQL数据库面试题
  8. canal与mysql高可用_canal 高可用介绍(4)
  9. oracle 基本dos命令,Oracle 常用 Dos命令
  10. split函数python_python有split函数吗