写数据到RAM中遇到的疑惑

2019-03-25 10:00发布

我今天在做一个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, 为什么我写入的数据好像往后移位了 一个地址?? 谢谢 此帖出自小平头技术问答
友情提示: 此问题已得到解决,问题已经关闭,关闭后问题禁止继续编辑,回答。
该问题目前已经被作者或者管理员关闭, 无法添加新回复
7条回答
hujn
1楼-- · 2019-03-25 18:15
 精彩回答 2  元偷偷看……
hujn
2楼-- · 2019-03-25 19:32
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读操作的第一个数是上一次使写操作为满状态的
最后一个数据。
eeleader
3楼-- · 2019-03-26 01:03

我今天在做一个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开始写数据,所以有你上面的现象和结果!

eeleader
4楼-- · 2019-03-26 03:53

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

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

hjamyp
5楼-- · 2019-03-26 06:18
以前我也遇到过同样的问题,数据写进去和读出来总是有移位,但也只是简单的解决了,没找到根本问题,看了楼上的,理解了。
hujn
6楼-- · 2019-03-26 06:26

原帖由 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的地址?

 

 

一周热门 更多>