当前位置:   article > 正文

Verilog:同步FIFO使用计数器的写法_fifo写法

fifo写法

同步FIFO(First in first out),先入先出。

Deign Spec:

  • 输入信号:clk;
  • 输入信号:异步复位信号:rstn;
  • 输入信号:写使能:wr_en;
  • 输入信号:写数据:wr_data;//时序逻辑,先判断写使能 wr_en 是否有效,有效情况下如果没有写满,则写入数据,如果满了,判断读使能 rd_en ,如果读使能有效能可以继续写数据。
  • 输入信号:读使能:rd_en;
  • 输出信号:读数据:rd_data;//时序逻辑,先判断读使能 rd_en 是否有效,有效情况下如果内存非空,则取上一个周期指针位置的数据作为读数据,如果内存为空,则判断写使能,如果写使能有效则直接将写数据 wr_data 作为读数据输出,无效时输出0。
  • 输出信号:内存满信号:full;//如果计数器 cnt 等于内存深度,则 full 为1
  • 输出信号:内存空信号:empty;//如果计数器 cnt 为0,则 empty 为
  • 读指针:rd_ptr;//时序逻辑,先判断写使能 rd_en 是否有效,有效情况如果内存非空则+1,如果内存空了,判断 wr_en 是否有效,如果有效则+1,否则不变。
  • 写指针:wr_ptr;//时序逻辑,先判断写使能 wr_en 是否有效,有效情况如果内存非满则+1,如果内存满了,判断 rd_en 是否有效,如果有效则+1,否则不变。
  • 内存:mem;//内存深度要为 2^n 大小,即指针可以通过+1自动循环。
  • 计数器:cnt;//如果 wr_en 和 rd_en 同时有效,则无论内存空满,cnt不变。如果单纯是 wr_en 有效且非满的情况下,cnt+1,如果单纯是 rd_en 有效且非空的情况下 cnt-1

RTL代码:

  1. module sync_fifo#(
  2. parameter DEPTH = 16, //DEPTH = 2^n
  3. parameter WIDTH = 8
  4. )(
  5. input clk,
  6. input rstn,
  7. //write
  8. input wr_en, //write enable
  9. input [WIDTH-1:0] wr_data, //write data
  10. output full,
  11. //read
  12. input rd_en, //read enable
  13. output reg [WIDTH-1:0] rd_data, //read data
  14. output empty,
  15. output reg [$clog2(DEPTH):0] cnt
  16. );
  17. reg [$clog2(DEPTH)-1:0] rd_ptr, wr_ptr;
  18. reg [WIDTH-1:0] mem [0:DEPTH-1];
  19. //********** read start **********//
  20. always@(posedge clk, negedge rstn) begin
  21. if(~rstn) begin
  22. rd_ptr <= 0;
  23. end
  24. else if(rd_en && ~empty) begin
  25. rd_ptr <= rd_ptr + 1'b1;
  26. end
  27. else if(rd_en && empty && wr_en) begin
  28. rd_ptr <= rd_ptr + 1'b1;
  29. end
  30. end
  31. always@(posedge clk, negedge rstn) begin
  32. if(~rstn) begin
  33. rd_data <= 0;
  34. end
  35. else if(rd_en && ~empty) begin
  36. rd_data <= mem[rd_ptr];
  37. end
  38. else if(rd_en && empty && wr_en) begin
  39. rd_data <= wr_data;
  40. end
  41. else begin
  42. rd_data <= 0;
  43. end
  44. end
  45. //********** read end **********//
  46. //********** write start **********//
  47. always@(posedge clk, negedge rstn) begin
  48. if(~rstn) begin
  49. wr_ptr <= 0;
  50. end
  51. else if(wr_en && ~full) begin
  52. wr_ptr <= wr_ptr + 1'b1;
  53. end
  54. else if(wr_en && full && rd_en) begin
  55. wr_ptr <= wr_ptr + 1'b1;
  56. end
  57. end
  58. always@(posedge clk) begin
  59. if(wr_en && ~full) begin
  60. mem[wr_ptr] <= wr_data;
  61. end
  62. else if(wr_en && full && rd_en) begin
  63. mem[wr_ptr] <= wr_data;
  64. end
  65. end
  66. //********** write end **********//
  67. //********** cnt **********//
  68. always@(posedge clk, negedge rstn) begin
  69. if(~rstn) begin
  70. cnt <= 0;
  71. end
  72. else if(wr_en && rd_en) begin
  73. cnt <= cnt;
  74. end
  75. else if(wr_en && ~full) begin
  76. cnt <= cnt + 1'b1;
  77. end
  78. else if(rd_en && ~empty) begin
  79. cnt <= cnt - 1'b1;
  80. end
  81. end
  82. assign full = (cnt == DEPTH);
  83. assign empty = (cnt == 0);
  84. endmodule

TB代码:

  1. module test#(
  2. parameter DEPTH = 16,
  3. parameter WIDTH = 8
  4. );
  5. reg clk;
  6. reg rstn;
  7. reg wr_en;
  8. reg [WIDTH-1:0] wr_data;
  9. wire full;
  10. reg rd_en;
  11. wire [WIDTH-1:0] rd_data;
  12. wire empty;
  13. wire [$clog2(DEPTH):0] cnt;
  14. sync_fifo u0(
  15. .clk(clk),
  16. .rstn(rstn),
  17. .wr_en(wr_en),
  18. .wr_data(wr_data),
  19. .full(full),
  20. .rd_en(rd_en),
  21. .rd_data(rd_data),
  22. .empty(empty),
  23. .cnt(cnt)
  24. );
  25. initial begin
  26. clk = 0;
  27. rstn = 0;
  28. wr_en = 0;
  29. wr_data = 0;
  30. rd_en = 0;
  31. #30 rstn = 1;
  32. end
  33. always #10 clk = ~clk;
  34. always@(posedge clk) begin
  35. if(({$random()}%16)<10) wr_en <= 1;
  36. else wr_en <= 0;
  37. if(({$random()}%16)<7) rd_en <= 1;
  38. else rd_en <= 0;
  39. end
  40. always@(posedge clk) begin
  41. wr_data <= {$random()} & 8'hff;
  42. end
  43. initial begin
  44. #4000 $finish;
  45. end
  46. endmodule

波形:

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/从前慢现在也慢/article/detail/206798
推荐阅读
相关标签
  

闽ICP备14008679号