FPGA之SDRAM控制器设计(一)

article/2025/10/26 12:08:52

MT48LC128M4A2 – 32 Meg x 4 x 4 banks是512M SRAM,总体概述如下图

 

 

分别从上电初始化,刷新,写,读四个部分进行设计,此外还包含主控状态机,一个顶层。

1:上电初始化

整体架构:从控制器到要控制的芯片可以分成20位的bus总线,时钟线sdr_clk,数据总线DQ以及DQM。上电时候主要是对bus总线的高4位也就是sdr_cmd进行配置。也就是要做的第一步,比较简单就是对sdr_cmd进行几次操作。其中注意在逻辑设计时候输出的sdr_clk时钟要和控制器的时钟相差180°,实际上不是这样的后仿的时候要根据有效窗口调动。软复位soft_rst_n,是由pll分频器产生的稳定信号打两拍得到的。

 

 

下图是sdr_cmd命令功能对应的数值,对于上电如果感觉对英文文档读的比较枯燥那先别care,主要把下面这张图的命令看懂。。例如一个命令INHIBIT(禁止)CS#,RAS#,CAS#,WE#设置为1xxx,后面三位don’t care。

 

 

下面引脚从CLK到DQ是通过FPGA进行控制时要用到的,各个功能在右侧有描述。

 

 

 

下图是初始上电的时序图,上电过程做到Tp+2即可。在上电要等100us待供电和时钟稳定后进行操作,用到的时钟是100MHz,需要一个计数器记到100us后发出下一个命令NOP,再到预充电PRECHARGE,等待tRP时间后再AUTO REFRESH,后面的看下图。tRP,Trfc,Tmrd,这些参数在手册上都有,在下面设计文件中头文件有涉及到。就按照这个时序进行初始化的设计状态转移图就可有可无。

头文件:head.v


//开关参数
`define tRP 2
`define	tRFC 7
`define tMRD 2
`define T100us 10000
`define tWCD 2
`define tRCD 2
`define SL  2
`define CL  2//命令cmd={cs_n,ras_n,cas_n,we_n}
`define INH 4'b1000
`define NOP 4'b0111
`define ACT 4'b0011
`define RD	4'b0101
`define WR	4'b0100
`define	BT	4'b0110		//burst terminal
`define PRE 4'b0010
`define REF 4'b0001
`define LMR 4'b0000//模式寄存器设置
`define OP 13'b0_0000_0010_0001//多路选择器开关
`define	MUX_INIT 2'b00
`define	MUX_REF	 2'b01
`define	MUX_WR   2'b10
`define	MUX_RD	 2'B11

初始化设计:

`include	"head.v"module	init_fsm(clk,init_en,local_wdata,local_rdata,local_write,local_read,local_ready,local_addr,local_rddatavalid,sdr_a,sdr_ba,init_cmd,sdr_cke,init_done,soft_rst_n,init_bus
);input			clk;input			init_en;input			soft_rst_n;input	[31:0]	        local_wdata;output	[31:0]	        local_rdata;input			local_read,local_write,local_ready;input	[24:0]	        local_addr;input			local_rddatavalid;output	reg	[12:0]	sdr_a;output	reg	[1:0]	sdr_ba;output	reg	[3:0]	init_cmd;output	reg		sdr_cke;output	reg		init_done;output		[19:0]	init_bus;reg		[14:0]	cnt;reg		[2:0]	state;localparam	s0 = 3'b000;localparam	s1 = 3'b001;localparam	s2 = 3'b010;localparam	s3 = 3'b011;localparam	s4 = 3'b100;localparam	s5 = 3'b101;localparam	idle = 3'b110;assign init_bus = {init_cmd,sdr_a,sdr_ba,sdr_cke};always @(posedge  clk)beginif(soft_rst_n == 1'b0)beginsdr_a <= 'd0;sdr_ba <= 'd0;init_cmd <= `INH;//inhabit禁止命令INH= 4'b1000		8sdr_cke <= 1'b0;cnt <= 'd0;init_done <= 1'b0;state <= idle;//idle=6endelsecase(state)idle : if(init_en == 1'b0)state <= idle;elsebegininit_done <= 1'b0;state <= s0;ends0 : if(cnt < `T100us - 1)begincnt <= cnt +1'b1;state <= s0;endelsebegincnt <= 'd0;sdr_cke <= 1'b1;init_cmd <= `NOP;//空操作`NOP =4'b0111    7state <= s1;ends1 : begininit_cmd <= `PRE;//预充电`PRE= 4'b0010        2sdr_a[10] <= 1'b1;state <= s2;ends2 : if(cnt < `tRP - 1)//tRP=2begincnt <= cnt +1'b1;init_cmd <= `NOP;//NOP=0111 				 7state <= s2;endelsebegincnt <= 'd0;init_cmd <= `REF;// REF= 4'b0001			 1state <= s3;end s3 : if(cnt < `tRFC - 1'b1 )//tRFC=7begincnt <= cnt + 1'b1;init_cmd <= `NOP;state <= s3;endelsebegincnt <= 'd0;init_cmd <= `REF;//	1state <= s4;						end  s4 : if(cnt	< `tRFC - 1)//7begincnt	 <= cnt + 1'b1;init_cmd <= `NOP;endelsebegincnt	<= 'd0;init_cmd <= `LMR;//load mode registersdr_a <= `OP;state <= s5;ends5 : if(cnt	< `tMRD - 1)//tMRD= 2begincnt <= cnt + 1'b1;init_cmd <= `NOP;state <= s5;endelse begincnt <= 'd0;init_done <= 1'b1;state <= idle;endendcase		endendmodule

