FftDataFormer.v 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137
  1. `timescale 1ns / 1ps
  2. (* keep_hierarchy = "yes" *)
  3. module FftDataFormer
  4. #(
  5. parameter AdcDataWidth = 16,
  6. parameter ExtAdcDataWidth = AdcDataWidth+2,
  7. parameter ChNum = 1,
  8. parameter OutDataWidth = 256,
  9. parameter DataValCycles = OutDataWidth/(AdcDataWidth*2)
  10. )
  11. (
  12. input Clk_i,
  13. input Rst_i,
  14. input OscWind_i,
  15. input [31:0] MeasNum_i,
  16. input [AdcDataWidth*2-1:0] AdcData_i,
  17. input AdcDataVal_i,
  18. output [OutDataWidth-1:0] OscDataBus_o,
  19. output OscDataBusVal_o
  20. );
  21. //================================================================================
  22. // REG/WIRE
  23. //================================================================================
  24. reg [OutDataWidth-1:0] oscDataBusReg;
  25. reg [OutDataWidth-1:0] oscDataBusRegReg;
  26. reg oscDataBusValReg;
  27. reg oscDataBusValRegReg;
  28. reg [DataValCycles-1:0] cycleCnt;
  29. reg [31:0] wrDataCnt;
  30. wire wrDone = OscWind_i? (wrDataCnt == MeasNum_i):1'b0;
  31. //================================================================================
  32. // ASSIGNMENTS
  33. //================================================================================
  34. assign OscDataBus_o = oscDataBusRegReg;
  35. assign OscDataBusVal_o = oscDataBusValRegReg;
  36. //================================================================================
  37. // CODING
  38. //================================================================================
  39. always @(posedge Clk_i) begin
  40. if (!Rst_i) begin
  41. if (OscWind_i) begin
  42. if (!wrDone) begin
  43. oscDataBusValRegReg <= oscDataBusValReg;
  44. end else begin
  45. oscDataBusValRegReg <= 0;
  46. end
  47. end else begin
  48. oscDataBusValRegReg <= 0;
  49. end
  50. end else begin
  51. oscDataBusValRegReg <= 0;
  52. end
  53. end
  54. always @(posedge Clk_i) begin
  55. if (!Rst_i) begin
  56. if (oscDataBusValReg) begin
  57. // oscDataBusRegReg <= oscDataBusReg;
  58. oscDataBusRegReg <= {oscDataBusReg[127:0], oscDataBusReg[OutDataWidth-1:128]};
  59. end
  60. end else begin
  61. oscDataBusRegReg <= 0;
  62. end
  63. end
  64. always @(posedge Clk_i) begin
  65. if (!Rst_i) begin
  66. if (OscWind_i) begin
  67. if (AdcDataVal_i) begin
  68. if (cycleCnt != DataValCycles-1) begin
  69. cycleCnt <= cycleCnt+4'd1;
  70. end else begin
  71. cycleCnt <= 4'd0;
  72. end
  73. end
  74. end else begin
  75. cycleCnt <= 0;
  76. end
  77. end else begin
  78. cycleCnt <= 4'd0;
  79. end
  80. end
  81. always @(posedge Clk_i) begin
  82. if (!Rst_i) begin
  83. if (OscWind_i) begin
  84. if (oscDataBusValRegReg) begin
  85. if (wrDataCnt != MeasNum_i) begin
  86. wrDataCnt <= wrDataCnt+1;
  87. end
  88. end
  89. end else begin
  90. wrDataCnt <= 0;
  91. end
  92. end else begin
  93. wrDataCnt <= 0;
  94. end
  95. end
  96. always @(posedge Clk_i) begin
  97. if (!Rst_i) begin
  98. if (OscWind_i) begin
  99. if (AdcDataVal_i) begin
  100. oscDataBusReg <= {oscDataBusReg[OutDataWidth-AdcDataWidth-1:0],AdcData_i}; //first points
  101. end
  102. end else begin
  103. oscDataBusReg <= 0;
  104. end
  105. end else begin
  106. oscDataBusReg <= 0;
  107. end
  108. end
  109. always @(posedge Clk_i) begin
  110. if (!Rst_i) begin
  111. if (cycleCnt == DataValCycles-1 & AdcDataVal_i) begin
  112. oscDataBusValReg <= 1'b1;
  113. end else begin
  114. oscDataBusValReg <= 1'b0;
  115. end
  116. end else begin
  117. oscDataBusValReg <= 1'b0;
  118. end
  119. end
  120. endmodule