FPGA定点运算

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/zdfmessi/article/details/53125817

1、定点小数运算

所谓定点小数,实际上就是用整数来进行小数运算。以16bit的存储单位最多可以表示0x0000到0xffff,65536种状态,如果表示无符号整数的话,就是从0到65535.如果需要表示负数的话,那么最高位就是符号位,而剩下的15位就可以表示32768种状态。对于计算机来说,符号并没有特殊的存储形式,其实是和数字一起存储的。为了使得无论是无符号还是有符号数都可以用同样的加法减法规则,符号数中的负数用正数的补码表示。

补码 :计算机中符号数有三种表示方法,原码、反码和补码。三种表示方法均有符号位和数值位两部分,符号位都是用0表示正,用1表示负,而数值部分,三种表示方法各有不同

在计算机系统中,数值一律用补码来表示和存储。原因是,使用补码,可以将符号位和数值域统一处理;同时加法和减法也可以统一处理。此外,补码和原码相互转换,其运算过程是相同的,不需要额外的硬件电路

特性

1、一个负整数(或原码)与其补码相加,和为模

2、对一个整数的补码再求补码,等于该整数自身。

3、补码的正零和负零表示方法相同

模是指一个计量系统的计数范围,表示n位的计算机计量范围是0~2^(n)-1,模=2^(n)。补码系统的0只有一个表示方式,这点和一补数系统不同(在一补数系统中,0有二种表示方式),因此在判断数字是否为0时,只要比较一次即可。特别的数字有两个数字的补码等于本身,一个是0,另一个为该比特可表示最大绝对值负数(即1000...)。在FPGA综合电路的时候最底层都是以补码的形式在运算,正数的补码是本身,负数的补码要取反加1。所以,有符号数的定点运算是这个进行的:

module FixMulti#(
parameter INT_WIDTH = 16,
parameter FIX_POINT_WIDTH = 16
)
(
input clk,
input rstn,
input signed [(INT_WIDTH+FIX_POINT_WIDTH)-1 : 0] ia,
input signed [(INT_WIDTH+FIX_POINT_WIDTH)-1 : 0] ib,
output  signed [(INT_WIDTH+FIX_POINT_WIDTH)*2-1 : 0] out
    );
(* multstyle = "dsp" *) wire signed [INT_WIDTH*2+FIX_POINT_WIDTH*2 -1: 0] long;

assign long = ia * ib;	
	
assign out = long>>>FIX_POINT_WIDTH;	
	
endmodule
运算结果也是以补码的形式给出,即正数是本身,负数需要再做一次补码转换。比如:
initial begin
		// Initialize Inputs
		clk = 0;
		rstn = 0;
		ia = 0;
		ib = 0;

		// Wait 100 ns for global reset to finish
		#100;
		rstn = 1;
		//ia = 5.1125; ib = -156.1567
		//ia_multi = 5.1125*65536 = 335052; ib = -156.1567*65536 = 10233885
		ia = 32'h0005_1ccc;
		ib = 32'h809c_281d;
		#100;
		ia = 32'h8004_0000;
		ib = 32'h8005_0000;
		#100;
		ia = 32'h0004_0000;
		ib = 32'h8005_0000;
		#100;
		ia = 32'h0004_0000;
		ib = 32'h0005_0000;
其仿真结果如下:

对结果再除以(2^n+1)(n就是定点数),即可得到需要的结果。








展开阅读全文

没有更多推荐了,返回首页