存储控制器(SDRAM操作)

article/2025/10/26 12:02:38

什么是存储控制器

2440是32位单片机,进行数据访问时通过32位地址访问。
CPU发出32位地址信号给存储控制器,存储控制器根据地址信号设置片选信号及地址总线,将相应数据通过数据总线传回存储控制器,存储控制器将收到的数据以字节为单位发送给CPU。

CPU通过存储控制器读写数据总体概述:

  • 存储控制器与相应内存芯片根据芯片手册正确接线。
  • 为存储控制器设置好寄存器(结合原理图、内存芯片手册、开发板芯片手册设置相应数据位宽、片选信号、时钟等信息)。
  • CPU向芯片手册发送32位地址信号。
  • 存储控制器根据收到的地址信号结合步骤2设置好的寄存器信息生成相应片选信号、地址总线等信息。
  • 存储控制器与相应内存间的数据传输由位宽决定(8/16/32)。CPU数据以字节为单位(8),与存储控制器的数据交换要遵循一定规律(内存控制器根据寄存器位宽信息自动完成转化过程)。
  • 例如内存芯片为数据位宽是16位,则CPU发送的字节会存到存储控制器的高八位或者低八位,另外八位存储另一个八位数据。即当存储控制器数据位宽为16时,地址总线最后一位无效(两个数据共用一个存储控制器地址)。当存储控制器数据位宽为32时,地址总线最后四位无效(四个数据共用一个存储控制器地址)。

2440存储控制器简介(memory controller)

  • 支持小端/大端字节序(通过软件选择)
  • 地址空间:每个BANK有128M(总共1G,8个BANK)
  • 可编程的访问位宽:BANK0为16/32位,其他BANK为8位/16位/32位
  • 总共8个存储器BANK,其中6个用于ROM,SRAM,等等。其余的2个用于ROM,SRAM,SDRAM等等
  • 7个BANK的起始地址是固定的(BANK0~BANK6)
  • 1个BANK的起始地址和大小可编程(BANK7)
  • 所有BANK的访问周期可编程
  • 外部的wait信号可延长总线周期
  • 外接SDRAM支持自刷新和掉电模式

注意:BANK6和BANK7的地址空间大小必须相等(BANK6和BANK7的地址空间大小是可编程的)

以上内容可通过三星数据手册查询。

S3C2440对外引出ADDR0~ADDR26共27根地址线,可访问128*2^20 = 128M 地址空间,配合8个片选信号nGCS0~nGCS8,可达到1G地址空间。
S3C2440地址映射图
上图为S3C2440地址映射图,分NAND flash和非NAND flash 两种情况。当CPU发出地址信号时,存储控制器会根据地址信号设置片选信号,再根据地址线访问到具体外设。
具体地址信号为片选的初始信号加地址线信号。
2440存储控制器相关寄存器介绍:

1)位宽和等待控制寄存器BWSCON
BWSCON中每四位控制一个BANK
STx:启动/禁止SDRAM的数据掩码引脚
WSx:是否使用存储器的WAIT信号
DWx:设置对应BANK的位宽,0b00对应8位,0b01对应16位,0b10对应32位,0b11表示保留
比较特殊的是BANK0,由硬件跳线决定DW0,0b01表示16位,0b10表示32位,BANK0只支持16、32两种位宽 本板为0x22011110

2)BANK控制寄存器BANKCONx(x为0-5)
这些寄存器用来控制BANK0-BANK5外接设备的访问时序,使用默认0x0700即可

3)BANK控制寄存器BANKCONx(x为6-7)
MT[16:15]:设置BANK外接ROM/SRAM还是SDRAM,00=ROM/SRAM,01=保留,10=保留,11=SDRAM
MT=0b00时,与BANKCON0-BANKCON5类似
MT=0b11时
Trcd[3:2]:RAS to CAS delay,设为推荐值0b01
SCAN[1:0]:SDRAM的列地址数,本开发板使用的SDRAM列地址数为9,0b00=8位,0b01=9位,0b10=10位
本开发板BANKCON6/7均设为0x00018005

