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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2014|回复: 4

[求助] FIFO 的小小疑问 求各位大侠指教

[复制链接]
发表于 2011-12-13 12:57:49 | 显示全部楼层 |阅读模式

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

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

x
FIFO 的小小疑问 求各位大侠指教
///////////////////write pointer////////////////////////

always @(posedge clk or negedge rst_n)

begin

     if(!rst_n) wrt_ptr <= 3'b0;      

     else if(wrt_ptr == 3'b111) wrt_ptr <=0;

     else if((!wrt_strobe_n)&&(full_n)&&(rd_strobe_n))

       begin

       wrt_ptr<=(wrt_ptr+1);

      // wr_mark<=1;

      end

     else begin

       wrt_ptr<=wrt_ptr;

       //wr_mark<=0;

         end

end



///////////////////read pointer/////////////////////

always @(posedge clk or negedge rst_n)

begin

     if(!rst_n) rd_ptr <= 3'b0;      

     else if(rd_ptr == 3'b111) rd_ptr <=0;

     else if((!rd_strobe_n)&&(empty_n)&&(wrt_strobe_n))

       begin

       rd_ptr<= (rd_ptr+1);

       //rd_mark<=1;

      end

     else begin

       rd_ptr<=rd_ptr;

       //rd_mark<=0;

       end

end



//////////register  counter:from 0(empty) to 8(full)////////

always @(posedge clk or negedge rst_n)

begin

     if(!rst_n) reg_count<=0;

     else

     casez({wrt_strobe_n,rd_strobe_n})

         2'b01: reg_count <= (full_n) ? (reg_count+1) : reg_count;//write---count+1

         2'b10: reg_count <= (empty_n) ? (reg_count-1) : reg_count;//read---count-1

         default: reg_count <= reg_count;

     endcase

end









///////////////////write pointer////////////////////////

    if((!wrt_strobe_n)&&(full_n)&&(rd_strobe_n))

      begin

       wrt_ptr<=(wrt_ptr+1);

         end

     else

       begin

       wrt_ptr<=wrt_ptr;

         end



想问一下,

给写信号,不给读信号的,非满的时候 执行 +1的操作;

else下面执行的 给读写信号,非满!执行保持!



我写一个同时读一个,这个时候写指针不+1么?



FIFO 是先进先出,我写到 1 ,2 ,3 号地址,现在 应该是先从1号地址读出吧,如果我写到了3号房间的时候,开始从1号房间开始读的话,那么我在写的话 应该是往4号房间里写啊,读也应该是从1号一次+1 的往外读啊!但是 从程序上看 并没有实现这个思路的操作。



想试图 写一个FIFO,大家有没有资料,给小弟看看,谢谢!!
发表于 2011-12-13 17:21:58 | 显示全部楼层
你这看问题角度不对...
你要从wrt_ptr和rd_ptr的角度去理解。
按你说的,现在wrt_ptr=3,rd_ptr=0,如果同时来读写信号。
根据逻辑,wrt_ptr+1.rd_ptr+1,也就是说,你写入的地址是4,读出的地址就是1...这个已经很“自然的”体现了这个操作....
切记这是两个分开的指针,各自维护各自的逻辑...
你把他们混一起了..
 楼主| 发表于 2011-12-13 19:16:59 | 显示全部楼层
回复 2# jack888518
if((!rd_strobe_n)&&(empty_n)&&(wrt_strobe_n))   从这程序看
给读信号(!rd_strobe_n)的时候 还要同时 不写信号(wrt_strobe_n)
发表于 2011-12-14 11:55:13 | 显示全部楼层



你给的这段代码是不完全的...只是一种情况,而且这种情况其实是不需要用这个条件做逻辑判断...读写两套地址,各自独立维护...不用考虑同时有效的交集...
发表于 2011-12-14 21:43:50 | 显示全部楼层
verilog真是越学越难
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2024-11-22 04:14 , Processed in 0.022012 second(s), 9 queries , Gzip On, Redis On.

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