Mirror of my github hw-experiments repository

simple_fifo.v 1.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. /*
  2. * DEPTH must be a power of 2
  3. */
  4. module simple_fifo #(
  5. parameter DEPTH = 8,
  6. parameter WIDTH = 16
  7. )(
  8. input wire clk,
  9. input wire reset_n,
  10. input wire push,
  11. input wire pop,
  12. input wire [WIDTH-1:0] data_in,
  13. output reg [WIDTH-1:0] data_out,
  14. output reg full,
  15. output reg empty
  16. );
  17. reg [$clog2(DEPTH)-1:0] rd_ptr;
  18. reg [$clog2(DEPTH)-1:0] wr_ptr;
  19. reg [WIDTH-1:0] data [DEPTH-1:0];
  20. always @(posedge clk) begin
  21. if (reset_n) begin
  22. rd_ptr <= 0;
  23. wr_ptr <= 0;
  24. full <= 0;
  25. empty <= 1;
  26. end
  27. else begin
  28. if (push & ~full) begin
  29. data[wr_ptr] <= data_in;
  30. wr_ptr = wr_ptr + 1;
  31. if (wr_ptr == rd_ptr) begin
  32. full <= 1'b1;
  33. empty <= 1'b0;
  34. end
  35. else begin
  36. full <= 1'b0;
  37. empty <= 1'b0;
  38. end
  39. end
  40. if (pop & ~empty) begin
  41. data_out <= data[rd_ptr];
  42. rd_ptr = rd_ptr + 1;
  43. if (wr_ptr == rd_ptr) begin
  44. full <= 1'b0;
  45. empty <= 1'b1;
  46. end
  47. else begin
  48. full <= 1'b0;
  49. empty <= 1'b0;
  50. end
  51. end
  52. end
  53. end
  54. endmodule