nios ii小实验——SDRAM读写

简介: nios ii小实验——SDRAM读写

实验所用板子为altera DE2板子,FPGA为Cyclone II:EP2C35F672C6,quartus版本为13.0

1.管脚信息

[11:0]DRAM_ADDR : address

DRAM_BA_0 : bank address 0

DRAM_BA_1 : bank address 1

DRAM_CAS_N : column address strobe

DRAM_CKE : clock enable

DRAM_CLK : clock

DRAM_CS_N : chip select

[15:0]DRAM_DQ : Data

DRAM_LDQM :lower byte data mask

DRAM_UDQM : upper byte data mask

DRAM_RAS_N : row address strobe

DRAM_WE_N :  write enable

2.实验流程

1)建立工程

2)建立初始顶层文件

module work (
  CLOCK_50,         // On Board 50 MHz
  KEY,              // Pushbutton[3:0]
  SW,               // Toggle Switch[17:0]
  LEDR,             // LED Red[17:0]
  DRAM_DQ,          // SDRAM Data bus 16 Bits
  DRAM_ADDR,        // SDRAM Address bus 12 Bits
  DRAM_LDQM,        // SDRAM Low-byte Data Mask 
  DRAM_UDQM,        // SDRAM High-byte Data Mask
  DRAM_WE_N,        // SDRAM Write Enable
  DRAM_CAS_N,       // SDRAM Column Address Strobe
  DRAM_RAS_N,       // SDRAM Row Address Strobe
  DRAM_CS_N,        // SDRAM Chip Select
  DRAM_BA_0,        // SDRAM Bank Address 0
  DRAM_BA_1,        // SDRAM Bank Address 1
  DRAM_CLK,         // SDRAM Clock
  DRAM_CKE          // SDRAM Clock Enable
);
input         CLOCK_50;   // On Board 50 MHz
input  [3:0]  KEY;        // Pushbutton[3:0]
input  [17:0] SW;         // Toggle Switch[17:0]
output [17:0] LEDR;       // LED Red[17:0]
inout  [15:0] DRAM_DQ;    // SDRAM Data bus 16 Bits
output [11:0] DRAM_ADDR;  // SDRAM Address bus 12 Bits
output        DRAM_LDQM;  // SDRAM Low-byte Data Mask 
output        DRAM_UDQM;  // SDRAM High-byte Data Mask
output        DRAM_WE_N;  // SDRAM Write Enable
output        DRAM_CAS_N; // SDRAM Column Address Strobe
output        DRAM_RAS_N; // SDRAM Row Address Strobe
output        DRAM_CS_N;  // SDRAM Chip Selectoutput        
output        DRAM_BA_0;  // SDRAM Bank Address 0
output        DRAM_BA_1;  // SDRAM Bank Address 0
output        DRAM_CLK;   // SDRAM Clock
output        DRAM_CKE;   // SDRAM Clock Enable
assign LEDR = SW;
endmodule



3)编译并导入管脚信息

4)建立Qsys

CPU: NiOS II/e

ram: total memory size 12288bytes

jtag_uart: default

sdram_controller: DE2板子上的SDRAM大小为8M

6e7f2e4ed973601bf1857cb67e61a418_Center.png

接线图

cbd9a8c1c58c6442c4b6aa44f5b73de9_Center.png

修改CPU reset位置,自动生成地址,generate

将nios_ii.qsys文件添加入工程中

5)生成pll始终分频,将输入SDRAM的始终延时3ns(延时?前移?)

加入pll ip核,只需修改这两处

9f5c6b7fda4b8f53f4e3124d2884c6b8_SouthEast.png

7d04833ca15128e4b6c161b2ee6da239_SouthEast.png

6)完成硬件代码

