Mirror of my github hw-experiments repository

simple_fifo.v 896B

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849
  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) full <= 1'b1;
  33. else empty <= 1'b0;
  34. end
  35. if (pop & ~empty) begin
  36. data_out <= data[rd_ptr];
  37. rd_ptr = rd_ptr + 1;
  38. if (wr_ptr == rd_ptr) empty <= 1'b1;
  39. else full <= 1'b0;
  40. end
  41. end
  42. end
  43. endmodule