初始化的顶层文件只需要将上面的module例化一下在加上下面一段代码即可

always @(posedge clk or posedge global_reset)//输出稳定的软复位信号if(global_reset == 1'b1)beginr0 <= 1'b0;r1 <= 1'b0;r2 <= 1'b0;soft_rst_n <= 1'b0;endelse begin : delay_2clkr0 <= locked;r1 <= r0;r2 <= r1;soft_rst_n <= r2;end

 


http://chatgpt.dhexx.cn/article/UwUvSuHA.shtml

相关文章

内存控制器与SDRAM【赞】

原文链接&#xff1a;https://blog.csdn.net/qq_31216691/article/details/87115697 内存接口概念&#xff1a; 通常ARM芯片内置的内存很少&#xff0c;要运行Linux&#xff0c;需要扩展内存。ARM9扩展内存使用SDRAM内存&#xff0c;ARM11使用 DDR SDRAM。S3C2440通常外接32位6…

SDRAM 介绍

目录 1、名词解释 2、SDRAM 内部结构 3、SDRAM 外部信号描述 4、SDRAM 命令 4.1、COMMAND INHIBIT 4.2、NO OERATION 4.3、ACTIVE 4.4、LOAD MODE REGISTER (LMR) 4.5、READ 4.6、WRITE 4.7、PRECHARGE 4.8、BURST TERMINATE 4.9、REFRESH 4.9.1、AUTO REFRESH …

SDRAM控制器操作时序

此为学习http://dengkanwen.com/137.html整理的笔记&#xff0c;侵删&#xff01; SDRAM工作原理 内部的状态跳转图 我们所需关注的几个地方&#xff1a; 1&#xff09;粗黑线表示在该状态下会自动跳转到另一个状态&#xff0c;细黑线表示需要给命令才会跳转。 2&#xff09…

SDR SDRAM控制器设计

目录 前言 1、关于刷新 2、关于数据中心对齐 3、SDRAM芯片手册介绍 3.1SDRAM芯片的管脚 3.2 SDRAM指令集 3.3 模式寄存器 3.4 关于SDRAM上电初始化和装载模式寄存器 3.5 SDRAM刷新时序 3.6 关于写访问 3.7 关于突发访问 4、FPGA工程设计 4.1状态机设计 5、仿真测试…

【GD32】从零开始学GD32单片机高级篇——外部存储器控制器EXMC详解+SDRAM读写例程

目录 简介外部设备地址映射NOR和PSRAM的地址映射NAND/PC Card地址映射SDRAM地址映射 NOR/PSRAM控制器接口描述控制时序模式1模式2 NAND Flash或PC Card控制器接口描述控制时序 SDRAM控制器接口描述控制时序突发读操作突发写操作读写FIFO跨边界读写操作低功耗模式自刷新模式掉电…

初识内存控制器和SDRAM【一文了解】

原文链接&#xff1a;https://blog.csdn.net/qq_36243942/article/details/85596249 目录 1.引入内存控制器 2.不同位宽内存设备之间的连接 3.如何确定芯片的访问地址 4.分析读写NOR FLASH的读写时序 5.SDRAM初识 6.编程读/写 SDRAM 附录&#xff1a;源代码 1.引入内存控制器 我…

存储控制器(SDRAM操作)

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

数字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;我终于是进入了心仪的公司。 今天给大家分享一下我在之前精心准备的一套面试知识。 今天和大家分享的是操作系统相关的面…