FPGA中的小数计算(定点小数) 与 verilog/VHDL有符号数计算

您所在的位置:网站首页 小数怎么用英文读写出来 FPGA中的小数计算(定点小数) 与 verilog/VHDL有符号数计算

FPGA中的小数计算(定点小数) 与 verilog/VHDL有符号数计算

2024-07-17 05:02| 来源: 网络整理| 查看: 265

这篇blog有两个关键点,如题,一是关于FPGA或者说HDL是如何执行定点小数运算的;二是verilog和VHDL有符号数运算的解释和对比。

1. 小数计算(定点小数) 1.1 用二进制表示小数

由于FPGA中存在的都是二进制数,所以首先明确一个知识点:如何用二进制表示小数? 这里写图片描述 如上图,一个带小数点的8位二进制所表示的数的大小就是:1*4+1*2+1*1+1*0.5+1*0.25+1*0.125+1*0.0625+1*0.03125 = 7.96875.实际上还有另外一种表示方式:0xff/2^5 = 7.96875. 由于我上面的8位数用5位表示小数,所以能表示的最小粒度即LSB就是0.03125,就是说只能表示0.03125的整数倍;从这里我们也可以看出,用来表示小数的位数越多,可以表示的小数范围越大,表示的越精准。 x表示实际的数(浮点数,如2.2), q表示它的n位定点小数。

q = (int) (x * 2^n) x = (float)q/2^n

比如我想把2.2转换为有5为小数的8位二进制。则2.2*2^5 = 70.4,取整数即70=b’1000110. 那么整数70表示的实际小数是多少呢,70/2^5 = 2.1875,所以我其实是用2.1875来近似表示了2.2.

1.2 小数的加减乘除

执行运算的基本原则如下所示,其中x1, x2, x3代表三个浮点数,q1, q2, q3代表其二进制表示。

q3 = q1 + q2 若 x3 = x1 + x2 q3 = q1 - q2 若 x3 = x1 - x2 q3 = q1 * q2 / 2^n 若 x3 = x1 * x2 q3 = q1 * 2^n / q2 若 x3 = x1 / x2

加法和减法运算不做解释,对于乘法运算: 这里写图片描述 如上所示,两个16位数相乘,将得到一个32位数。可以看作是整数部分两个8位相乘得到一个16位整数;小数部分两个16位相乘得到一个16位小数。如果最后我们想要一个16位的结果,就只能选择中间的16位,将得到的32位数右移8位之后,高位截断8位,就可以得到我们要的16位结果。这就是上面 “/2^n”的来源。 除法比较复杂,不在此解释。

2. FPGA有符号数运算

在FPGA中,有符号数的运算规则是不需要自己来写的,比如对于负数还要考虑反码啊啥的,这些都是不用考虑的,无论是Verilog还是VHDL都给我们提供了相应的解决方案。

2.1 Verilog有符号数运算

对于Verilog,这里我直接翻译一位大神的博客。原网址见:http://billauer.co.il/blog/2012/10/signed-arithmetics-verilog/

黄金法则:两个操作数必须都是有符号数,结果才是有符号数!

Verilog倾向于使用无符号数,比如以下几种计算的结果都会是无符号数:

任何有两个操作数的计算。除非这两个都是有符号数基本的数字的运算(如12’d10),除非显示指定了“s”位选操作Part-select results 级联操作 Concatenations

所以,要进行有符号数运算,要么使用$signed系统函数,要么在定义wire或者reg类型变量时加上signed。 例如要把一个有符号数和一个无符号数相乘,得到一个有符号数,要这样做:

reg [15:0] a; // Unsigned reg signed [15:0] b; wire signed [16:0] signed_a; wire signed [31:0] a_mult_b; assign signed_a = a; // Convert to signed assign a_mult_b = signed_a * b

注意,signed_a要比a位宽多一位,这一位用来放置符号位0. 也许你会觉得需要显式指定signed_a的最高位,比如{1’b0, a}而不仅仅是直接赋值为a,但其实是不用的。

关于更多更详细的verilog有符号数计算,我上传一份名为“Signed Arithmetic in Verilog 2001 – Opportunities and Hazards” 的文档,请在我的资源中下载。

2.2 VHDL有符号数运算

关于VHDL有符号数的计算,跟VHDL的signed和unsigned两种数据类型息息相关,请移步我的另一篇blogVHDL中数据类型转换与移位(STD_LOGIC_ARITH与NUMERIC_STD) 中查看详解。

参考链接 verilog数值计算-有符号数和无符号数 https://blog.csdn.net/mdpsdhr/article/details/61922126FPGA内部计算小数 http://www.cnblogs.com/woshitianma/archive/2013/05/19/3087258.htmlFPGA浮点小数与定点小数的换算及应用 https://blog.csdn.net/github_33678609/article/details/53465626


【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3