verilog中有符号数和无符号数的相关运算

目录

1.有符号数和有符号数的加减运算(输入和输出为原码)

2.无符号数和有符号数的加减运算(输入和输出为原码)

3.有符号数和有符号数的乘法(输入和输出为原码)


1.有符号数和有符号数的加减运算(输入和输出为原码)

step1:将数据转换为补码。

step2:确定输出结果的位宽。
(结果的位宽是在最大的一个数据的位宽基础上加一位。如6bit与3bit进行加减,则结果为7bit。)

step3:扩展符号位到输出结果的位宽,然后直接进行运算。

step4:处理输出结果。(因为得到的结果是补码,需要转化为原码后再输出。转换方法:判断符号位,如果符号位为0,表明是一个正数,则直接输出(正数原码和补码相等)。如果符号位是1,表明是一个负数,需要符号位不变,有效位取反加一后再输出(补码变原码)。)

例1:(-3) -(-6)
分析:-3用有符号数表示,原码为3bit的111。-6用有符号数表示,原码为4bit的1110。

step1:将每一个数都转换成补码。-3的补码为101,-6的补码为1010

step2:确定输出结果的位宽。最大的一个数据的位宽是4bit,则输出结果的位宽为5bit的有符号数。

step3:扩展符号位到输出结果的位宽,然后直接进行运算。
输出结果out=1_1101-1_1010=0_0011(注意结果要取5bit)

step4:符号位out[5] = 0,表明为正数数,则直接输出,out=0_0011(+3)

例2:(-3) - (+6)
分析:-3用有符号数表示,原码为3bit的111。+6用有符号数表示,原码为4bit的0110。

step1:转换成补码。-3的补码为101,+6的补码为0110。(正数的补码与原码相同)

step2:确定输出结果的位宽。最大的一个数据的位宽是4bit,则输出结果的位宽为5bit的有符号数。

step3:扩展符号位到输出结果的位宽,然后直接进行运算。
输出结果out=1_1101-0_0110=1_0111(注意结果要取5bit)

step4:符号位out[5] = 1,表明为负数,则符号位不变,有效为取反加一后输出,out=1_1001(-9)

2.无符号数和有符号数的加减运算(输入和输出为原码)

step1:将无符号数转换为有符号数。

step2:将数据转换为补码。

step3:确定输出结果的位宽。
(结果的位宽是在最大的一个数据的位宽基础上加一位。如6bit与3bit进行加减,则结果为7bit。)

step4:扩展符号位到输出结果的位宽,然后直接进行运算。

step5:处理输出结果。(因为得到的结果是补码,需要转化为原码后再输出。转换方法:判断符号位,如果符号位为0,表明是一个正数,则直接输出(正数原码和补码相等)。如果符号位是1,表明是一个负数,需要符号位不变,有效位取反加一后再输出(补码变原码)。)

例3: (3) + (-6)

分析:3用无符号数表示,原码为2bit的11。-6用有符号数表示,原码为4bit的1110。
step1:将无符号数转换为有符号数。2bit的无符号数11,为有符号数3bit的011

step2:转换成补码。3的补码为011,-6的补码为1010。(正数的补码与原码相同)

step3:确定输出结果的位宽。最大的一个数据的位宽是4bit,则输出结果的位宽为5bit的有符号数。

sep4:扩展符号位到输出结果的位宽,然后直接进行运算。
输出结果out=0_0011+1_1010=1_1101(注意结果要取5bit)

step5:符号位out[5] = 1,表明为负数,则符号位不变,有效为取反加一后输出,out=1_0011(-3)

总结:无符号数和有符号数的计算可转变为有符号数和有符号数的计算。

3.有符号数和有符号数的乘法(输入和输出为原码)

step1:确定输出结果位宽。(一个符号位+两个数据有效为的位宽之和,如1个4bit的有符号数A,和1个5bit的有符号数B相乘,A的有效位是3bit,B的有效位为4bit,则输出结果的有效位宽为7bit,总位宽为8bit)。

step2:计算输出结果的符号位。(两个数据的符号位进行异或,判断是正数还是负数)。

step3:计算输出结果的有效位。(直接将两个数据相乘,得到的结果就是输出结果的有效位)。

step4:将符号位和有效位拼接后输出。

例4:(-3)*(-6)

分析:-3用有符号数表示,原码为3bit的111。-6用有符号数表示,原码为4bit的1110。

step1:确定输出结果位宽。(-3的有效位是2bit,-6的有效位为3bit,则输出结果的有效位宽为5bit,总位宽为6bit)。

step2:计算输出结果的符号位。两个数据的符号位都是1,则1^1=0,则输出结果是正数。

step3:计算输出结果的有效位。2'b11 * 3'b110 = 5'b1_0010。

step4:将符号位和有效位拼接后输出。out=6'b01_0010(+18)

ps:如果输入是补码,则运算之前先转换为原码,在按照以上步骤即可。

  • 18
    点赞
  • 114
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值