了解Verilog中‘signed‘的作用:处理有符号数

您所在的位置:网站首页 verilog中2进制数1010可以用以下哪种方式表示 了解Verilog中‘signed‘的作用:处理有符号数

了解Verilog中‘signed‘的作用:处理有符号数

2023-11-28 07:21| 来源: 网络整理| 查看: 265

了解Verilog中’signed’的作用:处理有符号数

在Verilog中,数据类型'signed'扮演着重要的角色。它用于处理有符号数,为设计者提供了更丰富的表达能力和灵活性。本文将深入探讨Verilog中'signed'在乘法和加法运算中的作用及其用法,并使用无符号器件,搭建一个有符号的乘法器和加法器。

目录标题 了解Verilog中'signed'的作用:处理有符号数1. 了解有符号数:2. signed类型在加法中的作用3. 用无符号加法器搭建有符号加法器4. signed类型在乘法中的作用5. 用无符号运算器件,搭建signed有符号数的乘法器6. signed使用中的其他注意事项7. 结论:

1. 了解有符号数:

🍓在计算机中,有符号数和无符号数是两种常见的数据表示形式。有符号数可表示正数、负数和零,而无符号数仅用于表示非负数和零。在数字电路设计中,有时需要处理有符号数。

🍓有符号数采用补码的形式表示,其中最高位为符号位,补码的表示方式如下:

对于正数,补码与其原码相同。对于负数,首先取其绝对值的二进制原码,然后将所有位取反(0变为1,1变为0),最后再加1。

例如,假设使用8位二进制来表示整数,我们来看一个负数-5的补码表示:

首先,将5的绝对值转换成二进制原码:00000101。然后,将所有位取反得到补码:11111010。最后,加1得到最终的补码表示:11111011。

🍓由上述可知,负数的补码为原码按位取反,再加1,因此 对于同一个负数,用同样的位宽来表示绝对值的原码和补码,则绝对值的二进制原码 + 最终的补码的结果为0,最高位为1;

例如, 一个负数的绝对值为8bit,补码也为8bit,相加后的结果为9bit,9`b1_0000_0000,

下面举个实例: -5的绝对值原码为00000101; 补码为11111011; 0000 _ 0101 + 1111 _ 1011 = 1 _ 0000 _ 0000 0000\_0101 + 1111\_1011 = 1\_0000\_0000 0000_0101+1111_1011=1_0000_0000

2. signed类型在加法中的作用

🍎设有一个位宽为A_WIDTH的变量a,设有一个位宽为B_WIDTH的变量b,若a,b均为有符号数,由补码的计算过程可知,8bit的负数补码,加上其绝对值原码,对应的运算结果的低8bit为0;

🍎因此可以有以下推论:

取A_WIDTH和B_WTDH的最大值C_WIDTH = max(A_WIDTH, B_WIDTH)a + b的运算结果最大不会超过C_WIDTH + 1则有符号数a + 有符号数b, 等于将a,b扩展符号位到C_WIDTH + 1,之后相加,只保留运算结果的低 C_WIDTH + 1位,即为有符号数a和b的和;

🍎也就是说signed在加法中的作用是,将a,b扩展符号位(至少扩展1位)到相同位宽后,再进行加法运算;

3. 用无符号加法器搭建有符号加法器

🍁基于第2节的分析,我们可以有以下有符号数的加法器代码:

module signed_add(a, b, sum_out); parameter A_WIDTH = 3; parameter B_WIDTH = 4; parameter C_WIDTH = A_WIDTH > B_WIDTH ? A_WIDTH + 1 : B_WIDTH + 1; input [A_WIDTH - 1 : 0] a; input [A_WIDTH - 1 : 0] b; output [C_WIDTH - 1 : 0] sum_out; assign sum_out = {{(C_WIDTH - A_WIDTH){a[A_WIDTH - 1]}}, a} + {{(C_WIDTH - B_WIDTH){b[B_WIDTH - 1]}}, b}; endmodule

🍁运算结果与sum = $signed(a) + $signed(b)相同;

4. signed类型在乘法中的作用

🍏设有一个位宽为A_WIDTH的变量a,设有一个位宽为B_WIDTH的变量b,若a,b均为有符号数;则a x b可以被拆分为 a的绝对值 x b的绝对值,若a,b同符号,则绝对值的乘积等于a x b, 否则结果为负数, 需要将其转换为补码形式

🍏有以下4种情况(a_abs为a的绝对值,b_abs为b的绝对值):

a, b均为正数,则 a ∗ b = a [ A _ W I D T H − 1 : 0 ] ∗ b [ B _ W I D T H − 1 : 0 ] a * b = a[A\_WIDTH - 1 : 0] * b[B\_WIDTH - 1 : 0] a∗b=a[A_WIDTH−1:0]∗b[B_WIDTH−1:0]; a为正数,b为负数, 则a的绝对值a_abs = a[A_WIDTH - 1 : 0]; b的绝对值为~b[B_WIDTH - 1 : 0] + 1,也就是1


【本文地址】


今日新闻


推荐新闻


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