Mirror of my github hw-experiments repository

simple_fifo.v 992B

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