赞
踩
在FPGA中实现浮点运算是一个复杂但有用的过程,因为浮点运算在许多应用中都是必需的,如数字信号处理、图像处理和科学计算等,上篇博客中介绍了在FPGA中使用浮点数运算的背景以及实现方式,传送链接:0315 FPGA的浮点数处理 I,本篇博客注重描述浮点数在FPGA中如何将有符号整数与单精度浮点数进行转换。
module Int2Fp(
input signed [15:0] iInteger,
output[26:0] oA
);
// output fields
wire A_s;
wire [7:0] A_e;
wire [17:0] A_f;
wire [15:0] abs_input ;
// get output sign bit
assign A_s = (iInteger < 0);
// remove sign from input
assign abs_input = (iInteger < 0)? -iInteger : iInteger ;
// find the most significant (nonzero) bit
wire [7:0] shft_amt;
assign shft_amt = abs_input[15] ? 8'd3 :
abs_input[14] ? 8'd4 : abs_input[13] ? 8'd5 :
abs_input[12] ? 8'd6 : abs_input[11] ? 8'd7 :
abs_input[10] ? 8'd8 : abs_input[9] ? 8'd9 :
abs_input[8] ? 8'd10 : abs_input[7] ? 8'd11 :
abs_input[6] ? 8'd12 : abs_input[5] ? 8'd13 :
abs_input[4] ? 8'd14 : abs_input[3] ? 8'd15 :
abs_input[2] ? 8'd16 : abs_input[1] ? 8'd17 :
abs_input[0] ? 8'd18 : 8'd19;
// exponent 127 + (18-shift_amt)
// 127 is 2^0
// 18 is amount '1' is shifted
assign A_e = 127 + 18 - shft_amt ;
// where the intermediate value is formed
wire [33:0] shift_buffer ;
// remember that the high-order '1' is not stored,
// but is shifted to bit 18
assign shift_buffer = {16'b0, abs_input} << shft_amt ;
assign A_f = shift_buffer[17:0];
assign oA = (iInteger==0)? 27'b0 : {A_s, A_e, A_f};
endmodule //Int2Fp
Int2Fp模块的作用是将一个16位的有符号整数(iInteger)转换为一个27位的浮点数(oA)。这个转换遵循IEEE 754标准的单精度浮点数格式,其中包含符号位(1位)、指数位(8位)和尾数位(或称为小数位,17位)。
对代码分析:
1、模块声明: 定义了模块名Int2Fp,输入输出端口。
2、输入输出定义: iInteger是一个16位有符号整数,oA是一个27位的输出,包含符号位、指数位和尾数位。
3、内部信号定义: 定义了用于中间计算的wire类型信号A_s(符号位)、A_e(指数位)和A_f(尾数位)。
4、绝对值计算: 通过比较iInteger与0,计算其绝对值abs_input。
5、符号位赋值: A_s根据iInteger的符号确定,如果iInteger是负数,则A_s为1,否则为0。
6、指数位计算: 通过查找abs_input中最显著的非零位,计算出需要左移的位数shft_amt。然后根据这个位数计算出指数位A_e,公式为127 + 18 - shft_amt,其中127是偏移值,18是因为尾数位是17位,加上隐含的1位,共18位。
7、尾数位计算: 首先构造了一个34位的shift_buffer,将abs_input左移shft_amt位,然后取低17位作为尾数A_f。
8、输出赋值: 如果输入iInteger为0,则输出oA为0;否则,将符号位、指数位和尾数位组合起来赋值给oA。
这个模块实现了整数到浮点数的转换,但需要注意的是,这个转换并没有考虑特殊情况,比如输入为0时,指数位和尾数位应该如何处理,以及如何处理溢出或非规格化数的情况。此外,这个实现也没有包括舍入逻辑,这在实际的浮点数运算中是非常重要的。
module Fp2Int(
input [26:0] iA,
output reg [15:0] oInteger
);
// Extract fields of A and B.
wire A_s;
wire [7:0] A_e;
wire [17:0] A_f;
assign A_s = iA[26];
assign A_e = iA[25:18];
assign A_f = iA[17:0];
wire [15:0] max_int = 16'h7fff ; //32768
wire [33:0] shift_buffer ;
// form (1.A_f) and shift it to postiion
assign shift_buffer = {15'b0, 1'b1, A_f}<<(A_e-127) ;
// If exponent less than 127, oInteger=0
// If exponent greater than 127+14 oInteger=max value
// Between these two values:
// set up input mantissa with 1.mantissa
// and the "1." in the lowest bit of an extended word.
// shift-left by A_e-127
// If the sign bit is set, negate oInteger
always @(*) begin
if (A_e < 127) oInteger = 16'b0;
else if (A_e > 141) begin
if (A_s) oInteger = -max_int;
else oInteger = max_int;
end
else begin
if (A_s) oInteger = -shift_buffer[33:18];
else oInteger = shift_buffer[33:18];
end
end
endmodule //Fp2Int
Fp2Int的模块,它的作用是将一个27位的浮点数(iA)转换为一个16位的有符号整数(oInteger)。这个转换同样遵循IEEE 754标准的单精度浮点数格式。
对代码分析:
1、模块声明: 定义了模块名Fp2Int,输入输出端口。
2、输入输出定义:iA是一个27位的浮点数输入,oInteger是一个16位的有符号整数输出。
33、信号提取: 从iA中提取符号位A_s、指数位A_e和尾数位A_f。
4、最大整数值定义: 定义了一个16位的最大正整数max_int。
5、中间变量定义: 定义了一个34位的shift_buffer,用于存储转换后的整数。
6、浮点数到整数的转换: 构造了一个中间值(1.A_f),然后根据指数位A_e和偏移量127进行左移操作,得到shift_buffer。
7、条件判断:
如果指数位A_e小于127,表示浮点数的值小于1,整数输出为0。
如果指数位A_e大于127加上15(因为16位整数可以表示的数值范围是-32768到32767),则根据符号位A_s,设置整数输出为最大正整数或其负数。
如果指数位在127和127+15之间,将shift_buffer的低16位赋值给整数输出,根据符号位A_s决定是正数还是负数。
**8、always块:**使用always块来描述浮点数到整数的转换逻辑。
这个模块实现了浮点数到整数的转换,但同样没有考虑特殊情况,比如当指数位等于127且尾数位非零时,应该如何处理。此外,这个实现也没有包括舍入逻辑,这在实际的浮点数运算中是非常重要的。
需要注意的是,代码中有几个潜在的问题:
shift_buffer的左移操作可能会导致溢出,因为当A_e大于127时,左移操作可能会超过34位。
当A_e等于127时,需要检查尾数位A_f是否为0,以确定是否应该舍入。
当A_e大于127且小于141时,需要考虑舍入规则,以确定最终的整数输出。
本篇博客注重描述浮点数在FPGA中如何将有符号整数与单精度浮点数进行转换。**这两个Verilog代码模块分别实现了整数到浮点数以及浮点数到整数的转换。**第一个模块Int2Fp接受一个16位有符号整数作为输入,将其转换为符合IEEE 754标准的27位单精度浮点数输出,包括符号位、指数和尾数。第二个模块Fp2Int则执行相反的操作,它将27位单精度浮点数作为输入,转换为16位有符号整数作为输出。在转换过程中,两个模块都考虑了正负符号、指数偏移以及尾数的位移,但都没有实现舍入逻辑,这在实际应用中是必要的,以确保数值的准确性和避免溢出。下一篇文章将继续在此基础上描述单精度浮点数乘、加、开方、绝对值等操作。
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。