axis_keyer.v 3.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111
  1. `timescale 1 ns / 1 ps
  2. module axis_keyer #
  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. input wire [BRAM_ADDR_WIDTH-1:0] cfg_data,
  13. input wire key_flag,
  14. // Master side
  15. output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  16. output wire m_axis_tvalid,
  17. input wire m_axis_tready,
  18. // BRAM port
  19. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram CLK" *)
  20. output wire b_bram_clk,
  21. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram RST" *)
  22. output wire b_bram_rst,
  23. (* X_INTERFACE_INFO = "xilinx.com:interface:bram:1.0 b_bram EN" *)
  24. output wire b_bram_en,
  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 DOUT" *)
  28. input wire [BRAM_DATA_WIDTH-1:0] b_bram_rdata
  29. );
  30. reg [BRAM_ADDR_WIDTH-1:0] int_addr_reg, int_addr_next;
  31. reg [BRAM_ADDR_WIDTH-1:0] int_data_reg;
  32. reg int_enbl_reg, int_enbl_next;
  33. wire [1:0] int_valid_wire, int_ready_wire;
  34. wire [1:0] int_comp_wire;
  35. always @(posedge aclk)
  36. begin
  37. if(~aresetn)
  38. begin
  39. int_addr_reg <= {(BRAM_ADDR_WIDTH){1'b0}};
  40. int_data_reg <= {(BRAM_ADDR_WIDTH){1'b0}};
  41. int_enbl_reg <= 1'b0;
  42. end
  43. else
  44. begin
  45. int_addr_reg <= int_addr_next;
  46. int_data_reg <= cfg_data;
  47. int_enbl_reg <= int_enbl_next;
  48. end
  49. end
  50. assign int_comp_wire = {|int_addr_reg, int_addr_reg < int_data_reg};
  51. assign int_valid_wire[0] = 1'b1;
  52. always @*
  53. begin
  54. int_addr_next = int_addr_reg;
  55. int_enbl_next = int_enbl_reg;
  56. if(~int_enbl_reg & ~int_comp_wire[1] & key_flag)
  57. begin
  58. int_enbl_next = 1'b1;
  59. end
  60. if(int_ready_wire[0] & int_enbl_reg & int_comp_wire[0])
  61. begin
  62. int_addr_next = int_addr_reg + 1'b1;
  63. end
  64. if(int_ready_wire[0] & int_enbl_reg & ~int_comp_wire[0] & ~key_flag)
  65. begin
  66. int_enbl_next = 1'b0;
  67. end
  68. if(int_ready_wire[0] & ~int_enbl_reg & int_comp_wire[1])
  69. begin
  70. int_addr_next = int_addr_reg - 1'b1;
  71. end
  72. end
  73. output_buffer #(
  74. .DATA_WIDTH(0)
  75. ) buf_0 (
  76. .aclk(aclk), .aresetn(aresetn),
  77. .in_valid(int_valid_wire[0]), .in_ready(int_ready_wire[0]),
  78. .out_valid(int_valid_wire[1]), .out_ready(int_ready_wire[1])
  79. );
  80. inout_buffer #(
  81. .DATA_WIDTH(AXIS_TDATA_WIDTH)
  82. ) buf_1 (
  83. .aclk(aclk), .aresetn(aresetn),
  84. .in_data(b_bram_rdata), .in_valid(int_valid_wire[1]), .in_ready(int_ready_wire[1]),
  85. .out_data(m_axis_tdata), .out_valid(m_axis_tvalid), .out_ready(m_axis_tready)
  86. );
  87. assign b_bram_clk = aclk;
  88. assign b_bram_rst = ~aresetn;
  89. assign b_bram_en = int_ready_wire[0];
  90. assign b_bram_addr = int_addr_reg;
  91. endmodule