Dream_cluster的个人空间 https://blog.eetop.cn/1573384 [收藏] [复制] [分享] [RSS]

空间首页 动态 记录 日志 相册 主题 分享 留言板 个人资料

日志

关于SRAM的读写总结(主要是读)

已有 5757 次阅读| 2017-10-23 21:15 |系统分类:硬件设计

        因为现在所做的工作涉及到对两片SRAM的乒乓读写,所以前段时间一直在调试SRAM的读写问题,现在还算是有那么一点点了解,所以写篇帖子总结一下;
关于SRAM怎样读写的帖子和教程网上已经很多了,无非就是根据时序图和硬件电路,去产生控制信号(即片选信号、读写控制信号), 这里就不详述了。这里主要是介绍两种读SRAM的方法。一种是顺序读取法(根据存入的顺序依次读取),另一种是随机读取法(即想读哪个地址就读哪个地址)。
1:顺序读取法
根据读时钟产生地址,该地址从地址0依次递加,直到把存入的数据读完;
例子:假如读取256个地址则,reg [7:0]  rd_addr (读地址)  , reg   rd_addr_en(读地址使能), rst(复位信号) ,rd_clk(读时钟);
always @ (posedge rd_clk) begin
if(!rst)begin
    rd_addr <= 8'd0;
    rd_addr_en  <= 1'b0;
end
else begin
if(rd_addr == 8'd255)begin
rd_addr <= rd_addr;
rd_addr_en <= 1'b0;
end
else begin
rd_addr <= rd_addr + 1'b1;
rd_addr_en <= 1'b1;
end
end
end
2 : 随机读取法 
所谓随机读取法就是根据需要读取存在SRAM中任意地址的数据,比如说我想取出地址100/131/208/19里面的数据,那要怎么做呢?reg [7:0]  rd_addr (读地址)  , reg   rd_addr_en(读地址使能), rst(复位信号) ,rd_clk(读时钟);
(1):先设一个计数器 reg  [2:0] cnt;因为要取四个数所以计数计0/1/2/3.
always @ (posedge rd_clk) begin
if(!rst)begin
    cnt <= 3'd0;
     rd_addr_en <= 1'b0;
end
else  begin
  if(cnt == 3'd3)
cnt <= cnt;
rd_addr_en <= 1'b0;
  else
cnt <= cnt + 1'b1;
rd_addr_en <= 1'b1;
end
end
(2):用case语句产生所需要的地址
always @ (*)begin
case(cnt)
3'd0 :  rd_addr = 8'd100;
3'd1 :  rd_addr = 8'd131;
3'd2 :  rd_addr = 8'd208;
3'd3 :  rd_addr = 8'd19;
default :  rd_addr =8'd0;
endcase
end

以上就是两种基本的产生SRAM读地址的方式,经过板上调试好使。

点赞

发表评论 评论 (1 个评论)

回复 qingwatiaowu 2017-11-14 10:37
这里用的是同步复位的电路。相比异步复位有啥优缺点?

facelist

您需要登录后才可以评论 登录 | 注册

  • 关注TA
  • 加好友
  • 联系TA
  • 0

    周排名
  • 0

    月排名
  • 0

    总排名
  • 0

    关注
  • 3

    粉丝
  • 0

    好友
  • 0

    获赞
  • 2

    评论
  • 1054

    访问数
关闭

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

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

GMT+8, 2024-11-16 01:13 , Processed in 0.017411 second(s), 8 queries , Gzip On, Redis On.

eetop公众号 创芯大讲堂 创芯人才网
返回顶部