Advertisement
Guest User

Untitled

a guest
Feb 23rd, 2020
196
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.62 KB | None | 0 0
  1. `timescale 1ns / 1ps
  2. `default_nettype none
  3.  
  4. /*
  5. * simple fifo. The next data is always available
  6. * at dout, but will only become available with
  7. * the clock after rd_en going high
  8. * If rd_en is kept high, data will only be available
  9. * with one clock delay.
  10. */
  11. module fifo #(
  12. parameter DATA_WIDTH = 72,
  13. parameter ADDR_WIDTH = 6
  14. ) (
  15. input wire clk,
  16. input wire clr,
  17. // write side
  18. input wire [DATA_WIDTH - 1 : 0] din,
  19. input wire wr_en,
  20. output wire full,
  21. // read side
  22. output reg [DATA_WIDTH - 1 : 0] dout,
  23. input wire rd_en,
  24. output reg empty = 1,
  25.  
  26. // status
  27. output wire [ADDR_WIDTH - 1 : 0] elemcnt
  28. );
  29.  
  30. localparam ADDRS = 1 << ADDR_WIDTH;
  31. reg [DATA_WIDTH - 1 : 0] ram[ADDRS - 1 : 0];
  32.  
  33. reg [ADDR_WIDTH - 1 : 0] rdptr = 0;
  34. reg [ADDR_WIDTH - 1 : 0] wrptr = 0;
  35.  
  36. wire [ADDR_WIDTH - 1 : 0] next_rdptr = rdptr + 1;
  37. wire [ADDR_WIDTH - 1 : 0] next_wrptr = wrptr + 1;
  38.  
  39. wire _empty = wrptr == rdptr;
  40. assign full = next_wrptr == rdptr;
  41. assign elemcnt = wrptr - rdptr;
  42.  
  43. always @(posedge clk) begin
  44. dout <= ram[rdptr];
  45. if (clr) begin
  46. rdptr <= 0;
  47. wrptr <= 0;
  48. end else begin
  49. if (rd_en && !empty) begin
  50. rdptr <= next_rdptr;
  51. end
  52. if (wr_en && !full) begin
  53. ram[wrptr] <= din;
  54. wrptr <= next_wrptr;
  55. end
  56. end
  57. /* delay one slot to be in sync with output data */
  58. empty <= _empty;
  59. end
  60.  
  61. endmodule
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement