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

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

手机号码,快捷登录

手机号码,快捷登录

找回密码

  登录   注册  

快捷导航
搜帖子
查看: 2901|回复: 1

[转贴] Synchronous FIFO Verilog Code

[复制链接]
发表于 2020-7-4 20:14:31 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 PayPal 于 2020-7-4 20:16 编辑

经典FIFO代码,写的规范。



  1. //-----------------------------------------------------
  2. // Design Name : syn_fifo
  3. // File Name   : syn_fifo.v
  4. // Function    : Synchronous (single clock) FIFO
  5. // Coder       :<a href="http://www.asic-world.com/">http://www.asic-world.com/</a>
  6. //-----------------------------------------------------
  7. module syn_fifo (
  8. clk      , // Clock input
  9. rst      , // Active high reset
  10. wr_cs    , // Write chip select
  11. rd_cs    , // Read chipe select
  12. data_in  , // Data input
  13. rd_en    , // Read enable
  14. wr_en    , // Write Enable
  15. data_out , // Data Output
  16. empty    , // FIFO empty
  17. full       // FIFO full
  18. );   

  19. // FIFO constants
  20. parameter DATA_WIDTH = 8;
  21. parameter ADDR_WIDTH = 8;
  22. parameter RAM_DEPTH = (1 << ADDR_WIDTH);
  23. // Port Declarations
  24. input clk ;
  25. input rst ;
  26. input wr_cs ;
  27. input rd_cs ;
  28. input rd_en ;
  29. input wr_en ;
  30. input [DATA_WIDTH-1:0] data_in ;
  31. output full ;
  32. output empty ;
  33. output [DATA_WIDTH-1:0] data_out ;

  34. //-----------Internal variables-------------------
  35. reg [ADDR_WIDTH-1:0] wr_pointer;
  36. reg [ADDR_WIDTH-1:0] rd_pointer;
  37. reg [ADDR_WIDTH :0] status_cnt;
  38. reg [DATA_WIDTH-1:0] data_out ;
  39. wire [DATA_WIDTH-1:0] data_ram ;

  40. //-----------Variable assignments---------------
  41. assign full = (status_cnt == (RAM_DEPTH-1));
  42. assign empty = (status_cnt == 0);

  43. //-----------Code Start---------------------------
  44. always @ (posedge clk or posedge rst)
  45. begin : WRITE_POINTER
  46.   if (rst) begin
  47.     wr_pointer <= 0;
  48.   end else if (wr_cs && wr_en ) begin
  49.     wr_pointer <= wr_pointer + 1;
  50.   end
  51. end

  52. always @ (posedge clk or posedge rst)
  53. begin : READ_POINTER
  54.   if (rst) begin
  55.     rd_pointer <= 0;
  56.   end else if (rd_cs && rd_en ) begin
  57.     rd_pointer <= rd_pointer + 1;
  58.   end
  59. end

  60. always  @ (posedge clk or posedge rst)
  61. begin : READ_DATA
  62.   if (rst) begin
  63.     data_out <= 0;
  64.   end else if (rd_cs && rd_en ) begin
  65.     data_out <= data_ram;
  66.   end
  67. end

  68. always @ (posedge clk or posedge rst)
  69. begin : STATUS_COUNTER
  70.   if (rst) begin
  71.     status_cnt <= 0;
  72.   // Read but no write.
  73.   end else if ((rd_cs && rd_en) && !(wr_cs && wr_en)
  74.                 && (status_cnt != 0)) begin
  75.     status_cnt <= status_cnt - 1;
  76.   // Write but no read.
  77.   end else if ((wr_cs && wr_en) && !(rd_cs && rd_en)
  78.                && (status_cnt != RAM_DEPTH)) begin
  79.     status_cnt <= status_cnt + 1;
  80.   end
  81. end
  82.    
  83. ram_dp_ar_aw #(DATA_WIDTH,ADDR_WIDTH)DP_RAM (
  84. .address_0 (wr_pointer) , // address_0 input
  85. .data_0    (data_in)    , // data_0 bi-directional
  86. .cs_0      (wr_cs)      , // chip select
  87. .we_0      (wr_en)      , // write enable
  88. .oe_0      (1'b0)       , // output enable
  89. .address_1 (rd_pointer) , // address_q input
  90. .data_1    (data_ram)   , // data_1 bi-directional
  91. .cs_1      (rd_cs)      , // chip select
  92. .we_1      (1'b0)       , // Read enable
  93. .oe_1      (rd_en)        // output enable
  94. );     

  95. endmodule


复制代码


发表于 2020-7-8 13:55:30 | 显示全部楼层
Thanks for sharing, good template form asic-word .com
您需要登录后才可以回帖 登录 | 注册

本版积分规则

关闭

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


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

GMT+8, 2025-7-18 18:16 , Processed in 0.014212 second(s), 7 queries , Gzip On, MemCached On.

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