axis_i2s.v 5.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. `timescale 1 ns / 1 ps
  2. module axis_i2s #
  3. (
  4. parameter integer AXIS_TDATA_WIDTH = 32
  5. )
  6. (
  7. // System signals
  8. input wire aclk,
  9. input wire aresetn,
  10. // I2S signals
  11. inout wire [3:0] gpio_data,
  12. // ALEX signals
  13. input wire alex_flag,
  14. input wire [3:0] alex_data,
  15. // Slave side
  16. output wire s_axis_tready,
  17. input wire [AXIS_TDATA_WIDTH-1:0] s_axis_tdata,
  18. input wire s_axis_tvalid,
  19. // Master side
  20. input wire m_axis_tready,
  21. output wire [AXIS_TDATA_WIDTH-1:0] m_axis_tdata,
  22. output wire m_axis_tvalid
  23. );
  24. localparam I2S_DATA_WIDTH = AXIS_TDATA_WIDTH / 2;
  25. localparam CNTR_WIDTH = 6;
  26. reg [2:0] int_bclk_reg, int_lrclk_reg;
  27. reg [1:0] int_data_reg;
  28. reg [1:0] adc_case_reg, adc_case_next;
  29. reg [CNTR_WIDTH-1:0] adc_cntr_reg, adc_cntr_next;
  30. reg [I2S_DATA_WIDTH-1:0] adc_data_reg, adc_data_next;
  31. reg [AXIS_TDATA_WIDTH-1:0] adc_tdata_reg, adc_tdata_next;
  32. reg adc_tvalid_reg, adc_tvalid_next;
  33. reg [1:0] dac_case_reg, dac_case_next;
  34. reg [I2S_DATA_WIDTH-1:0] dac_data_reg, dac_data_next;
  35. reg [AXIS_TDATA_WIDTH-1:0] dac_tdata_reg, dac_tdata_next;
  36. wire i2s_bclk, i2s_lrclk, i2s_adc_data, i2s_dac_data;
  37. wire int_bclk_posedge, int_bclk_negedge, int_lrclk_negedge;
  38. wire not_alex_flag = ~alex_flag;
  39. IOBUF buf_bclk (.O(i2s_bclk), .IO(gpio_data[0]), .I(alex_data[0]), .T(not_alex_flag));
  40. IOBUF buf_adc_data (.O(i2s_adc_data), .IO(gpio_data[1]), .I(alex_data[1]), .T(not_alex_flag));
  41. IOBUF buf_dac_data (.O(), .IO(gpio_data[2]), .I(alex_flag ? alex_data[2] : i2s_dac_data), .T(1'b0));
  42. IOBUF buf_lrclk (.O(i2s_lrclk), .IO(gpio_data[3]), .I(alex_data[3]), .T(not_alex_flag));
  43. always @(posedge aclk)
  44. begin
  45. if(~aresetn)
  46. begin
  47. int_bclk_reg <= 3'd0;
  48. int_lrclk_reg <= 3'd0;
  49. int_data_reg <= 2'd0;
  50. adc_case_reg <= 2'd0;
  51. adc_cntr_reg <= {(CNTR_WIDTH){1'b0}};
  52. adc_data_reg <= {(I2S_DATA_WIDTH){1'b0}};
  53. adc_tdata_reg <= {(AXIS_TDATA_WIDTH){1'b0}};
  54. adc_tvalid_reg <= 1'b0;
  55. dac_case_reg <= 2'd0;
  56. dac_data_reg <= {(I2S_DATA_WIDTH){1'b0}};
  57. dac_tdata_reg <= {(AXIS_TDATA_WIDTH){1'b0}};
  58. end
  59. else
  60. begin
  61. int_bclk_reg <= {int_bclk_reg[1:0], i2s_bclk};
  62. int_lrclk_reg <= {int_lrclk_reg[1:0], i2s_lrclk};
  63. int_data_reg <= {int_data_reg[0], i2s_adc_data};
  64. adc_case_reg <= adc_case_next;
  65. adc_cntr_reg <= adc_cntr_next;
  66. adc_data_reg <= adc_data_next;
  67. adc_tdata_reg <= adc_tdata_next;
  68. adc_tvalid_reg <= adc_tvalid_next;
  69. dac_case_reg <= dac_case_next;
  70. dac_data_reg <= dac_data_next;
  71. dac_tdata_reg <= dac_tdata_next;
  72. end
  73. end
  74. assign int_bclk_posedge = int_bclk_reg[1] & ~int_bclk_reg[2];
  75. assign int_bclk_negedge = ~int_bclk_reg[1] & int_bclk_reg[2];
  76. assign int_lrclk_negedge = ~int_lrclk_reg[1] & int_lrclk_reg[2];
  77. always @*
  78. begin
  79. adc_case_next = adc_case_reg;
  80. adc_cntr_next = adc_cntr_reg;
  81. adc_data_next = adc_data_reg;
  82. adc_tdata_next = adc_tdata_reg;
  83. adc_tvalid_next = adc_tvalid_reg;
  84. if(int_bclk_posedge & (adc_cntr_reg < I2S_DATA_WIDTH))
  85. begin
  86. adc_data_next = {adc_data_reg[I2S_DATA_WIDTH-2:0], int_data_reg[1]};
  87. adc_cntr_next = adc_cntr_reg + 1'b1;
  88. end
  89. if(m_axis_tready & adc_tvalid_reg)
  90. begin
  91. adc_tvalid_next = 1'b0;
  92. end
  93. case(adc_case_reg)
  94. 2'd0:
  95. begin
  96. if(int_lrclk_reg[1] ^ int_lrclk_reg[2])
  97. begin
  98. adc_case_next = 2'd1;
  99. end
  100. end
  101. 2'd1:
  102. begin
  103. if(int_bclk_posedge)
  104. begin
  105. adc_cntr_next = {(CNTR_WIDTH){1'b0}};
  106. adc_case_next = 2'd2;
  107. end
  108. end
  109. 2'd2:
  110. begin
  111. if(int_bclk_posedge)
  112. begin
  113. adc_tvalid_next = ~int_lrclk_reg[1];
  114. adc_tdata_next = {adc_tdata_reg[I2S_DATA_WIDTH-1:0], adc_data_reg};
  115. adc_case_next = 2'd0;
  116. end
  117. end
  118. endcase
  119. end
  120. always @*
  121. begin
  122. dac_case_next = dac_case_reg;
  123. dac_data_next = dac_data_reg;
  124. dac_tdata_next = dac_tdata_reg;
  125. if(int_bclk_negedge)
  126. begin
  127. dac_data_next = {dac_data_reg[I2S_DATA_WIDTH-2:0], 1'b0};
  128. end
  129. if(int_lrclk_negedge)
  130. begin
  131. dac_tdata_next = s_axis_tvalid ? s_axis_tdata : {(AXIS_TDATA_WIDTH){1'b0}};
  132. end
  133. case(dac_case_reg)
  134. 2'd0:
  135. begin
  136. if(int_lrclk_reg[1] ^ int_lrclk_reg[2])
  137. begin
  138. dac_case_next = 2'd1;
  139. end
  140. end
  141. 2'd1:
  142. begin
  143. if(int_bclk_posedge)
  144. begin
  145. dac_case_next = 2'd2;
  146. end
  147. end
  148. 2'd2:
  149. begin
  150. if(int_bclk_negedge)
  151. begin
  152. dac_data_next = int_lrclk_reg[1] ? dac_tdata_reg[I2S_DATA_WIDTH-1:0] : dac_tdata_reg[AXIS_TDATA_WIDTH-1:I2S_DATA_WIDTH];
  153. dac_case_next = 2'd0;
  154. end
  155. end
  156. endcase
  157. end
  158. assign i2s_dac_data = dac_data_reg[I2S_DATA_WIDTH-1];
  159. assign s_axis_tready = int_lrclk_negedge;
  160. assign m_axis_tdata = adc_tdata_reg;
  161. assign m_axis_tvalid = adc_tvalid_reg;
  162. endmodule