5836|7

13

帖子

0

TA的资源

一粒金砂(中级)

楼主
 

写数据到RAM中遇到的疑惑 [复制链接]

我今天在做一个RAM块的读写时遇到一个很奇怪的问题,我用的芯片是xilinx的spartan-3E

 

对RAM写操作的代码

always@(posedge write_clk or negedge rst_n)
 if(!rst_n) write_addr <= 0;
   else if(write_allow) write_addr <= write_addr + 1;

 

我的思路是,从RAM地址的0位地址位开始写入数据,用以上的代码来实现我的想法

但是我读出RAM的数据却是从ram的第1位地址位读出数据

例如我写进四个数  AA,BB,CC,DD读出来的数却是 00 ,AA ,BB ,CC,

为什么我写入的数据好像往后移位了 一个地址??

谢谢

此帖出自FPGA/CPLD论坛

最新回复

是的  详情 回复 发表于 2011-10-19 13:31
点赞 关注
 

回复
举报

13

帖子

0

TA的资源

一粒金砂(中级)

沙发
 

使用fifo软核遇到的疑惑

 我定义的fifo深度为16位深,是用ise 13.1版本生成的fifo ip核,调用了spartan-3E芯片的中的block ram

 但是实际能写入到的数据却只有15个数据

比如我连续发                  01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 

第一次读出来的数据是:00 01 02 03 04 05 06 07 08 09 10 11 12 13 14

 请注意这两行数据,第一个和最后一个数据的差异,读出来的数据第一个

是00,这个应该是fifo复位时,所有ram地址都置位为00,但为什么读出的

第一个数据不是01,却是00?这个让我很费解,

当我再次发送15个数据:01 02 03 04 05 06 07 08 09 10 11 12 13 14 15

第二次读出的15个数据:15 01 02 03 04 05 06 07 08 09 10 11 12 13 14

请再看头尾两个数据的差异,第一次读出的第一个数据是00,而第二次读

出的第一个数据是第一次输入的15个数据中最后一个数“15”。

假如我接着发送                          01 02 03 04 05 06 07 08 09 10 11 12 13 14 15这样15个数,

那么读出来的 15个数据将会是 15 01 02 03 04 05 06 07 08 09 10 11 12 13 14。

这样看起来,好像是写入最后的使fifo达到full的状态的一个数据,只能在下一次读操作中第一个从fifo中读取出来。

我的问题有如下几个:

第一:为什么我定义的16深的fifo,实际有效深度只有15深;

第二:为什么写入的15个有效数据,读取出来的有效数据只有14个;

第三:可以作为第二个问题的延续,读出的15个数据,为什么第一个数据是上一次写入的15个数据中的最后一个数据,而本次读操作却不能读取本次写操作的的最后一个数据。因此我在上一个问题中说是14个有效数据。

 

我觉得fifo中的问题和我下面提到的ram中的问题有些相通的地方。但我还没有想明白到底是怎么回事,因此在这里向各位前辈们请教学习。

[ 本帖最后由 hujn 于 2011-10-16 19:18 编辑 ]
此帖出自FPGA/CPLD论坛
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

板凳
 
ram块读写操作的问题:
对RAM写操作的代码
always@(posedge write_clk or negedge rst_n)
if(!rst_n) write_addr <= 0;
   else if(write_allow) write_addr <= write_addr + 1;
7位宽的reg 变量write_addr和block ram 的8位宽的地址总线相连接

我的理解是:第一个写入的数据应该放到ram地址指针 write_addr =0 的地址中。
从实际的情况来看,却像是写入了write_addr = 1的地址中。
那么当write_allow为高电平且write_clk为上升沿时,地址指针write_addr所指向的
ram中的地址是write_addr所在的地址还是write_addr+1所在的地址?

同样对ram的读写操作也遇到了fifo中的问题,对ram读操作的第一个数是上一次使写操作为满状态的
最后一个数据。
此帖出自FPGA/CPLD论坛
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

4
 

我今天在做一个RAM块的读写时遇到一个很奇怪的问题,我用的芯片是xilinx的spartan-3E



对RAM写操作的代码

always@(posedge write_clk or negedge rst_n)
if(!rst_n) write_addr <= 0;
else if(write_allow) write_addr <= write_addr + 1;



我的思路是,从RAM地址的0位地址位开始写入数据,用以上的代码来实现我的想法

但是我读出RAM的数据却是从ram的第1位地址位读出数据

例如我写进四个数 AA,BB,CC,DD读出来的数却是 00 ,AA ,BB ,CC,

为什么我写入的数据好像往后移位了 一个地址??

谢谢

 

你上面语句表达的意思就是从地址1开始写数据,所以有你上面的现象和结果!

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

5
 

操作RAM和FIFO,需要把握一个原则,写操作,数据、地址和写信号同时有效,数据立即写入RAM。

读操作,先给地址和读信号,延迟两个时钟以上,才能取到有效数据哦!

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复

20

帖子

0

TA的资源

一粒金砂(中级)

6
 
以前我也遇到过同样的问题,数据写进去和读出来总是有移位,但也只是简单的解决了,没找到根本问题,看了楼上的,理解了。
此帖出自FPGA/CPLD论坛
 
 
 

回复

13

帖子

0

TA的资源

一粒金砂(中级)

7
 

原帖由 eeleader 于 2011-10-18 14:03 发表   你上面语句表达的意思就是从地址1开始写数据,所以有你上面的现象和结果!

 

always@(posedge write_clk or negedge rst_n)
    if(!rst_n) write_addr <= 0;
        else if(write_allow) write_addr <= write_addr + 1; 


 write_addr <= write_addr + 1; 对于这句代码fpga是怎么实现的啊?

是不是当write_allow为高且write_clk上升沿时,write_addr的值立即被更新为write_addr+1么?

此时RAM块中的地址指针也立即指向了wirte_addr+1的地址?

 

 

此帖出自FPGA/CPLD论坛
 
 
 

回复

6892

帖子

0

TA的资源

五彩晶圆(高级)

8
 

是的

此帖出自FPGA/CPLD论坛
个人签名一个为理想不懈前进的人,一个永不言败人!
http://shop57496282.taobao.com/
欢迎光临网上店铺!
 
 
 

回复
您需要登录后才可以回帖 登录 | 注册

随便看看
查找数据手册?

EEWorld Datasheet 技术支持

相关文章 更多>>
关闭
站长推荐上一条 1/7 下一条

 
EEWorld订阅号

 
EEWorld服务号

 
汽车开发圈

About Us 关于我们 客户服务 联系方式 器件索引 网站地图 最新更新 手机版

站点相关: 国产芯 安防电子 汽车电子 手机便携 工业控制 家用电子 医疗电子 测试测量 网络通信 物联网

北京市海淀区中关村大街18号B座15层1530室 电话:(010)82350740 邮编:100190

电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 电信业务审批[2006]字第258号函 京公网安备 11010802033920号 Copyright © 2005-2025 EEWORLD.com.cn, Inc. All rights reserved
快速回复 返回顶部 返回列表