目的:通过nios II上的实现软核读写DDR2

相比之前的hello world项目的区别在于1. 在 Qsys 系统中添加 DDR2 的 IP 核,以及DDR2 IP 核的参数配置;2. 在 Eclipse开发环境里对 DDR2 的存储空间进行读写数据和校验程序不同。

下面是针对本项目实现过程中一些疑惑点的见解:

1. 为何需要在QSYS中添加DDR2的IP核?为何不能直接访问外部DDR2?

无论是通过FPGA程序读写DDR2还是通过内嵌的CPU软核来读取,都无法直接简单的控制DDR2的读写。DDR2的IP核,相当于对DDR2进行了一层操作的包装,用户可以通过的简单操作来完成对DDR2的控制。而DDR2 IP核放在FPGA代码里或者内嵌的NIOS里均可以,只不过放到内核中,就可以把DDR2当作内部存储器访问,更为方便。

2. 工程移植

将之前的工程文件都复制到新的文件夹下,然后删除software目录下的文件。这样就可以直接在NIOS中修改内核的参数,然后重新新建软件工程,保存在software目录下。software目录下主要是对内核的编程,即在eclipse环境下的工程。

也可以将复制过来的文件夹保持不动,修改NIOS ii后,需要在原eclipse文件中重新生成BSP包(相当于更新,添加新增的IP核对应的底层支持文件,包含寄存器描述、函数、宏定义等)。操作为:

选择BSP项目,右键-->Nios ii -->generate BSP.  (但这种方法可能会在编译时出现一些未知错误,不推荐使用)

在打开Qsys时,需要重新选择kernel.qsys文件,因为项目移植后,这个文件的位置也发生了变化,需要重新选中本项目对应的software文件。然后根据上面的两种方法编写代码,要么新建工程,要么更新BSP包。

3.  在本项目中,不使用RAM核,MCU直接将程序和数据存储在DDR2中,因此使用外部存储器,可以节省FPGA资源。

4. 配置DDR2 IP核,包含以下内容:

1)Device family

2)Speed grade

3)输入参考时钟频率

4)DDR2 时钟频率

5)Controller data rate: FULL---verilog 逻辑部分数据位宽 X2,速度/2,达到了降频的目的。
6) Memory Presets List 里双击选择 Custom(Micro MT47H64M16)。

若没有,修改现有的IC的参数然后生成我们需要IC。在Memory Presets List里选择Memory vendor为Micron, Memory fomart为Dicrete Device, 这样在右边的 Memory Presets 列表中会出现配置好的 DDR2 芯片,选择型号差不多的 MT47H32M16-5E, 再点击 Modify parameters..按钮。            打开 Preset Editor 设置 DDR 的参数,这里的 DDR2 的参数设置分为 3 种:DDR2 SDRAM属性设置,DDR2 SDRAM 初始化选项和DDR2 SDRAM 时序参数设置。其中All Parameters里包含这三项的全部内容。  Parameters 里设置的参数需要参考 DDR2(MT47H64H16)的 datasheet, 我们这里只需要修改 Row address width 行的参数为 13,其它参数都不需要修改,因为这些参数MT47H64H16 跟MT47H32M16-5E 芯片都是一样的。

参数配置可以参考实现和参数化存储器IP.pdf

5. 生成的NIOS II软核会自动将DDR2相关的时序文件添加进工程。如下:

6. 打开TCL Scripts,可以看到关于DDR2的相关pin .tcl文件,运行后打开Pin planning可以发现所有的ddr2的PIN的属性均被配置过了,除了需要自己手动根据IC型号和板子去连接PIN脚。

7. 在eclipse中新建BSP模板的项目,为何需要选择.sopcinfo文件?这个文件主要是干嘛的?

info文件主要是关于软件的信息,软件的用途、名称、操作系统、需要的磁盘空间等。因此,.sopcinfo主要包含了我们生成的软核的一些信息。添加此文件,就相当于限定我们的编译环境,使编译的程序能直接运行在软核内。

7. 通过调用memtest_small模板中代码来实现功能。

int main(void)
{int ch;/* Print the Header */MenuHeader();while (1){printf("\nPress enter to continue or 'q' to quit.\n");ch = alt_getchar();putchar(ch);if(ch == 'q' || ch == 'Q'){printf( "\nExiting from Memory Test.\n");break;}else if (ch == '\n'){TestRam();}}return (0);
}

从上面代码看出,一共使用了4个函数:

1)MenuHeader(),打印出本代码的功能

2)ch =alt_getchar(),读取用户键盘按下的字符

3)putchar(ch),该函数以无符号 char 强制转换为 int 的形式返回写入的字符,如果发生错误则返回 EOF。

4)TestRam(),实现ddr2的测试,如下:

static void TestRam(void)
{int memory_base, memory_end, memory_size;int ret_code = 0x0;/* Find out what range of memory we are testing */MemGetAddressRange(&memory_base, &memory_end);memory_size = (memory_end - memory_base);printf("\n");printf("Testing RAM from 0x%X to 0x%X\n", memory_base, (memory_base + memory_size));/* Test Data Bus. */ret_code = MemTestDataBus(memory_base);if (ret_code)printf(" -Data bus test failed at bit 0x%X", (int)ret_code);elseprintf(" -Data bus test passed\n");/* Test Address Bus. */if (!ret_code){ret_code  = MemTestAddressBus(memory_base, memory_size);if  (ret_code)printf(" -Address bus test failed at address 0x%X", (int)ret_code);elseprintf(" -Address bus test passed\n");}/* Test byte and half-word access. */if (!ret_code){ret_code = MemTest8_16BitAccess(memory_base);if  (ret_code)printf(" -Byte and half-word access test failed at address 0x%X", (int)ret_code);elseprintf(" -Byte and half-word access test passed\n");}/* Test that each bit in the device can store both 1 and 0. */if (!ret_code){printf(" -Testing each bit in memory device.");ret_code = MemTestDevice(memory_base, memory_size);if  (ret_code)printf("  failed at address 0x%X", (int)ret_code);elseprintf("  passed\n");}if (!ret_code)printf("Memory at 0x%X Okay\n", memory_base);
}

