查看: 824|回复: 0
打印 上一主题 下一主题

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

[复制链接]
跳转到指定楼层
沙发
发表于 2016-5-8 23:53:35 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
从网上载了几个SRAM控制代码,各种不能用。于是照着时序图写了一个,请各位看看有没有时序上的错误。

读时序


读时序 (原文件名:读时序.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                [22:0]        addr_i;
input                                read;
input                                write;
input                [15:0]        wdata_i;

output                [15:0]        rdata_o;

inout                [15:0]        SRAM_DQ;                // SRAM Data bus 16 Bits

output                [22:0]        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 [22:0] SRAM_ADDR_r;
reg SRAM_WE_N_r;
reg [15:0] rdata_r;
reg [15:0] wdata_r;

reg [2:0] 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







回复

使用道具 举报

您需要登录后才可以回帖 登录 | 加入因仑

本版积分规则

快速回复 返回顶部 返回列表