集成电路技术分享

 找回密码
 我要注册

QQ登录

只需一步,快速开始

搜索
查看: 1106|回复: 0

异步fifo程序没看懂,求指导

[复制链接]
lixuecheng 发表于 2011-11-28 10:05:13 | 显示全部楼层 |阅读模式
  1. module fifo1(rdata, wfull, rempty, wdata, winc, wclk, wrst_n,rinc, rclk, rrst_n);
  2. parameter DSIZE = 8; parameter ASIZE = 4;
  3. output [DSIZE-1:0] rdata;
  4. output wfull;
  5. output rempty;
  6. input [DSIZE-1:0] wdata;
  7. input winc, wclk, wrst_n;
  8. input rinc, rclk, rrst_n;
  9. reg wfull,rempty;
  10. reg [ASIZE:0] wptr, rptr, wq2_rptr, rq2_wptr, wq1_rptr,rq1_wptr;
  11. reg [ASIZE:0] rbin, wbin;
  12. reg [DSIZE-1:0] mem[0:(1<<ASIZE)-1]; //定义存储器宽度为8,深度为16
  13. wire [ASIZE-1:0] waddr, raddr; //读写地址
  14. wire [ASIZE:0] rgraynext, rbinnext,wgraynext,wbinnext; //读写的格雷码与二进制码
  15. wire rempty_val,wfull_val;
  16. //-----------------双口RAM存储器--------------------
  17. assign rdata=mem[raddr];
  18. always@(posedge wclk)
  19. if (winc && !wfull) mem[waddr] <= wdata;
  20. //-------------同步rptr 指针-------------------------
  21. always @(posedge wclk or negedge wrst_n)
  22. if (!wrst_n) {wq2_rptr,wq1_rptr} <= 0;
  23. else {wq2_rptr,wq1_rptr} <= {wq1_rptr,rptr}; //这里采用了位拼接操作符
  24. //-------------同步wptr指针---------------------------
  25. always @(posedge rclk or negedge rrst_n)
  26. if (!rrst_n) {rq2_wptr,rq1_wptr} <= 0;
  27. else {rq2_wptr,rq1_wptr} <= {rq1_wptr,wptr}; //
  28. //-------------rempty产生与raddr产生-------------------
  29. always @(posedge rclk or negedge rrst_n) // GRAYSTYLE2 pointer
  30. begin
  31. if (!rrst_n) {rbin, rptr} <= 0;
  32. else {rbin, rptr} <= {rbinnext, rgraynext};
  33. end
  34. // Memory read-address pointer (okay to use binary to address memory)
  35. assign raddr = rbin[ASIZE-1:0];
  36. assign rbinnext = rbin + (rinc & ~rempty);
  37. assign rgraynext = (rbinnext>>1) ^ rbinnext; //产生读格雷码
  38. // FIFO empty when the next rptr == synchronized wptr or on reset
  39. assign rempty_val = (rgraynext == rq2_wptr);
  40. always @(posedge rclk or negedge rrst_n)
  41. begin
  42. if (!rrst_n) rempty <= 1'b1;
  43. else rempty <= rempty_val;
  44. end
  45. //---------------wfull产生与waddr产生------------------------------
  46. always @(posedge wclk or negedge wrst_n) // GRAYSTYLE2 pointer
  47. if (!wrst_n) {wbin, wptr} <= 0;
  48. else {wbin, wptr} <= {wbinnext, wgraynext};
  49. // Memory write-address pointer (okay to use binary to address memory)
  50. assign waddr = wbin[ASIZE-1:0];
  51. assign wbinnext = wbin + (winc & ~wfull);
  52. assign wgraynext = (wbinnext>>1) ^ wbinnext; //产生写格雷码
  53. assign wfull_val = (wgraynext=={~wq2_rptr[ASIZE:ASIZE-1], wq2_rptr[ASIZE-2:0]}); //:ASIZE-1]
  54. always @(posedge wclk or negedge wrst_n)
  55. if (!wrst_n) wfull <= 1'b0;
  56. else wfull <= wfull_val;
  57. endmodule


复制代码
同步wptr、rptr是什么意思?那几行代码怎么解释?20-27行
您需要登录后才可以回帖 登录 | 我要注册

本版积分规则

关闭

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

QQ|小黑屋|手机版|Archiver|集成电路技术分享 ( 京ICP备20003123号-1 )

GMT+8, 2024-5-5 00:52 , Processed in 0.066805 second(s), 20 queries .

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表