SRAM的读写操作

     自己写的SRAM的程序,主要在于实用性,适应工作的工程需要。使用芯片为:

     芯片时序图为:

     

   

   代码:

     

    /********************************Copyright**************************************                           
    **----------------------------File information--------------------------
    ** File name  : ZF_SRAM.v
    ** CreateDate :2014.11
    ** Funtions   : SRAM的读写功能,CS、LB、UB都被固定住(CS1 =L,CS2 =H,LB=L,UB=L)。读:WE =H,OE =L/写:we = L,OE = X;
                                    上电之后,先对SRAM 进行初始化,然后再写入读出。
                                    sram上半屏的数据地址:0- 5183(288*18),下半屏地址:5184 - 10367
    ** Operate on :M5C06N3L114C7
    ** Copyright  :All rights reserved. 
    ** Version    :V1.0
    **---------------------------Modify the file information----------------
    ** Modified by   :
    ** Modified data :        
    ** Modify Content:
    *******************************************************************************/
     

    module ZF_SRAM(
                                    clk_90m,
                                    rst_n,
                                    
                                    wr_reg,   //写数据使能
                                    rd_reg,   //读数据使能
                                    
                                    
                                    addr_wr_reg,  //写数据地址
                                    addr_rd_reg,  //读数据地址
                                    data_wr_reg,  //写操作数据寄存器
                                    data_rd_reg,  //读出的数据寄存器
                                    
                                    cs_sram,
                                    wr_sram,        //we
                                    rd_sram,        //oe
                                    addr_sram,
                                    data_sram_wr,    //写入的数据
                                    data_sram_rd,    //读入的数据
                                    dir_data,        //数据方向控制
                                    wr_over,
                                    rd_over,
                                    
                                    test_1,
                                    test_2
                                                                                                
                                        );

     parameter  width = 16;
        
    input               clk_90m;
    input               rst_n;

    input                wr_reg;        //写使能
    input                rd_reg;        //读使能


    input  [width -1:0]  addr_wr_reg;   //地址寄存器
    input  [width -1:0]  addr_rd_reg;   //地址寄存器
    input  [width -1:0]  data_wr_reg;   //待写数据寄存器
    output [width -1:0]  data_rd_reg;   //读出的数据寄存器
    reg    [width -1:0]  data_rd_reg_1;   //读出的数据寄存器


    output     reg       wr_sram;       //we
    output     reg       rd_sram;       //oe
    output     reg       cs_sram;

    output   reg  [width-1:0]   addr_sram;    //写出的信号
    output   reg  [width-1:0]   data_sram_wr; //写出的数据 
    input         [width-1:0]   data_sram_rd; //读入的数据
    output   reg                dir_data;     //数据方向的控制
    output   reg                wr_over;
    output   reg                rd_over;
    reg           [width-1:0]   data_zifu;
     output                     test_1;
     output                     test_2;
     
        //***************读写状态机**********************//
     parameter   idel_0 = 5'd0;      //初始化显示界面
     parameter   idel_1 = 5'd1;      //初始化显示界面2 
     parameter   idel_2 = 5'd2;      //初始化显示界面
     parameter   idel_3 = 5'd3;      //初始化显示界面2 
     parameter   idel_4 = 5'd4;      //初始化显示界面 
     parameter   idel_5 = 5'd5;      //初始化显示界面 
     
     parameter   idel = 5'd6;
     parameter   wr_1 = 5'd7;        //拉低cs
     parameter   wr_2 = 5'd8;        //拉低wr
     parameter   wr_3 = 5'd9;        //保持
     parameter   wr_4 = 5'd10;        //拉高cs,wr
     parameter   wr_5 = 5'd11;        //拉高结束
     parameter   wr_6 = 5'd12;        //拉低结束
     parameter   wr_7 = 5'd13;        //拉低结束
                         /* 留几个状态间隔 */
     
     parameter   rd_1 = 5'd17;        //拉低cs
     parameter   rd_2 = 5'd18;        //拉低rd 
     parameter   rd_3 = 5'd19;        //保持 
     parameter   rd_4 = 5'd20;        //拉高cs,rd 
     parameter   rd_5 = 5'd21;        //拉高结束
     parameter   rd_6 = 5'd22;        //拉低结束
   parameter   rd_7 = 5'd23;        //拉低结束
     
     reg     [4:0]      state;
     reg     [15:0]     i;
     always @(posedge clk_90m or negedge rst_n)
     begin
        if(!rst_n)
         begin
                state <= idel_0;
                data_zifu <= 0;
                wr_sram <= 1;
                rd_sram <= 1; 
                cs_sram <= 1;
                addr_sram<= 0;
                data_sram_wr<= 0;
                dir_data <= 1;
                wr_over <= 0;
                rd_over <= 0;
                i <= 0;
            end
        else   
            begin
             case(state)    
                idel_0:
                     begin
                                wr_sram  <= 1;
                                rd_sram  <= 1; 
                                cs_sram  <= 1;
                                
                                addr_sram <= 0;
                                dir_data <= 1;
                                state <= idel_1;          
                            end
                idel_1:
                     begin
                            if(i >10 ) 
                                begin
                                        i <= 0;
                                        state <= idel;
                                end
                            else
                                    begin
                                         addr_sram <= i;    
                                         data_sram_wr <= 16'h0000;
                                         state <= idel_2;
                                        end    
                         end
             idel_2:
                     begin     
                            cs_sram <= 0;    
                            state <= idel_3;                            
                         end
             idel_3:
                     begin        
                            state <= idel_4;         
                            wr_sram <= 0;     
                         end
             idel_4:
                     begin
                          state <= idel_5;         
                             wr_sram <= 0;                     
                        end
            idel_5 :
               begin
                        wr_sram <= 1;
                        cs_sram <= 1;    
                         i <= i + 1;
                        state <= idel_1;
                    end
        //----------------------------//
          /* 初始化完毕  */
                idel:
                    begin                        
                        wr_sram  <= 1;
                        rd_sram  <= 1; 
                        cs_sram  <= 1;
                        
                        addr_sram <= 0;
                        dir_data <= 0;
                        wr_over <= 0;
                        rd_over <= 0;    
                        if(wr_reg)     //写使能有效
                            begin
                                dir_data <= 1;     //写方向
                                addr_sram <= addr_wr_reg;  //寄存地址
                data_sram_wr <= data_wr_reg; //寄存写入的数据    
                                state <= wr_1;
                            end
                         else if(rd_reg)
                             begin
                                 dir_data <= 0;     //读方向     
                                 addr_sram <= addr_rd_reg;  //寄存地址
                                 state <= rd_1;     
                                end
                        else 
                            state <= idel;
                    end
             wr_1:
                 begin             
                        state <= wr_2;
                        cs_sram <= 0;    
                     end
             wr_2:
                 begin             
                     state <= wr_3;
                     wr_sram <= 0;    
                  end
                wr_3:
                 begin                                    
                     state <= wr_4;
                     wr_sram <= 0;    
                  end    
                wr_4:
                 begin                                     
                       state <= wr_5;
             cs_sram <= 1;    
                         wr_sram <= 1;    
                     end                     
                wr_5:
                    begin
                        wr_over <= 1;
                        state <= wr_6;
                    end
              wr_6:
                    begin
                        wr_over <= 0;
                        state <= idel;
                    end    
    
        //-------------------//            
                rd_1:
                    begin    
                             state <= rd_2;
                             cs_sram <= 0; 
                     end
                rd_2:
                    begin
                             state <= rd_3;
                             rd_sram <= 0;     
                     end
                rd_3:
                    begin
                         state <= rd_4;
                         rd_sram <= 0;     
                     end     
                rd_4:
                    begin
                         data_zifu <= data_sram_rd;  //读取数据        
                         state <= rd_5;
                         rd_sram <= 1; 
                         cs_sram <= 1;   
                     end                                       
                rd_5:
                     begin
                         rd_over <= 1;   
                         state <= rd_7;    
                     end
                rd_6:
                     begin
                         rd_over <= 0;    
                         state <= idel;    
                     end 
                default:state <= idel;
             endcase 
            end
        end
        

    always @(posedge clk_90m or negedge rst_n)
     begin
        if(!rst_n)
         begin
             data_rd_reg_1 <= 0;
            end
        else if(rd_over)
            begin
                data_rd_reg_1 <= data_zifu; 
             end
        else
                data_rd_reg_1 <= data_rd_reg_1;     
        end
        
   assign data_rd_reg = data_rd_reg_1;  
    //----------------------------
     assign  test_1 = wr_reg;
     assign  test_2 = data_sram_wr[7];
     
     
    endmodule
View Code

 

仿真后复合读写时序。

 为了检测sram是否读写成功,则可以让FPGA来来写数据,用单片机来读取数据,然后在线验证是否读取的数据是否正确:

 程序打包上传,链接地址为:http://i.cnblogs.com/Files.aspx

 

posted @ 2015-05-26 22:22  远航路上ing  阅读(5033)  评论(0编辑  收藏  举报