从网上载了几个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 |
|