hbcb5676805 发表于 2010-5-25 14:41:07

急求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,,,,等)。
请高手指明该问题的原因及解决方法,小弟不胜感激!!!!!!!!!!!

luan_dahai 发表于 2010-6-16 18:45:11

呵呵没有看你的程序。因为不会o(∩_∩)o 哈哈 。估计是不是数据位数错了。16位和8位的。按照8位写,但是16位读。
页: [1]
查看完整版本: 急求Sram读写问题解决方法