module work (
  CLOCK_50,         // On Board 50 MHz
  KEY,              // Pushbutton[3:0]
  SW,               // Toggle Switch[17:0]
  LEDR,             // LED Red[17:0]
  DRAM_DQ,          // SDRAM Data bus 16 Bits
  DRAM_ADDR,        // SDRAM Address bus 12 Bits
  DRAM_LDQM,        // SDRAM Low-byte Data Mask 
  DRAM_UDQM,        // SDRAM High-byte Data Mask
  DRAM_WE_N,        // SDRAM Write Enable
  DRAM_CAS_N,       // SDRAM Column Address Strobe
  DRAM_RAS_N,       // SDRAM Row Address Strobe
  DRAM_CS_N,        // SDRAM Chip Select
  DRAM_BA_0,        // SDRAM Bank Address 0
  DRAM_BA_1,        // SDRAM Bank Address 1
  DRAM_CLK,         // SDRAM Clock
  DRAM_CKE          // SDRAM Clock Enable
);
input         CLOCK_50;   // On Board 50 MHz
input  [3:0]  KEY;        // Pushbutton[3:0]
input  [17:0] SW;         // Toggle Switch[17:0]
output [17:0] LEDR;       // LED Red[17:0]
inout  [15:0] DRAM_DQ;    // SDRAM Data bus 16 Bits
output [11:0] DRAM_ADDR;  // SDRAM Address bus 12 Bits
output        DRAM_LDQM;  // SDRAM Low-byte Data Mask 
output        DRAM_UDQM;  // SDRAM High-byte Data Mask
output        DRAM_WE_N;  // SDRAM Write Enable
output        DRAM_CAS_N; // SDRAM Column Address Strobe
output        DRAM_RAS_N; // SDRAM Row Address Strobe
output        DRAM_CS_N;  // SDRAM Chip Selectoutput        
output        DRAM_BA_0;  // SDRAM Bank Address 0
output        DRAM_BA_1;  // SDRAM Bank Address 0
output        DRAM_CLK;   // SDRAM Clock
output        DRAM_CKE;   // SDRAM Clock Enable
assign LEDR = SW;
pll pll_u
  (
  .inclk0(CLOCK_50),
  .c0(DRAM_CLK)
  );
  nios_ii u0 (
        .clk_clk       (CLOCK_50),       //   clk.clk
        .reset_reset_n (KEY[3]), // reset.reset_n
        .sdram_addr    (DRAM_ADDR),    // sdram.addr
        .sdram_ba      ({DRAM_BA_1,DRAM_BA_0}),      //      .ba
        .sdram_cas_n   (DRAM_CAS_N),   //      .cas_n
        .sdram_cke     (DRAM_CKE),     //      .cke
        .sdram_cs_n    (DRAM_CS_N),    //      .cs_n
        .sdram_dq      (DRAM_DQ),      //      .dq
        .sdram_dqm     ({DRAM_UDQM,DRAM_LDQM}),     //      .dqm
        .sdram_ras_n   (DRAM_RAS_N),   //      .ras_n
        .sdram_we_n    (DRAM_WE_N)     //      .we_n
    );
endmodule

8)编译硬件代码,并烧录

9)打开nios II software编写软件代码

10)软件代码

软件代码里,地址信息跳变尝试了每次+1、+2、+4,在+4的情况下得到了正确数据。

推测这一情况与软核为32位系统,SDRAM存储空间为8位空间有关?

有待进一步探究

#include <stdio.h>
#include"system.h"
#include"io.h"
int main()
{
  unsigned int i, j, k;
  k = 236;  //随便写的一个数
  printf("Hello from Nios II!\n");
  for(i = 0; i<40; i = i + 4){
    IOWR(SDRAM_BASE+i, 0, k);
    printf("SDRAM_BASE+i = %d\t",SDRAM_BASE+i);
    printf("k = %d\n",k);
    k++;
  }
  for(i = 0; i<40; i = i + 4){
    j = IORD(SDRAM_BASE+i, 0);
    printf("data_%d = %d\n", SDRAM_BASE+i, j);
  }
  return 0;
}



11)edit BSP -> bulid project -> run as NIOS II hardware烧录软件

3.读写结果

地址跳变每次 i = i +1; 数据读写与想象不同

ad0cae60ec7be016099b71f5dfad5ad6_SouthEast.png

地址跳变每次 i = i +2; 数据读写与想象不同

b234d4fff8bb86769468a83ceba7ee5a_SouthEast.png

地址跳变每次 i = i +4; 忽略出现的奇怪的显示,数据读写无误

74d7db5d2d8475e209a5469091627b1e_SouthEast.png