问题:

1. 这个项目是通过使用模板工程来实现功能,即直接调用现有的程序。如果出现问题,那么要么是内核的配置问题,要么是软件的配置问题。

Nios ii 实战篇--- DDR2相关推荐

  1. FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建

    FPGA 之 SOPC 系列(四)NIOS II 外围设备--标准系统搭建 今天给大侠带来今天带来FPGA 之 SOPC 系列第四篇,NIOS II 外围设备--标准系统搭建,希望对各位大侠的学习有参 ...

  2. [笔记].如何使用Nios II的中断:PIO中断与定时器中断

    引子 定时器中断,我以前在艾米电子论坛发帖讨论过:PIO中断我在博客里也讨论过,最近发现以前的总结有一点小错误.于是结合我最近玩触摸屏的一点点心得,写篇博文. 软硬件环境 硬件:艾米电子EP2C8核心 ...

  3. NIOS II spi详解

    1.说明 本文是依据笔者阅读<Embedded Peripherals (ver 9.0, Mar 2009, 4 MB).pdf>参考文档所作的个人理解,可以看做是笔记吧. 本文只讲NI ...

  4. niosii spi 外部_转载:NIOS II spi详解

    NIOS II spi详解 1.说明 本文是依据笔者阅读<Embedded Peripherals (ver 9.0, Mar 2009, 4 MB).pdf>参考文档所作的个人理解,可以 ...

  5. FPGA 之 SOPC 系列(六)Nios II 程序开发 II

    FPGA 之 SOPC 系列(六)Nios II 程序开发 II 今天给大侠带来今天带来FPGA 之 SOPC 系列第六篇,Nios II 程序开发 II,希望对各位大侠的学习有参考价值,话不多说,上 ...

  6. 基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程移植到自己做的板子上

    原程序是运行在小梅哥AC620开发板上的:基于小梅哥AC620开发板的NIOS II LWIP百兆以太网例程_ZLK1214的专栏-CSDN博客_小梅哥ac620[开发板]开发板型号:小梅哥AC620 ...

  7. FPGA学习[2]——致敬Mbed!使用C++开发NIOS II

    前言 NIOS II项目搭建 Hello World on Nios ii 点亮LED 快速的开发:使用C++的类 前言 在上一篇文章中博主介绍了如何让nios ii跑在板子自带的SDRAM里,这样大 ...

  8. HDMI系列之一:基于Nios II的HDMI显示图片

    一休哥将在本文中介绍一个基于Nios II的HDMI显示图片的工程.我将主要分三个部分来介绍这一工程,从而实现工程效果. 1. Nios II的常规使用套路 2. 自定义HDMI IP核的制作 3. ...

  9. python:实战篇

    python 实战 §python 实战篇 §1.python解压 1. python解压zip.7z 2. python 解压rar 1)windows: 2)linux: §2.python执行L ...

最新文章

  1. event对象(触发机制)
  2. 【2019雅礼集训】【CF 960G】【第一类斯特林数】【NTT多项式】permutation
  3. Smali文件添加try/catch语句,出现“invalid use of move-exception”异常
  4. 一款针对Outlook的红队安全研究工具
  5. 8大行业场景!最新 Apache Flink 行业案例集火热出炉
  6. Bzoj 2724: [Violet 6]蒲公英(分块)
  7. const没define好用 php,3分钟短文|PHP 定义常量,我该用define还是const?这下不迷茫了...
  8. ansi编码_Java 字符编码
  9. 怎么读取瑞萨mcu的 checksum_为物联网设备选择一颗“安全”的MCU
  10. 组策略应用到本地安全策略
  11. 配置Outlook连接Exchange
  12. 源码编译CWM Recovery
  13. 数据库E-R图——图书管理系统
  14. 怎么复制黑苹果config配置_Catia中端电脑配置推荐(黑苹果)
  15. 五年级英语测试题软件,小学五年级英语测试题
  16. 解决System进程占用80端口
  17. h5 input 阴影_CSS3文本阴影 text-shadow
  18. java判断闰年中闰月_2019年农历闰几月 关于闰年闰月的认识
  19. [自娱自乐]玫瑰骑士结束了
  20. Linux查看CPU和内存使用情况

热门文章

  1. 企业带宽管理解决方案
  2. 华为nova5i语音助手唤醒方法分享
  3. RecycleView的Item的宽不能填充满
  4. 使用普中科技51单片机进行(I^2)C总线操作
  5. MySQL:开窗函数
  6. 东软培训Python怎么样
  7. 《机器人动力学与控制》第五章——速度运动学之机械臂的雅各比矩阵 5.1 角速度:固定旋转轴
  8. RFID:电子标签芯片的组成及功能
  9. HTML-图片热点、网页内嵌、网页拼接、快速切图
  10. 电子化采购管理系统,竞争性谈判报价8个典型问题