4)刷新控制寄存器REFRESH
REFEN[23]: 0=禁止SDRAM的刷新功能,1=开启SDRAM的刷新功能
TREFMD[22]: SDRAM的刷新模式,0=CBR/Auto Refresh,1=SelfRefresh
Trp[21:20]: SDRAM RAS预充电时间 00=2 clocks,01=3clocks,10=4clocks,11=不支持
Tsrc[19:18]: SDRAM半行周期时间 00=4clocks,01=5clocks,10=6clocks,11=7clocks,SDRAM行周期时间Trc=Tsrc+Trp
Refresh Counter[10:0]: SDRAM刷新计数,刷新时间=(2^11+1-refresh_count)/HCLK,在未使用PLL时,HCLK=晶振频率12MHz,刷新周期为7.8125us
refresh_count=2^11+1-12*7.8125=1955
REFRESH=0x008C0000+1955=0x008C07A3

5)BANKSIZE寄存器
BURST_EN[7]: 0=ARM核禁止突发传输,1=ARM核支持突发传输
SCKE_EN[5]: 0=不使用SCKE信号令SDRAM进入省电模式,1=使用SCKE信号令SDRAM进入省电模式
SCLK_EN[4]: 0=时刻发出SCLK信号,1=仅在方位SDRAM期间发出SCLK信号
BK76MAP[2:0]: 设置BANK6/7的大小,0b010=128MB/128MB,0b001=64MB/64MB,0b000=32M/32M,0b111=16M/16M,0b110=8M/8M,0b101=4M/4M,0b100=2M/2M
则本开发板BANKSIZE设为0xB1

6)SDRAM模式设置寄存器MRSRBx(x为6-7)
CL[6:4]: 0b000=1clocks,0b010=2clocks,0b011=3clocks
本开发板取0b011,MRSRB6/7取值为0x30

SDRAM简介在这里插入图片描述

SDRAM的内部是一个个存储阵列,阵列就如同表格一样,将数据“填”进去。和表格的检索原理一样,先指定一个行(Row)和一个列(Column),就可以准确的找到所需要的单元格,这就是SDRAM寻址的基本原理,这个单元格被称为存储单元,这个表格(存储阵列)就是逻辑Bank(Logical Bank,简称L-Bank)。SDRAM一般分为4个L-Bank。

现在我们实验的是通过CPU访问SDRAM,那么我们就大概的想象一下,我们可以大致的分为4个步骤:
①CPU发出的片选信号nGCS6有效,它选中SDRAM芯片。(从V3原理图可得)
②SDRAM中有4个L-Bank,需要两根地址信号线选中哪一个L-Bank。(从V3原理图我们可以知道 CPU的ADDR24、ADDR25作为L-Bank的选择信号)
③对SDRAM进行统一的 行/列 寻址。(这样我们就可以确定具体访问芯片内部哪一个存储单元了)
④找到存储单元后,就要对SDRAM进行数据传输了。(这里我们就需要知道数据宽度等等)

对于①,很显然。
对于②,[ADDR25:ADDR24]=0b00/0b01/0b10/0b11,就正好对应四个L-Bank了。
对于③,(这个我们就得SDRAM的芯片手册和原理图结合看一下了)根据SDRAM的列地址线数目设置CPU相关的寄存器后,CPU就会从32位的地址中自动分出L-Bank选择信号、行地址信号、列地址信号,然后先后
发出行地址信号,列地址信号。L-Bank选择信号在发出行地址信号的同时发出,并维持到列地址信号结束。
在我们这个实验中,行地址、列地址共用ADDR2~ADDR14,然后使用nSRAS、nSCAS来区分它们(Bank6的位宽是32,也就是CPU访问SDRAM,一次访问4个字节。而CPU的单位是Byte,eg:CPU内存地址0x00000000、0x00000001、0x00000002、0x00000003其实访问的都是SDRAM的0x00000000,即CPU真正有效的地址位是从ADDR2开始的,所以ADDR0和ADDR1没用)。
通过原理图我们可以看出,这个开发板的两根地址线ADDR24、ADDR25作为L-Bank的选择信号,行地址数为13,列地址数为9。当nSRAS信号有效时,ADDR2~ADDR14发出的是行地址信号,它对应32bit地址空间的
bit[23:11]。当nSCAS信号有效时,ADDR2~ADDR14发出的是列地址信号,它对应32bit地址空间的bit[10:2](地址信号我目前的理解是行信号加列信号加片选信号,具体行列信号位于地址空间哪一位有上述可能,但不一定)。
参考文章:https://blog.csdn.net/yxtxiaotian/article/details/80736262

