axis_alex.v 2.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. `timescale 1 ns / 1 ps
  2. module axis_alex
  3. (
  4. // System signals
  5. input wire aclk,
  6. input wire aresetn,
  7. output wire [3:0] alex_data,
  8. // Slave side
  9. output wire s_axis_tready,
  10. input wire [31:0] s_axis_tdata,
  11. input wire s_axis_tvalid
  12. );
  13. reg [15:0] int_data_reg, int_data_next;
  14. reg [11:0] int_cntr_reg, int_cntr_next;
  15. reg [1:0] int_load_reg, int_load_next;
  16. reg int_enbl_reg, int_enbl_next;
  17. reg int_tready_reg, int_tready_next;
  18. always @(posedge aclk)
  19. begin
  20. if(~aresetn)
  21. begin
  22. int_data_reg <= 16'd0;
  23. int_cntr_reg <= 12'd0;
  24. int_load_reg <= 2'd0;
  25. int_enbl_reg <= 1'b0;
  26. int_tready_reg <= 1'b0;
  27. end
  28. else
  29. begin
  30. int_data_reg <= int_data_next;
  31. int_cntr_reg <= int_cntr_next;
  32. int_load_reg <= int_load_next;
  33. int_enbl_reg <= int_enbl_next;
  34. int_tready_reg <= int_tready_next;
  35. end
  36. end
  37. always @*
  38. begin
  39. int_data_next = int_data_reg;
  40. int_cntr_next = int_cntr_reg;
  41. int_load_next = int_load_reg;
  42. int_enbl_next = int_enbl_reg;
  43. int_tready_next = int_tready_reg;
  44. if(s_axis_tvalid & ~int_enbl_reg)
  45. begin
  46. int_data_next = s_axis_tdata[15:0];
  47. int_load_next = s_axis_tdata[17:16];
  48. int_enbl_next = 1'b1;
  49. int_tready_next = 1'b1;
  50. end
  51. if(int_tready_reg)
  52. begin
  53. int_tready_next = 1'b0;
  54. end
  55. if(int_enbl_reg)
  56. begin
  57. int_cntr_next = int_cntr_reg + 1'b1;
  58. end
  59. if(&int_cntr_reg[6:0])
  60. begin
  61. int_data_next = {int_data_reg[14:0], 1'b0};
  62. end
  63. if(int_cntr_reg[7] & int_cntr_reg[11])
  64. begin
  65. int_cntr_next = 12'd0;
  66. int_load_next = 2'd0;
  67. int_enbl_next = 1'b0;
  68. end
  69. end
  70. assign s_axis_tready = int_tready_reg;
  71. assign alex_data[0] = int_data_reg[15];
  72. assign alex_data[1] = int_cntr_reg[6] & ~int_cntr_reg[11];
  73. assign alex_data[2] = int_load_reg[0] & int_cntr_reg[6] & int_cntr_reg[11];
  74. assign alex_data[3] = int_load_reg[1] & int_cntr_reg[6] & int_cntr_reg[11];
  75. endmodule