sharpedge 发表于 2011-7-10 11:02:07

SRAM控制代码,各位看看时序对不对

从网上载了几个SRAM控制代码,各种不能用。于是照着时序图写了一个,请各位看看有没有时序上的错误。

读时序

http://cache.amobbs.com/bbs_upload782111/files_42/ourdev_656406TMY8QL.png
读时序 (原文件名:读时序.png)

写时序

http://cache.amobbs.com/bbs_upload782111/files_42/ourdev_656407HSH6KT.png
写时序 (原文件名:写时序.png)

oe、ce 接地, 用we信号控制读写,
我的操作过程如下:
读:1、打开读信号,锁存地址传到地址总线
    2、锁存数据,关闭读信号
写:1、打开写信号,锁存地址和数据
    2、等待SRAM总线高阻形成
    3、关闭写信号,完成写过程

不知这样操作行不行?

代码如下:

module sram_ctrl (
        clk,rst_n,
        read,write,addr_i,wdata_i,rdata_o,
        SRAM_DQ,
        SRAM_ADDR,SRAM_LB_N,SRAM_UB_N,SRAM_CE_N,SRAM_OE_N,SRAM_WE_N

);

input                                clk;
input                                rst_n;

input                        addr_i;
input                                read;
input                                write;
input                        wdata_i;

output                        rdata_o;

inout                        SRAM_DQ;                // SRAM Data bus 16 Bits

output                        SRAM_ADDR;                // SRAM Address bus 18 Bits
output                                SRAM_LB_N;                // SRAM Low-byte Data Mask
output                                SRAM_UB_N;                // SRAM High-byte Data Mask
output                                SRAM_CE_N;                // SRAM Chip chipselect
output                                SRAM_OE_N;                // SRAM Output chipselect
output                                SRAM_WE_N;                // SRAM Write chipselect


assign SRAM_LB_N=1'b1;
assign SRAM_UB_N=1'b1;
assign SRAM_OE_N=1'b1;
assign SRAM_CE_N=1'b1;

reg HIGHZ;
reg SRAM_ADDR_r;
reg SRAM_WE_N_r;
reg rdata_r;
reg wdata_r;

reg CS;      //状态寄存
parameter IDLE=0;
parameter R_START=1;
parameter R_FINISH=2;
parameter W_START=3;
parameter THIGHZ=4;
parameter W_FINISH=5;

always@(posedge clk or negedge rst_n)
if(!rst_n)begin
        HIGHZ<=0;
        SRAM_WE_N_r<=1;
        SRAM_ADDR_r<=0;
        rdata_r<=0;
        wdata_r<=0;
        end
else begin
        case(CS)
        IDLE:        begin
                        HIGHZ<=0;
                        if(read) CS<=R_START;
                        else if(write) CS<=W_START;
                        else CS<=IDLE;
                        end
        R_START:begin
                        SRAM_WE_N_r<=1;
                        SRAM_ADDR_r<=addr_i;
                        CS<=R_FINISH;
                        end
        R_FINISH:begin            
                        rdata_r<=SRAM_DQ;
                        SRAM_WE_N_r<=0;
                        CS<=IDLE;
                        end
        W_START:begin
                        SRAM_WE_N_r<=0;
                        SRAM_ADDR_r<=addr_i;
                        wdata_r<=wdata_i;
                        CS<=THIGHZ;
                        end
        THIGHZ:begin                              //等待SRAM总线上拉成高阻
                        CS<=W_FINISH;
                        HIGHZ<=1;             //高阻形成信号,送给inout做判断
                        end
        W_FINISH:begin
                       
                        SRAM_WE_N_r<=1;
                        CS<=IDLE;
                        end
        default:CS<=IDLE;
        endcase
        end
       
assign SRAM_DQ=HIGHZ ? wdata_r : 16'bzzzz_zzzz_zzzz_zzzz; //HIGHZ控制inout方向

assign         SRAM_WE_N=SRAM_WE_N_r;
assign        SRAM_ADDR=SRAM_ADDR_r;
assign        rdata_o=rdata_r;

endmodule

sharpedge 发表于 2011-7-11 20:53:32

好几天了都没人看看吗?大神们搞起啊。。。

sharpedge 发表于 2011-7-12 13:45:05

没人回帖,自己琢磨

just_thinking 发表于 2011-7-14 13:07:43

自个仿真一下不是更方便,在仿真文件中加个RAM的虚拟器件,就能很容易的仿真出效果了

lkl10800139 发表于 2012-4-25 01:59:09

看图,貌似你用的塞朴拉斯的sram吧。

change_life 发表于 2012-4-25 08:14:02

不知道 呵呵
页: [1]
查看完整版本: SRAM控制代码,各位看看时序对不对