代码

head.s

@*************************************************************************
@ File:head.S
@ 功能:设置SDRAM,将程序复制到SDRAM,然后跳到SDRAM继续执行
@*************************************************************************       .equ        MEM_CTL_BASE,       0x48000000
.equ        SDRAM_BASE,         0x30000000.text
.global _start
_start:bl  disable_watch_dog               @ 关闭WATCHDOG,否则CPU会不断重启bl  memsetup                        @ 设置存储控制器bl  copy_steppingstone_to_sdram     @ 复制代码到SDRAM中ldr pc, =on_sdram                   @ 跳到SDRAM中继续执行
on_sdram:ldr sp, =0x34000000                 @ 设置堆栈bl  main
halt_loop:b   halt_loopdisable_watch_dog:@ 往WATCHDOG寄存器写0即可mov r1,     #0x53000000mov r2,     #0x0str r2,     [r1]mov pc,     lr      @ 返回copy_steppingstone_to_sdram:@ 将Steppingstone的4K数据全部复制到SDRAM中去@ Steppingstone起始地址为0x00000000,SDRAM中起始地址为0x30000000mov r1, #0ldr r2, =SDRAM_BASEmov r3, #4*1024
1:  ldr r4, [r1],#4     @ 从Steppingstone读取4字节的数据,并让源地址加4str r4, [r2],#4     @ 将此4字节的数据复制到SDRAM中,并让目地地址加4cmp r1, r3          @ 判断是否完成:源地址等于Steppingstone的未地址?bne 1b              @ 若没有复制完,继续mov pc,     lr      @ 返回memsetup:@ 设置存储控制器以便使用SDRAM等外设mov r1,     #MEM_CTL_BASE       @ 存储控制器的13个寄存器的开始地址adrl    r2, mem_cfg_val         @ 这13个值的起始存储地址add r3,     r1, #52             @ 13*4 = 54
1:  ldr r4,     [r2], #4            @ 读取设置值,并让r2加4str r4,     [r1], #4            @ 将此值写入寄存器,并让r1加4cmp r1,     r3                  @ 判断是否设置完所有13个寄存器bne 1b                          @ 若没有写成,继续mov pc,     lr                  @ 返回.align 4
mem_cfg_val:@ 存储控制器13个寄存器的设置值.long   0x22011110      @ BWSCON.long   0x00000700      @ BANKCON0.long   0x00000700      @ BANKCON1.long   0x00000700      @ BANKCON2.long   0x00000700      @ BANKCON3  .long   0x00000700      @ BANKCON4.long   0x00000700      @ BANKCON5.long   0x00018005      @ BANKCON6.long   0x00018005      @ BANKCON7.long   0x008C07A3      @ REFRESH.long   0x000000B1      @ BANKSIZE.long   0x00000030      @ MRSRB6.long   0x00000030      @ MRSRB7

makefile

sdram.bin : head.S  leds.carm-linux-gcc  -c -o head.o head.Sarm-linux-gcc -c -o leds.o leds.carm-linux-ld -Ttext 0x30000000 head.o leds.o -o sdram_elfarm-linux-objcopy -O binary -S sdram_elf sdram.binarm-linux-objdump -D -m arm  sdram_elf > sdram.dis
clean:rm -f   sdram.dis sdram.bin sdram_elf *.o

leds.c

#define	GPFCON		(*(volatile unsigned long *)0x56000050)
#define	GPFDAT		(*(volatile unsigned long *)0x56000054)#define	GPF4_out	(1<<(4*2))
#define	GPF5_out	(1<<(5*2))
#define	GPF6_out	(1<<(6*2))void  wait(volatile unsigned long dly)
{for(; dly > 0; dly--);
}int main(void)
{unsigned long i = 0;GPFCON = GPF4_out|GPF5_out|GPF6_out;		// 将LED1,2,4对应的GPF4/5/6三个引脚设为输出while(1){wait(30000);GPFDAT = (~(i<<4));	 	// 根据i的值,点亮LED1,2,4if(++i == 8)i = 0;}return 0;
}

