急求Sram读写问题解决方法
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 data_my ;
output oSram_a ;
output dataout ;
inout Sram_dq ;
output oSram_be_n;
output oSram_we_n;
output oSram_oe_n;
output oSram_ce_n;
output flag,readsram,writesram;
reg flag;
reg oSram_a ;
reg oSram_we_n;
wire oSram_be_n;
wire oSram_ce_n;
wire oSram_oe_n;
//wire oSram_oe_n;
reg Sram_dq; //定义数据寄存器
reg Sram_dq_reg;
reg dataout;
reg tt;
reg yy;
reg tmp;
reg readsram;
reg writesram;
//reg Sram_dqr;
//assign Sram_dq =Sram_dqr;
//CE、OE、UB、LB信号拉低
assignoSram_be_n = 2'b00;
assignoSram_ce_n = 1'b0;
assignoSram_oe_n = 1'b0;
//assignSram_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,,,,等)。
请高手指明该问题的原因及解决方法,小弟不胜感激!!!!!!!!!!! 呵呵没有看你的程序。因为不会o(∩_∩)o 哈哈 。估计是不是数据位数错了。16位和8位的。按照8位写,但是16位读。
页:
[1]