在线咨询
eetop公众号 创芯大讲堂 创芯人才网
切换到宽版

EETOP 创芯网论坛 (原名:电子顶级开发网)

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 16143|回复: 5

[求助] 求助! 上电后SRAM只第一次写有效?!

[复制链接]
发表于 2013-7-25 12:48:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?注册

x
最近在做SRAM方面的测试,本想FPGA采集数据通过接口传给单片机进行处理,可是现在fpga控制SRAM读写好像出了些问题。每次fpga刚上电时,先写再读,显示的数是正确的。可是,我把输入的数据调了,换了个数,再写SRAM,读出的数据就不正确了,还是第一次写的数。查了些资料,没有说SRAM写过后还要擦除的,所以可能还是我控制的方法有问题。我用的SRAM 是IS61LV2568,以下是我的程序,主要是参考了DE2开发板的程序,然后修改了一下。希望各位能帮我看看,到底程序有没有问题,问题在哪?如能回复,十分感谢!
module simple_exram(

     input clk,

     input wr,
     input rd,
     input[7:0] adc_data_in,
     input[17:0]wr_end_addr,
     
     
     output MEM_WE_N,
     output reg MEM_OE_N,
     output[17:0] MEM_A,
     inout[7:0] MEM_DATA,
     
     input[17:0] addr_to_read,
     output reg[7:0] data_read

     );
      
      

      /*************** extern_ram *****************/


     reg[17:0] wr_addr18 = 18'd0;
     reg[17:0] rd_addr18 = 18'd0;

//读数据
     reg[7:0] Data_out_r = 8'h00;

      always @(posedge clk)
      begin
         if(rd==1'b1)
             begin
                 MEM_OE_N <= 1'b0;
                 rd_addr18 <= addr_to_read;
                 Data_out_r <= MEM_DATA;
                 data_read <= Data_out_r;
             end
         else
             begin
                 MEM_OE_N <= 1'b1;
                 rd_addr18 <= 18'd0;
                 Data_out_r <= 8'h00;
             end
      end



         //写数据   
     reg flag = 1'b0;
     reg we_r = 1'b0;
     reg[7:0] bufdata = 8'd0;
     reg[17:0] wr_addr18_reg = 18'd0;


     
      always @(posedge clk)
      begin
        if(wr == 1'b1)
             begin
                 if(wr_addr18 <= wr_end_addr)
                     begin
                         if(!flag)
                             begin
                                 we_r <= 1'b1;
                                 wr_addr18 <= wr_addr18_reg;
                                 wr_addr18_reg <= wr_addr18_reg + 18'd1;
                                 bufdata <= adc_data_in;
                                 flag <= 1'b1;
                             end
                         else
                             begin
                                 we_r <= 1'b0;
                                 wr_addr18 <= wr_addr18;
                                 bufdata <= bufdata;
                                 flag <= 1'b0;
                             end
                     end
                 else
                     begin
                         we_r <= 1'b0;
                         flag <= 1'b0;
                         wr_addr18 <= wr_addr18;
                         bufdata <= bufdata;
                     end
             end
         else
             begin
                 we_r <= 1'b0;
                 wr_addr18_reg <=18'd0;
                 wr_addr18 <= 18'd0;
                 bufdata <= 8'd0;
                 flag <= 1'b0;
             end
      end
     



      assign MEM_A = wr?wr_addr18:rd_addr18;
      assign MEM_WE_N = (~we_r)?1'b1:1'b0;
      assign MEM_DATA = we_r? bufdata:8'hzz;


endmodule
 楼主| 发表于 2013-7-25 12:51:32 | 显示全部楼层
自己先顶一下
发表于 2013-7-25 13:36:37 | 显示全部楼层
wr_addr18
flag
在进入第二次写操作时,是否与初始化后一样?
 楼主| 发表于 2013-7-25 14:04:21 | 显示全部楼层
应该是一样的。初始化时,     /*************** extern_ram *****************/


      reg[17:0] wr_addr18 = 18'd0;
      reg[17:0] rd_addr18 = 18'd0;
         //写数据   
      reg flag = 1'b0;

进入第二次写操作时:

                 we_r <= 1'b0;
                  wr_addr18_reg <=18'd0;
                  wr_addr18 <= 18'd0;
                  bufdata <= 8'd0;
                  flag <= 1'b0;

wr_addr18、flag应该是相同的。希望各位能帮我看看是不是什么地方流程或控制信号没注意好,或是总体的思路就有问题。谢谢
发表于 2013-7-25 16:29:29 | 显示全部楼层
时序或者reset问题,把你的程序跑一下仿真和SDRAM的测试程序对比一下时序,尤其是结束那部分的,我之前调DDR2遇到过这种问题,照着测试程序改能改好。
发表于 2013-7-25 19:41:01 | 显示全部楼层
帮顶一下
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

站长推荐 上一条 /2 下一条

×

小黑屋| 关于我们| 联系我们| 在线咨询| 隐私声明| EETOP 创芯网
( 京ICP备:10050787号 京公网安备:11010502037710 )

GMT+8, 2024-5-4 05:51 , Processed in 0.030891 second(s), 10 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
快速回复 返回顶部 返回列表