MyIntToFp.v 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153
  1. `timescale 1ns / 1ps
  2. //////////////////////////////////////////////////////////////////////////////////
  3. // Company:
  4. // Engineer:
  5. //
  6. // Create Date: 12:14:34 01/28/2021
  7. // Design Name:
  8. // Module Name: FpConvTop
  9. // Project Name:
  10. // Target Devices:
  11. // Tool versions:
  12. // Description:
  13. //
  14. // Dependencies:
  15. //
  16. // Revision:
  17. // Revision 0.01 - File Created
  18. // Additional Comments:
  19. //
  20. //////////////////////////////////////////////////////////////////////////////////
  21. module MyIntToFp
  22. #(
  23. parameter InWidth = 32,
  24. parameter ExpWidth = 8,
  25. parameter ManWidth = 23,
  26. parameter FracWidth = 17
  27. )
  28. (Clk_i,Rst_i,InData_i,AverageNoizeLvl_i,InDataVal_i,OutData_o,OutDataVal_o);
  29. input Clk_i;
  30. input Rst_i;
  31. input [InWidth-1:0] InData_i;
  32. input InDataVal_i;
  33. localparam OutWidth = 1+ExpWidth+ManWidth; //sign+ExpWidth+ManWidth
  34. localparam ExpConst = (2**(ExpWidth-1))-1;
  35. input [OutWidth-1:0] AverageNoizeLvl_i;
  36. output reg [OutWidth-1:0] OutData_o;
  37. output reg OutDataVal_o;
  38. //================================================================================
  39. // Func
  40. function integer Log2;
  41. input integer value;
  42. begin
  43. Log2 = 0;
  44. while (value > 1) begin
  45. value = value >> 1;
  46. Log2 = Log2 + 1;
  47. end
  48. if ((2**Log2)<InWidth) begin
  49. Log2 = Log2+1;
  50. end
  51. end
  52. endfunction
  53. localparam Stages = Log2(InWidth);
  54. //================================================================================
  55. // Coding
  56. reg [InWidth-1:0] inDataR;
  57. reg signR;
  58. reg outValR;
  59. wire [OutWidth-1:0] fpOut;
  60. wire [Stages-1:0] distance;
  61. genvar i;
  62. wire [ExpWidth-1:0] fpExp;
  63. always @(posedge Clk_i) begin
  64. if (Rst_i) begin
  65. inDataR <= {InWidth{1'b0}};
  66. signR <= 1'b0;
  67. outValR <= 1'b0;
  68. end else begin
  69. if (InData_i [InWidth-1]) begin
  70. inDataR <= ~InData_i+1'b1;
  71. end else begin
  72. inDataR <= InData_i;
  73. end
  74. signR <= InData_i[InWidth-1];
  75. outValR <= InDataVal_i;
  76. end
  77. end
  78. wire [(Stages+1)*InWidth-1:0] dataArray;
  79. assign dataArray [InWidth-1:0] = inDataR;
  80. generate
  81. for (i=0; i<Stages; i=i+1) begin: searchMSB
  82. wire [InWidth-1:0] dataIn;
  83. wire [InWidth-1:0] shiftedDataOut;
  84. wire [InWidth-1:0] dataOut;
  85. assign dataIn = dataArray[(i+1)*InWidth-1:i*InWidth];
  86. wire shiftDesired = ~|(dataIn[InWidth-1:InWidth-(1 << (Stages-1-i))]);
  87. assign distance[(Stages-1-i)] = shiftDesired;
  88. assign shiftedDataOut = dataIn << (1 << (Stages-1-i));
  89. assign dataOut = shiftDesired ? shiftedDataOut : dataIn;
  90. assign dataArray[(i+2)*InWidth-1:(i+1)*InWidth] = dataOut;
  91. end
  92. endgenerate
  93. wire [InWidth-1:0] scaledData = dataArray[(Stages+1)*InWidth-1:Stages*InWidth];
  94. wire [ManWidth-1:0] mantisa = scaledData[InWidth-2 -:ManWidth];
  95. assign fpExp = (ExpConst+(InWidth-1-FracWidth))-distance;
  96. assign fpOut = &distance ? {signR, 31'h0}: {signR, fpExp, mantisa};
  97. always @(posedge Clk_i or posedge Rst_i) begin
  98. if (Rst_i) begin
  99. OutData_o <= {OutWidth{1'b0}};
  100. OutDataVal_o <= 1'b0;
  101. end else begin
  102. if (outValR) begin
  103. if (fpOut!=0) begin
  104. OutData_o <= fpOut;
  105. end else begin
  106. // OutData_o <= 32'h3a83126f;
  107. OutData_o <= AverageNoizeLvl_i;
  108. end
  109. end
  110. OutDataVal_o <= outValR;
  111. end
  112. end
  113. endmodule