axis_histogram.v 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105
  1. `timescale 1 ns / 1 ps
  2. module axis_histogram #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 16,
  5. parameter integer BRAM_DATA_WIDTH = 32,
  6. parameter integer BRAM_ADDR_WIDTH = 14
  7. )
  8. (
  9. // System signals
  10. input wire aclk,
  11. input wire aresetn,
  12. // Slave side
  13. input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
  14. input wire s_axis_tvalid,
  15. output wire s_axis_tready,
  16. // BRAM port
  17. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram CLK" *)
  18. output wire b_bram_clk,
  19. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram RST" *)
  20. output wire b_bram_rst,
  21. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram EN" *)
  22. output wire b_bram_en,
  23. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram WE" *)
  24. output wire [BRAM_DATA_WIDTH/8-1:0] b_bram_we,
  25. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram ADDR" *)
  26. output wire [BRAM_ADDR_WIDTH-1:0] b_bram_addr,
  27. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram DIN" *)
  28. output wire [BRAM_DATA_WIDTH-1:0] b_bram_wdata,
  29. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram DOUT" *)
  30. input wire [BRAM_DATA_WIDTH-1:0] b_bram_rdata
  31. );
  32. reg [BRAM_ADDR_WIDTH-1:0] int_addr_reg, int_addr_next;
  33. reg [BRAM_DATA_WIDTH-1:0] int_data_reg, int_data_next;
  34. reg [1:0] int_case_reg, int_case_next;
  35. reg int_tready_reg, int_tready_next;
  36. reg int_we_reg, int_we_next;
  37. always @(posedge aclk)
  38. begin
  39. if(~aresetn)
  40. begin
  41. int_addr_reg <= {(BRAM_ADDR_WIDTH){1'b0}};
  42. int_data_reg <= {(BRAM_DATA_WIDTH){1'b0}};
  43. int_case_reg <= 2'd0;
  44. int_tready_reg <= 1'b1;
  45. int_we_reg <= 1'b0;
  46. end
  47. else
  48. begin
  49. int_addr_reg <= int_addr_next;
  50. int_data_reg <= int_data_next;
  51. int_case_reg <= int_case_next;
  52. int_tready_reg <= int_tready_next;
  53. int_we_reg <= int_we_next;
  54. end
  55. end
  56. always @*
  57. begin
  58. int_addr_next = int_addr_reg;
  59. int_data_next = int_data_reg;
  60. int_case_next = int_case_reg;
  61. int_tready_next = int_tready_reg;
  62. int_we_next = int_we_reg;
  63. case(int_case_reg)
  64. 2'd0:
  65. begin
  66. if(s_axis_tvalid)
  67. begin
  68. int_addr_next = s_axis_tdata[BRAM_ADDR_WIDTH-1:0];
  69. int_tready_next = 1'b0;
  70. int_case_next = 2'd1;
  71. end
  72. end
  73. 2'd1:
  74. begin
  75. int_data_next = b_bram_rdata + 1'b1;
  76. int_we_next = ~&b_bram_rdata;
  77. int_case_next = 2'd2;
  78. end
  79. 2'd2:
  80. begin
  81. int_tready_next = 1'b1;
  82. int_we_next = 1'b0;
  83. int_case_next = 2'd0;
  84. end
  85. endcase
  86. end
  87. assign s_axis_tready = int_tready_reg;
  88. assign b_bram_clk = aclk;
  89. assign b_bram_rst = ~aresetn;
  90. assign b_bram_en = int_we_reg | s_axis_tvalid;
  91. assign b_bram_we = {(BRAM_DATA_WIDTH/8){int_we_reg}};
  92. assign b_bram_addr = int_we_reg ? int_addr_reg : s_axis_tdata[BRAM_ADDR_WIDTH-1:0];
  93. assign b_bram_wdata = int_data_reg;
  94. endmodule