解决:SDRAM的数据一般占据4个地址,或者8个地址,存在对其的问题,因此地址为应该+4或者4的倍数。


相关文章
|
Android开发 异构计算
nios ii FIFO读取FPGA数据交互实验1
nios ii FIFO读取FPGA数据交互实验1
588 0
nios ii FIFO读取FPGA数据交互实验1
|
Android开发 C++ 芯片
nios ii小实验——第一个demo指导书
nios ii小实验——第一个demo指导书
600 0
nios ii小实验——第一个demo指导书
|
运维 监控
浅析SPI与CAN通信
SPI是一种常用的MCU与外设的通信方式,英文全称Serial Peripheral Interface。与之前介绍过的UART不同,SPI是串行,全双工,同步通信方式。SPI通常有4根物理连接线,分别是CS片选,SCK时钟,MOSI主机输出从机输入和MISO主机输入从机输出。CS片选是从机选择信号线,低电平有效。当CS为低电平时认为主机目前选中的本从机。SCK是串行时钟线,同步通信需要主从机时钟同步,主机利用SCK线与从机实现时钟同步。时钟由主机产生,决定了通讯的速率。
1262 0
|
存储 缓存 固态存储
Intel PMEM的使用经验和指南
作为一种Persistent Memory设备,同时也是第一款可扩展的商用NVDIMM,英特尔Optane DIMM (dual In-line memory module) 设备的性能介于传统持久性存储介质和内存之间,它的出现将有助于扩展内存容量,或提供低延迟持久性存储设备。本文主要介绍,后者使用方式下的介质的性能特点和使用指南。 本文内容主要来自于“An Empirical Guide to the Behavior and Use of Scalable Persistent Memory (FAST 20)”,加上本人的一些要点提炼和批注。
9582 2
Intel PMEM的使用经验和指南
|
5月前
|
缓存 小程序 算法
外卖配送小程序开发核心难点:调度系统与订单分发机制解析
外卖配送小程序开发的核心不在前端界面,而在后端两大能力:智能调度系统(决定配送效率)与科学订单分发机制(保障稳定性和骑手体验)。多数项目“能用但跑不动”,症结恰在此——缺乏多约束实时优化、动态评分派单、多单路径规划及高并发架构设计。
|
6月前
|
人工智能 自然语言处理 搜索推荐
AI技术在英语学习中的应用
AI已升级为英语学习的“智能导师”,深度融入听说读写全过程:口语陪练、发音精析、写作教练、个性教材、人机协同——打破资源壁垒,实现千人千面的高效学习。(239字)
|
9月前
|
存储 芯片 内存技术
南京观海微电子----DDR的工作原理——DDR接口专栏(一)
DDR从SDR发展至今已至DDR5,历经多代演进。每代通过降低电压、提升预取(Prefetch)、引入Bank Group等技术,显著提高带宽与能效。DDR4采用16bit预取与Bank Group交错,实现高速传输;其寻址利用分时复用,大幅提升容量。文章详解了DDR架构、信号引脚及内存颗粒内部结构,揭示高容量与高性能实现原理。
南京观海微电子----DDR的工作原理——DDR接口专栏(一)
|
JavaScript 算法 Linux
硬件工程师物料清单BOM对比工具
硬件工程师物料清单BOM对比工具
874 1
硬件工程师物料清单BOM对比工具
|
存储 消息中间件 NoSQL
Redis从入门到精通之底层数据类型Stream详解和使用示例
Redis Stream的底层数据结构还涉及到基数树和listpacks,这些结构使得Redis Stream具有高效的空间和时间复杂度,同时允许通过ID进行随机访问。 基数树是一种高效的数据结构,用于存储有序数据集合。在Redis Stream中,消息ID有序集合就是基于基数树实现的。基数树可以快速定位一个元素在有序集合中的位置,以及在有序集合中查找一段范围内的元素。 listpack是一种紧凑的、可扩展的、有序的、二进制数据结构,用于存储多个元素。在Redis Stream中,消息哈希表就是基于listpack实现的。listpack可以高效地存储多个元素,同时支持快速的元素访问插入。
2467 125
Redis从入门到精通之底层数据类型Stream详解和使用示例