|
sram IC61LV25616 读写有问题
module sram_w( iRst ,
iClk ,
oSram_a ,
Sram_dq ,
data_my ,
dataout ,
hs,
vs,
oSram_we_n,
oSram_oe_n,
oSram_ce_n,
oSram_be_n,
flag,readsram,writesram
);
input iRst ;
input iClk ;
input hs,vs ;
input [15:0] data_my ;
output [17:0] oSram_a ;
output [15:0] dataout ;
inout [15:0] Sram_dq ;
output [1:0] oSram_be_n;
output oSram_we_n;
output oSram_oe_n;
output oSram_ce_n;
output flag,readsram,writesram;
reg flag;
reg [17:0] oSram_a ;
reg oSram_we_n;
wire [1:0] oSram_be_n;
wire oSram_ce_n;
wire oSram_oe_n;
//wire oSram_oe_n;
reg [15:0] Sram_dq; //定义数据寄存器
reg [15:0] Sram_dq_reg;
reg [15:0] dataout;
reg [1:0]tt;
reg yy;
reg [15:0]tmp;
reg readsram;
reg writesram;
//reg [15:0]Sram_dqr;
//assign Sram_dq =Sram_dqr;
//CE、OE、UB、LB信号拉低
assign oSram_be_n = 2'b00;
assign oSram_ce_n = 1'b0;
assign oSram_oe_n = 1'b0;
//assign Sram_dq=Sram_dq_reg ; //把要写入的值给数据线
always @(posedge iClk or negedge iRst)
begin
if (!iRst)
begin
oSram_we_n <=1'b1;
oSram_a<=18'b0;
tmp<=16'b0;
dataout<=16'b0;
readsram<=1'b0;
writesram<=1'b1;
tt<=2'b00;
end
else begin
case (tt)
2'b00:
begin
oSram_we_n<=1'b0;
Sram_dq<=tmp;
tmp<=tmp+1'b1;
oSram_a<=oSram_a+1'b1;
if(oSram_a<18'h3ffff)
begin
end
else
begin
oSram_a<=18'b0;
readsram<=1'b1;
writesram<=1'b0;
tt<=2'b10;
end
end
2'b10:begin
oSram_we_n <=1'b1;
Sram_dq<=16'hzzzz;
dataout<=Sram_dq;
oSram_a<=oSram_a+1;
if(oSram_a<18'h3ffff)
begin
end
else
begin
oSram_a<=18'b0;
tmp<=16'b0;
writesram<=1'b1;
readsram<=1'b0;
tt<=2'b00;
end
end
default: tt<=tt;
endcase
end
end
endmodule
tt两个状态,一个状态写,一个状态读,连续写完,地址清零,开始连续读。写入的数据是临时变量tmp,从0一直自加1写入.
现在的状态是,写入“可能”没问题。一个时钟周期写一次,相应地址加一。送到数据线上的tmp值也自加一了。
但是读出的数据,却占两个时钟周期。地址是一个周期加一次,所以两个地址读出的是一个相同的数据,并且数据是相隔的,不是相邻的,(比如读出的是1,3,5,7,,,),而我实际写入的是tmp自加1的,即写入(1,2,3,4,5,6,7,,,,等)。
请高手指明该问题的原因及解决方法,小弟不胜感激!!!!!!!!!!! |
阿莫论坛20周年了!感谢大家的支持与爱护!!
知道什么是神吗?其实神本来也是人,只不过神做了人做不到的事情 所以才成了神。 (头文字D, 杜汶泽)
|