OscDataFormer.v 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132
  1. `timescale 1ns / 1ps
  2. (* keep_hierarchy = "yes" *)
  3. module OscDataFormer
  4. #(
  5. parameter AdcDataWidth = 14,
  6. parameter ExtAdcDataWidth = AdcDataWidth+2,
  7. parameter ChNum = 1,
  8. parameter DataValCycles = 16,
  9. parameter OutDataWidth = (16*ChNum)*DataValCycles
  10. )
  11. (
  12. input Clk_i,
  13. input Rst_i,
  14. input OscWind_i,
  15. input [31:0] MeasNum_i,
  16. input [AdcDataWidth-1:0] AdcData_i,
  17. output [OutDataWidth-1:0] OscDataBus_o,
  18. output OscDataBusVal_o
  19. );
  20. //================================================================================
  21. // REG/WIRE
  22. //================================================================================
  23. wire signed [15:0] adcDataExt = {{2{AdcData_i[AdcDataWidth-1]}},AdcData_i};
  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[127:0], oscDataBusReg[OutDataWidth-1:128]};
  58. // oscDataBusRegReg <= {16'h7,16'h6,16'h5,16'h4,16'h3,16'h2,16'h1,16'h0,16'hF,16'hE,16'hD,16'hC,16'hB,16'hA,16'h9,16'h8};
  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 (cycleCnt != DataValCycles-1) begin
  68. cycleCnt <= cycleCnt+4'd1;
  69. end else begin
  70. cycleCnt <= 4'd0;
  71. end
  72. end else begin
  73. cycleCnt <= 0;
  74. end
  75. end else begin
  76. cycleCnt <= 4'd0;
  77. end
  78. end
  79. always @(posedge Clk_i) begin
  80. if (!Rst_i) begin
  81. if (OscWind_i) begin
  82. if (oscDataBusValRegReg) begin
  83. if (wrDataCnt != MeasNum_i) begin
  84. wrDataCnt <= wrDataCnt+1;
  85. end
  86. end
  87. end else begin
  88. wrDataCnt <= 0;
  89. end
  90. end else begin
  91. wrDataCnt <= 0;
  92. end
  93. end
  94. always @(posedge Clk_i) begin
  95. if (!Rst_i) begin
  96. if (OscWind_i) begin
  97. oscDataBusReg <= {adcDataExt,oscDataBusReg[OutDataWidth-1:AdcDataWidth+2]}; //first points
  98. end else begin
  99. oscDataBusReg <= 0;
  100. end
  101. end else begin
  102. oscDataBusReg <= 0;
  103. end
  104. end
  105. always @(posedge Clk_i) begin
  106. if (!Rst_i) begin
  107. if (cycleCnt == DataValCycles-1) begin
  108. oscDataBusValReg <= 1'b1;
  109. end else begin
  110. oscDataBusValReg <= 1'b0;
  111. end
  112. end else begin
  113. oscDataBusValReg <= 1'b0;
  114. end
  115. end
  116. endmodule