axis_pdm.v 1.8 KB

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