SDR SDRAM读写控制器————写数据模块设计

 =================================================

 目录

  1、SDR SDRAM读写控制器————整体概述

  2、SDR SDRAM读写控制器————上电模块设计

  3、SDR SDRAM读写控制器————刷新模块设计  

  4、SDR SDRAM读写控制器————定时器模块设计

  5、SDR SDRAM读写控制器————写数据模块设计

  6、SDR SDRAM读写控制器————读数据模块设计

  7、SDR SDRAM读写控制器————主控制机模块设计

 =================================================

写数据模块时序图:

写数据模块状态转移图:

写数据模块程序设计:

`include "../rtl/head.v"

//写数据状态机
module wr_fsm(
          clk        ,//100MHz的时钟信号
          soft_rst_n ,//软复位
          wr_en      ,//写使能
          wr_done    ,//写操作完成信号
          row        ,//行地址
          col        ,//列地址
          ba         ,//Bank地址
          wdata      ,//外部输入的写数据 16bit位宽
          wr_bus     ,//写的地址和命令总线
          dq_out     ,//两个时钟装配后数据输出(32bit位宽) 准备发往SDR 
          out_en      //三态门开关,如果使能的话,把dq_out数据发往SDR_dq上面。写入SDR
);

input clk            ;
input soft_rst_n     ;
input wr_en          ;
input [12:0] row     ;//13bit位宽
input [9:0] col      ;//10bit位宽
input [1:0] ba       ;//Bank地址总线
input [31:0] wdata   ;//Avalon上面过来的写数据(31bit)

output reg wr_done   ; 
output [19:0] wr_bus ;
output reg [15:0] dq_out;
output reg out_en    ;

reg [2:0] cnt        ;
reg [1:0] state      ;

reg [3:0] wr_cmd     ;
reg [12:0] wr_a      ;
reg [1:0] wr_ba      ;
reg wr_cke           ;

parameter s0 = 2'b00;
parameter s1 = 2'b01;
parameter s2 = 2'b11;
parameter s3 = 2'b10;

assign wr_bus = {wr_cmd,wr_a,wr_ba,wr_cke};//组装写数据模块的命令和地址总线

always@(posedge clk) begin
if(!soft_rst_n)begin//同步复位
  wr_done <=  1'b0  ;
  wr_cmd  <=  `NOP  ;
  wr_a    <=  13'b0 ;
  wr_ba   <=  2'b0  ; 
  wr_cke  <=  1'b1  ;
  dq_out  <=  1'b0  ;
  out_en  <=  1'b0  ;
  cnt     <=  3'd0  ;
  state   <=  s0    ;
end
else 
   case(state)
    s0: if(!wr_en)
            state     <= s0            ;
         else begin                     //如果写使能打开
            wr_cmd    <= `ACT          ;//发送激活命令
            wr_a      <= row           ;//发送行地址 
            wr_ba     <= ba            ;//发送Bank地址
            wr_done   <= 0             ;
            state     <= s1            ;
         end
        
    s1: if(cnt < `tRCD - 1)begin        //经过TRCD周期  
            cnt       <= cnt + 1       ;
            wr_cmd    <= `NOP          ;
            state     <= s1            ;
         end
         else begin
            wr_cmd    <= `WR           ;//发送写命令
            wr_a[9:0] <= col           ;//发送列地址
            wr_a[10]  <= 1             ;//自动管理purchage 
            cnt       <= 3'd0          ;
            out_en    <= 1             ;//打开写入SDR的三态门开关
            dq_out    <= wdata[15:0]   ;//装配低16bit数据    
            state     <= s2            ;
         end
         
    s2: begin
            wr_cmd    <= `NOP          ;
            out_en    <= 1             ;//打开写入SDR的三态门开关
            dq_out    <= wdata[31:16]  ;//装配高16bit数据
            state     <= s3            ;
         end
    s3:begin
            wr_done   <= 1'b1          ;
            out_en    <= 1'b0          ;
            state     <= s0            ;
        end
            
    endcase

end


endmodule

参考视频链接: 至芯科技李凡老师FPGA课堂:SDRAM控制器设计(超级经典)-学习视频教程-腾讯课堂

参考文档: Micron的MT48LC16M16A2器件文档

原文地址:https://www.cnblogs.com/weitter/p/14595899.html