FPGA学习笔记 SDRAM操作.2

sdram_ctrl 顶端模块

1.需要注意各个子模块所传入的addr地址信息的位宽

   方案所选芯片结构为   4Meg x 16 x 4

     4Meg:  8192 x 512 =4,294,304        存储地址标定【从0开始计数的】 

                  2^13  = 8192   ----------即单个L_bank含8192行--------------只需13位宽

                  2^9    = 512     ----------即每一行含512列---------------------- 只需9位宽

      4  :      即共4个L_bank,2^2  ----------------------------------------------只需2位宽 

     16 :      每个最小存储单元的数据位宽为16bit --------------------------基本数据位宽16

 output  reg     [1:0]   sdram_ba    ,   //SDRAM Bank地址
 output  reg     [12:0]  sdram_addr  ,   //SDRAM地址总线
 inout   wire    [15:0]  sdram_dq        //SDRAM数据总线

             

1)写操作模块     

     输入信号(部分)          {bank地址,行地址,列地址}      2+ 13 + 9 = 24

input   wire  [23:0]   wr_addr        ,
input   wire  [15:0]   wr_data        ,
input   wire  [9:0]    wr_burst_len   ,

    输出信号(部分)

output  reg  [1:0]     wr_ba          ,
output  reg  [12:0]    wr_sdram_addr  ,

  在做为输出时,行、列地址共用一个端口,故选择两者位宽最大者,因为sdram运作模式中,行    列的选择是分开在不同命令中

  激活指令:激活特定bank的特定行

  WR_ACTIVE :   //激活阶段
 
       begin
              wr_cmd         <=  ACTIVE         ;
              wr_ba          <=  wr_addr[23:22] ;
              wr_sdram_addr  <=  wr_addr[21:9]  ;     
        end

  写操作: 在前面已激活的行。指定列起始位置,作为写突发长度的起点

WR_WRITE :    //写指令阶段
       begin
             wr_cmd         <=  WRITE                  ;
             wr_ba          <=  wr_addr[23:22]         ;
             wr_sdram_addr  <=  {4'b0000,wr_addr[8:0]} ; 
       end

2)读操作模块  

   输入信号(部分)        {bank地址,行地址,列地址}      2+ 13 + 9 = 24

input   wire  [23:0]   rd_addr        ,
input   wire  [9:0]    rd_burst_len   ,
input   wire  [15:0]   rd_data        ,

  输出信号(部分)

output  reg  [1:0]     rd_ba          ,
output  reg  [12:0]    rd_sdram_addr  ,

 激活指令:激活特定bank的特定行

 RD_ACTIVE :    //激活阶段

       begin                               
             rd_cmd         <=  ACTIVE;         
             rd_ba          <=  rd_addr[23:22] ;
             rd_sdram_addr  <=  rd_addr[21:9]  ;
       end   

                              

读操作: 在前面已激活的行基础上,指定列起始位置 ,作为读突发长度的起点

RD_READ  :     //读指令阶段

      begin                                       
           rd_cmd         <=  READ;                   
           rd_ba          <=  rd_addr[23:22] ;        
           rd_sdram_addr  <=  {4'b0000,rd_addr[8:0]} ;
                                         
       end  

3)自动刷新模块

   13位宽,因为刷新的基本单位为行,无需包含列地址

 output  reg  [12:0]  aref_addr ,
 output  reg  [1:0]   aref_ba   ,
 

4)初始化模块

     13位宽---初始化的基本内容就是  1.预充电  2.自动刷新  3.配置模式寄存器(A0~A12地址来进行        配置)

     预充电    :基本单位为bnak

     自动刷新: 基本单位为行,

 刷新速度为: 64ms/行,即必须在64m内刷新所有行,sdram内部会依次自动生成行地址,所以无     需 列寻址,全部置1即可。 且执行自动化刷新命令前,必须先要执行预充电指令,关闭所  有 L- bank.

output  reg  [12:0]  init_addr,
output  reg  [1:0]   init_ba  ,


   自动刷新指令阶段

AUTO_REF :   /* 自动刷新指令 */
   begin
    aref_cmd   <=  A_REF;
    aref_ba    <=  2'b11;
    aref_addr  <=  13'h1fff;    
   end

   

2.理解读写“突发长度”的意义

input   wire  [9:0]    rd_burst_len   ,      

   我们应用的sdram芯片为每一行包含2的9方即512个列,故需位宽为10

   需要注意的是:方案芯片每一行包含2^9即512列

                            在标定列地址时,0可以表示地址,故可从0开始计数,addr 只需9位宽

                            在计量突发长度是,最小突发长度为1,故需要10个位宽

3.理解刷新模块的运作模式

       刷新模块,不需要外部的刷新请求信号来驱动模块运作,只要 init_end 有效,即初始化完成,就开始计数“刷新间隔”,计满,内部释放 aref_req  信号,同时 三种请求信号优先级

                             aref_req   > write_req  , read_req

  

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值