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

本文详细介绍了Verilog中signed数据类型在处理有符号数时的作用,包括加法和乘法运算,以及如何利用无符号运算构建有符号运算器。重点讲解了补码表示法和扩展位宽的重要性。

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

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

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的绝对值):

    1. 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] ab=a[A_WIDTH1:0]b[B_WI
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皮皮宽

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值