我今天在做一个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位宽的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所在的地址?
我定义的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个有效数据。 |