axis_bram_writer.v 1.8 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. `timescale 1 ns / 1 ps
  2. module axis_bram_writer #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 32,
  5. parameter integer BRAM_DATA_WIDTH = 32,
  6. parameter integer BRAM_ADDR_WIDTH = 10
  7. )
  8. (
  9. // System signals
  10. input wire aclk,
  11. input wire aresetn,
  12. output wire [BRAM_ADDR_WIDTH-1:0] sts_data,
  13. // Slave side
  14. input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
  15. input wire s_axis_tvalid,
  16. output wire s_axis_tready,
  17. // BRAM port
  18. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram CLK" *)
  19. output wire b_bram_clk,
  20. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram RST" *)
  21. output wire b_bram_rst,
  22. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram EN" *)
  23. output wire b_bram_en,
  24. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram WE" *)
  25. output wire [BRAM_DATA_WIDTH/8-1:0] b_bram_we,
  26. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram ADDR" *)
  27. output wire [BRAM_ADDR_WIDTH-1:0] b_bram_addr,
  28. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram DIN" *)
  29. output wire [BRAM_DATA_WIDTH-1:0] b_bram_wdata
  30. );
  31. reg [BRAM_ADDR_WIDTH-1:0] int_addr_reg;
  32. always @(posedge aclk)
  33. begin
  34. if(~aresetn)
  35. begin
  36. int_addr_reg <= {(BRAM_ADDR_WIDTH){1'b0}};
  37. end
  38. else if(s_axis_tvalid)
  39. begin
  40. int_addr_reg <= int_addr_reg + 1'b1;
  41. end
  42. end
  43. assign sts_data = int_addr_reg;
  44. assign s_axis_tready = 1'b1;
  45. assign b_bram_clk = aclk;
  46. assign b_bram_rst = ~aresetn;
  47. assign b_bram_en = s_axis_tvalid;
  48. assign b_bram_we = {(BRAM_DATA_WIDTH/8){s_axis_tvalid}};
  49. assign b_bram_addr = int_addr_reg;
  50. assign b_bram_wdata = s_axis_tdata;
  51. endmodule