http://chatgpt.dhexx.cn/article/8gWQB8Mh.shtml

相关文章

数字IC实践项目(2)——高速SDRAM控制器的设计与综合(入门级工程项目)

数字IC实践项目&#xff08;2&#xff09;—高速SDRAM控制器的设计与综合&#xff08;入门级工程项目&#xff09; 写在前面的话项目简介和学习目的SDRAM简介SDRAM控制器简介完整项目框图SDRAM控制器项目框图SDRAM初始化模块SDRAM自动刷新模块SDRAM写模块SDRAM读模块SDRAM仲裁机…

SDRAM控制器——仲裁模块的实现

前面一文中&#xff0c;我们已经对SDRAM的上电初始化、自动刷新以及突发读写进行了学习。 本文跟着大佬学习SDRAM中的仲裁模块。 仲裁机制 仲裁&#xff08;arbit&#xff09;&#xff1a;在FPGA中&#xff0c;当多个source源同时发出请求&#xff0c;容易导致操作冲突&#x…

SDRAM读写控制器

第1节 –作者&#xff1a;小黑同学 本文为明德扬原创及录用文章&#xff0c;转载请注明出处&#xff01; 1.1 总体设计 1.1.1 概述 同步动态随机存取内存&#xff08;synchronous dynamic randon-access menory&#xff0c;简称SDRAM&#xff09;是有一个同步接口的动态随…

FPGA综合项目——SDRAM控制器

FPGA综合项目——SDRAM控制器 目录 1.整体框架2.串口接收模块3.接收模块测试仿真4.串口发送模块5.发送模块测试仿真6.SDRAM基础学习7.SDRAM顶层模块8.SDRAM初始化模块设计与仿真测试9.自动刷新模块设计与测试10.写模块设计与测试11.读模块设计与仿真测试12.通信处理模块13.顶层…

细说SDRAM控制器

SDRAM的基本概念 SDRAM凭借其极高的性价比&#xff0c;广泛应用于高速数据存储、实时图像处理等设计当中&#xff0c;但是相对于SRAM、FIFO等其他存储器件&#xff0c;SDRAM的控制相对复杂。虽说是复杂&#xff0c;但也不代表没办法实现&#xff0c;仔细梳理一下&#xff0c;发…

SDRAM控制器

1.SDRAM简介 简介&#xff1a;SDRAM为同步动态随机存储内存&#xff0c;同步指的是时钟与外部输入的时钟保持一致&#xff0c;也就是与外部共用一个时钟&#xff1b;动态指的是每个时间段内&#xff0c;都要进行一次刷新操作&#xff0c;否则里面的数据会丢失&#xff0c;这也…

FPGA学习历程(四):SDRAM 控制器(初始化与刷新)

目录 一、数据手册相关信息1.1 命令真值表1.2 时间参数1.3 模式寄存器配置 二、初始化模块2.1 模块时序图2.2 模块源码2.2.1 sdram_init.v2.2.2 sdram_top.v2.2.3 tb_sdram_top.v 2.3 Modelsim仿真 三、刷新模块3.1 模块时序图3.2 模块源码3.2.1 sdram_aref.v3.2.2 sdram_top.v…

手把手带你实现SDRAM控制器(带Verilog代码)

上篇博客&#xff0c;我们了解了SDRAM的控制命令以及寻址方式&#xff0c;SDRAM芯片需要配合专门的控制电路使用才能发挥功能&#xff0c;这一节我们将一步步分析&#xff0c;使用Verilog搭建一个SDRAM驱动控制器。 目录 学习目标 问题分析 初始化模块 信息收集 模块接口确…

SDRAM 控制器(一)

1、基础知识 SDRAM&#xff08;synchronous Dynamic Random &#xff09;&#xff0c;同步动态随机存储器&#xff0c;同步指内存工作需要同步时钟&#xff0c;内存的命令的发送和数据的接收都以它为标准。动态是指需要不断地刷新来保证数据不丢失&#xff08;电容存储&#xf…

操作系统面试题(二十一):什么是DMA

DMA DMA&#xff08;Direct Memory Access 直接内存访问&#xff09; DMA意味着CPU授予I/O模块权限不涉及在不涉及CPU的情况下依然可以读取/写入内存&#xff0c;即DMA不需要CPUde支持 DMAC&#xff08;DMA 控制器&#xff09; 控制直接内存访问的过程 DMA的优点&#xff1a…

