MyIntToFp.v 3.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  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,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. output reg [OutWidth-1:0] OutData_o;
  36. output reg OutDataVal_o;
  37. //================================================================================
  38. // Func
  39. function integer Log2;
  40. input integer value;
  41. begin
  42. Log2 = 0;
  43. while (value > 1) begin
  44. value = value >> 1;
  45. Log2 = Log2 + 1;
  46. end
  47. if ((2**Log2)<InWidth) begin
  48. Log2 = Log2+1;
  49. end
  50. end
  51. endfunction
  52. localparam Stages = Log2(InWidth);
  53. //================================================================================
  54. // Coding
  55. reg [InWidth-1:0] inDataR;
  56. reg signR;
  57. reg outValR;
  58. wire [OutWidth-1:0] fpOut;
  59. wire [Stages-1:0] distance;
  60. genvar i;
  61. wire [ExpWidth-1:0] fpExp;
  62. always @(posedge Clk_i) begin
  63. if (Rst_i) begin
  64. inDataR <= {InWidth{1'b0}};
  65. signR <= 1'b0;
  66. outValR <= 1'b0;
  67. end else begin
  68. if (InData_i [InWidth-1]) begin
  69. inDataR <= ~InData_i+1'b1;
  70. end else begin
  71. inDataR <= InData_i;
  72. end
  73. signR <= InData_i[InWidth-1];
  74. outValR <= InDataVal_i;
  75. end
  76. end
  77. wire [(Stages+1)*InWidth-1:0] dataArray;
  78. assign dataArray [InWidth-1:0] = inDataR;
  79. generate
  80. for (i=0; i<Stages; i=i+1) begin: searchMSB
  81. wire [InWidth-1:0] dataIn;
  82. wire [InWidth-1:0] shiftedDataOut;
  83. wire [InWidth-1:0] dataOut;
  84. assign dataIn = dataArray[(i+1)*InWidth-1:i*InWidth];
  85. wire shiftDesired = ~|(dataIn[InWidth-1:InWidth-(1 << (Stages-1-i))]);
  86. assign distance[(Stages-1-i)] = shiftDesired;
  87. assign shiftedDataOut = dataIn << (1 << (Stages-1-i));
  88. assign dataOut = shiftDesired ? shiftedDataOut : dataIn;
  89. assign dataArray[(i+2)*InWidth-1:(i+1)*InWidth] = dataOut;
  90. end
  91. endgenerate
  92. wire [InWidth-1:0] scaledData = dataArray[(Stages+1)*InWidth-1:Stages*InWidth];
  93. wire [ManWidth-1:0] mantisa = scaledData[InWidth-2 -:ManWidth];
  94. assign fpExp = (ExpConst+(InWidth-1-FracWidth))-distance;
  95. assign fpOut = &distance ? {signR, 31'h0}: {signR, fpExp, mantisa};
  96. always @(posedge Clk_i or posedge Rst_i) begin
  97. if (Rst_i) begin
  98. OutData_o <= {OutWidth{1'b0}};
  99. OutDataVal_o <= 1'b0;
  100. end else begin
  101. if (outValR) begin
  102. if (fpOut!=0) begin
  103. OutData_o <= fpOut;
  104. end else begin
  105. OutData_o <= 32'h3a83126f;
  106. end
  107. end
  108. OutDataVal_o <= outValR;
  109. end
  110. end
  111. endmodule