axis_ram_reader_radar.v 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. `timescale 1 ns / 1 ps
  2. module axis_ram_reader #
  3. (
  4. parameter integer ADDR_WIDTH = 16,
  5. parameter integer AXI_ID_WIDTH = 6,
  6. parameter integer AXI_ADDR_WIDTH = 32,
  7. parameter integer AXI_DATA_WIDTH = 64,
  8. parameter integer AXIS_TDATA_WIDTH = 64,
  9. parameter integer FIFO_WRITE_DEPTH = 512
  10. )
  11. (
  12. input wire aclk,
  13. input wire aresetn,
  14. input wire [AXI_ADDR_WIDTH-1:0] min_addr,
  15. input wire [ADDR_WIDTH-1:0] cfg_data,
  16. output wire [ADDR_WIDTH-1:0] sts_data,
  17. output wire [AXI_ID_WIDTH-1:0] m_axi_arid,
  18. output wire [3:0] m_axi_arlen,
  19. output wire [2:0] m_axi_arsize,
  20. output wire [1:0] m_axi_arburst,
  21. output wire [3:0] m_axi_arcache,
  22. output wire [AXI_ADDR_WIDTH-1:0] m_axi_araddr,
  23. output wire m_axi_arvalid,
  24. input wire m_axi_arready,
  25. input wire [AXI_ID_WIDTH-1:0] m_axi_rid,
  26. input wire m_axi_rlast,
  27. input wire [AXI_DATA_WIDTH-1:0] m_axi_rdata,
  28. input wire m_axi_rvalid,
  29. output wire m_axi_rready,
  30. output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  31. output wire m_axis_tvalid,
  32. input wire m_axis_tready
  33. );
  34. localparam integer ADDR_SIZE = $clog2(AXI_DATA_WIDTH / 8);
  35. localparam integer COUNT_WIDTH = $clog2(FIFO_WRITE_DEPTH) + 1;
  36. reg int_arvalid_reg, int_rvalid_reg;
  37. reg [ADDR_WIDTH-1:0] int_addr_reg, int_data_reg;
  38. wire int_empty_wire, int_valid_wire;
  39. wire int_arvalid_wire, int_arready_wire;
  40. wire [COUNT_WIDTH-1:0] int_count_wire;
  41. assign int_valid_wire = (int_count_wire < FIFO_WRITE_DEPTH - 15) & ~int_rvalid_reg;
  42. assign int_arvalid_wire = int_valid_wire | int_arvalid_reg;
  43. xpm_fifo_sync #(
  44. .WRITE_DATA_WIDTH(AXI_DATA_WIDTH),
  45. .FIFO_WRITE_DEPTH(FIFO_WRITE_DEPTH),
  46. .READ_DATA_WIDTH(AXIS_TDATA_WIDTH),
  47. .READ_MODE("fwft"),
  48. .FIFO_READ_LATENCY(0),
  49. .FIFO_MEMORY_TYPE("block"),
  50. .USE_ADV_FEATURES("0004"),
  51. .WR_DATA_COUNT_WIDTH(COUNT_WIDTH)
  52. ) fifo_0 (
  53. .empty(int_empty_wire),
  54. .wr_data_count(int_count_wire),
  55. .rst(~aresetn),
  56. .wr_clk(aclk),
  57. .wr_en(m_axi_rvalid),
  58. .din(m_axi_rdata),
  59. .rd_en(m_axis_tready),
  60. .dout(m_axis_tdata)
  61. );
  62. always @(posedge aclk)
  63. begin
  64. if(~aresetn)
  65. begin
  66. int_arvalid_reg <= 1'b0;
  67. int_rvalid_reg <= 1'b0;
  68. int_addr_reg <= {(ADDR_WIDTH){1'b0}};
  69. end
  70. else
  71. begin
  72. if(int_valid_wire)
  73. begin
  74. int_arvalid_reg <= 1'b1;
  75. int_rvalid_reg <= 1'b1;
  76. end
  77. if(int_arvalid_wire & int_arready_wire) // when we need to produce next sample
  78. begin
  79. int_arvalid_reg <= 1'b0;
  80. if(int_addr_reg < int_data_reg)
  81. begin
  82. int_addr_reg <= int_addr_reg + 1'b1;
  83. end
  84. else
  85. begin
  86. int_addr_reg <= {cfg_data[15:14], 14'd0}; // bits 15:14 = at which quarter of the buffer to start; then start with the low 14 bits zero - the beginning of the quarter
  87. int_data_reg <= cfg_data;
  88. end
  89. end
  90. if(m_axi_rlast)
  91. begin
  92. int_rvalid_reg <= 1'b0;
  93. end
  94. end
  95. end
  96. output_buffer #(
  97. .DATA_WIDTH(AXI_ADDR_WIDTH)
  98. ) buf_0 (
  99. .aclk(aclk), .aresetn(aresetn),
  100. .in_data(min_addr + {int_addr_reg, 4'd0, {(ADDR_SIZE){1'b0}}}),
  101. .in_valid(int_arvalid_wire), .in_ready(int_arready_wire),
  102. .out_data(m_axi_araddr),
  103. .out_valid(m_axi_arvalid), .out_ready(m_axi_arready)
  104. );
  105. assign sts_data = int_addr_reg;
  106. assign m_axi_arid = {(AXI_ID_WIDTH){1'b0}};
  107. assign m_axi_arlen = 4'd15;
  108. assign m_axi_arsize = ADDR_SIZE;
  109. assign m_axi_arburst = 2'b01;
  110. assign m_axi_arcache = 4'b0110;
  111. assign m_axi_rready = 1'b1;
  112. assign m_axis_tvalid = ~int_empty_wire;
  113. endmodule