操作系统面试题:虚拟内存是什么,解决了什么问题,如何映射?

虚拟内存是什么&#xff1f; 虚拟内存别称虚拟存储器&#xff08;Virtual Memory&#xff09;。电脑中所运行的程序均需经由内存执行&#xff0c;若执行的程序占用内存很大或很多&#xff0c;则会导致内存消耗殆尽。为解决该问题&#xff0c;Windows中运用了虚拟内存技术&…

Linux面试题(34道)

1、Linux中各个目录的作用 1&#xff09;/ 根目录 2&#xff09;/boot 引导程序&#xff0c;内核等存放的目录 3&#xff09;/sbin 超级用户可以使用的命令的存放目录 4&#xff09;/bin 普通用户可以使用的命令的存放目录 5&#xff09;/lib 根目录下的所程序的共享库目录 6&…

【游戏客户端面试题干货】-- 2021年度最新游戏客户端面试干货(操作系统篇)

【游戏客户端面试题干货】-- 2021年度最新游戏客户端面试干货(操作系统篇&#xff09; 大家好&#xff0c;我是Lampard~~ 经过一番艰苦奋战之后&#xff0c;我终于是进入了心仪的公司。 今天给大家分享一下我在之前精心准备的一套面试知识。 今天和大家分享的是操作系统相关的面…

操作系统和网络(一):计算机网络常见面试题

计算机网络常见面试题总结 1. OSI &#xff0c; TCP/IP &#xff0c;五层协议的体系结构 OSI分层&#xff08;7层&#xff09; &#xff1a;物理层、数据链路层、网络层、传输层、会话层、表示层、应用层。 TCP/IP分层&#xff08;4层&#xff09; &#xff1a;网络接…

【Java实习生】每日面试题打卡——操作系统篇

临近秋招&#xff0c;备战暑期实习&#xff0c;祝大家每天进步亿点点&#xff01;Day15本篇总结的是 操作系统 相关的面试题&#xff0c;后续会每日更新~ 1、请分别简单说一说进程和线程以及它们的区别? 根本区别&#xff1a;进程是操作系统资源分配的基本单位&#xff0c;而…

操作系统面试题(一)

请你说一下进程与线程的概念&#xff0c;以及为什么要有进程线程&#xff0c;其中有什么区别&#xff0c;他们各自又是怎么同步的 参考回答&#xff1a; 基本概念&#xff1a; 进程是对运行时程序的封装&#xff0c;是系统进行资源调度和分配的的基本单位&#xff0c;实现了…

操作系统面试常问——for考研复试面试

关于操作系统的一些面试常问问题 前言&#xff1a; 本人22考研党已上岸&#xff0c;发一些复试准备整理的资料作为对考研准备的一个收尾。由于近几年基本都是线上复试&#xff0c;线上的话会更加注重概念的考察&#xff0c;本人在复试准备期间搜集了面试题&#xff0c;整理了…

操作系统面试题(三)

请你来说一说协程 参考回答&#xff1a; 1、概念&#xff1a; 协程&#xff0c;又称微线程&#xff0c;纤程&#xff0c;英文名Coroutine。协程看上去也是子程序&#xff0c;但执行过程中&#xff0c;在子程序内部可中断&#xff0c;然后转而执行别的子程序&#xff0c;在适…

操作系统面试题(十四):什么是虚拟内存?

虚拟内存&#xff08;virtual Memory&#xff09; 日常生活中&#xff0c;当我们使用电脑的时候&#xff0c;尤其是windows电脑&#xff0c;经常会打开许多软件&#xff0c;这些软件占用的内存已经远远大于计算机的物理内存。之所以会这样&#xff0c;就是因为虚拟内存的存在 …

操作系统面试题:设备管理

管理什么设备&#xff1f; 除cpu,内存外的所有设备 怎么管理设备&#xff1f; 通过将物理设备映射成逻辑设备 为什么要把物理设备映射成逻辑设备&#xff1f; 物理设备是I/O系统中实际安装的设备&#xff0c;物理名通常是字符串或者ID 而逻辑设备的逻辑名比较好记 如何理解…