DspPpiOut.v 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160
  1. `timescale 1ns / 1ps
  2. (* keep_hierarchy = "yes" *)
  3. //////////////////////////////////////////////////////////////////////////////////
  4. // Company:
  5. // Engineer: Churbanov S.
  6. //
  7. // Create Date: 10:00:14 13/08/2019
  8. // Design Name:
  9. // Module Name: DspPpiOut
  10. // Project Name:
  11. // Target Devices:
  12. // Tool versions:
  13. // Description:
  14. //
  15. // Dependencies:
  16. //
  17. // Revision:
  18. // Revision 0.01 - File Created
  19. // Additional Comments:
  20. //
  21. //////////////////////////////////////////////////////////////////////////////////
  22. module DspPpiOut
  23. #(
  24. parameter ODataWidth = 16,
  25. parameter ResultWidth = 40,
  26. parameter ChNum = 8,
  27. localparam DataBusWidth = ((ChNum*2)+1)*ResultWidth,
  28. localparam ServisePattern = 32'hABCD
  29. )
  30. (
  31. input Rst_i,
  32. input Clk_i,
  33. input [ChNum-1:0] ServiseRegData_i,
  34. input [ResultWidth*(ChNum*2)-1:0] MeasDataBus_i,
  35. input LpOutStart_i,
  36. output PpiBusy_o,
  37. output LpOutClk_o,
  38. output LpOutFs_o,
  39. output [ODataWidth-1:0] LpOutData_o
  40. );
  41. //================================================================================
  42. // REG/WIRE
  43. //================================================================================
  44. reg lpDataRst;
  45. reg [5:0] txCnt = 6'd0;
  46. reg [DataBusWidth-1:0] lpDataBuf;
  47. reg dataShEn;
  48. reg dataValid;
  49. reg lpOutFs;
  50. reg ppiBusy;
  51. wire oddrCe = (txCnt <= 6'd19 && dataValid) ? 1'b1:1'b0;
  52. wire [7:0] ampEnT1 = {{7{1'b0}},ServiseRegData_i[0]};
  53. wire [7:0] ampEnR1 = {{7{1'b0}},ServiseRegData_i[1]};
  54. wire [7:0] ampEnR2 = {{7{1'b0}},ServiseRegData_i[2]};
  55. wire [7:0] ampEnT2 = {{7{1'b0}},ServiseRegData_i[3]};
  56. wire [31:0] serviceData = {ampEnR2,ampEnT2,ampEnR1,ampEnT1};
  57. wire outDataVal = (txCnt <= 18 && txCnt != 0);
  58. //================================================================================
  59. // ASSIGNMENTS
  60. //================================================================================
  61. assign LpOutData_o = lpDataBuf[ODataWidth-1:0];
  62. assign LpOutFs_o = lpOutFs;
  63. assign PpiBusy_o = ppiBusy;
  64. //================================================================================
  65. // CODING
  66. //================================================================================
  67. always @(posedge Clk_i) begin
  68. if (!Rst_i) begin
  69. if (LpOutStart_i) begin
  70. ppiBusy <= 1'b1;
  71. end else if (!dataValid) begin
  72. ppiBusy <= 1'b0;
  73. end
  74. end else begin
  75. ppiBusy <= 1'b0;
  76. end
  77. end
  78. always @(posedge Clk_i) begin
  79. if (!Rst_i) begin
  80. if (LpOutStart_i) begin
  81. txCnt <= 6'd19;
  82. end else if (dataValid) begin
  83. txCnt <= txCnt - 6'd1;
  84. end
  85. end else begin
  86. txCnt <= 6'd0;
  87. end
  88. end
  89. always @(*) begin
  90. case (txCnt)
  91. 6'd19: begin
  92. dataShEn = 1'b0;
  93. dataValid = 1'b1;
  94. lpOutFs = 1'b0;
  95. end
  96. 6'd18: begin
  97. dataShEn = 1'b1;
  98. dataValid = 1'b1;
  99. lpOutFs = 1'b1;
  100. end
  101. 6'd17: begin
  102. dataShEn = 1'b1;
  103. dataValid = 1'b1;
  104. lpOutFs = 1'b0;
  105. end
  106. 6'd0: begin
  107. dataShEn = 1'b0;
  108. dataValid = 1'b0;
  109. lpOutFs = 1'b0;
  110. end
  111. default:
  112. begin
  113. dataShEn = 1'b1;
  114. dataValid = 1'b1;
  115. lpOutFs = 1'b0;
  116. end
  117. endcase
  118. end
  119. always @(posedge Clk_i) begin
  120. if (!Rst_i) begin
  121. if (txCnt == 6'd19) begin
  122. lpDataBuf <= {serviceData,MeasDataBus_i};
  123. end else if (dataShEn) begin
  124. lpDataBuf <= {{ODataWidth{1'b0}},lpDataBuf[DataBusWidth-1:ODataWidth]};
  125. end
  126. end else begin
  127. lpDataBuf <= {DataBusWidth{1'b0}};
  128. end
  129. end
  130. //================================================================================
  131. // INSTANTIATIONS
  132. //================================================================================
  133. ODDR2
  134. #(
  135. .DDR_ALIGNMENT("NONE"),
  136. .INIT (1'b0),
  137. .SRTYPE ("SYNC")
  138. ) clk_i10OutInst (
  139. .Q (LpOutClk_o),
  140. .C0 (Clk_i),
  141. .C1 (~Clk_i),
  142. .CE (1'b1),
  143. .D0 (1'b1),
  144. .D1 (1'b0),
  145. .R (1'b0),
  146. .S (1'b0)
  147. );
  148. endmodule