verilog移位、取绝对值

本文探讨了负数在逻辑右移和算数右移后的符号变化,并提供了取绝对值的实现方法。重点在于理解移位操作中符号位的处理以及如何通过编程确保正确计算负数的绝对值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

问题:负数右移之后符号位还是最高位吗?-128右移7位

解答:

(1)逻辑右移(>>)时,不考虑符号位,每右移一位,左边补一个零(设计时可人为标记符号位的位置);

(2)算数右移(>>>)时,考虑符号位,每右移一位,左边补一次符号位。

所以,a = 9’d-128  //1_1000_0000

reg [8:0] b; //设计时,知道b的实际有效位数为2,也可直接reg[1:0]b,此时逻辑右移后符号位也正确

b = a >> 7 结果为3;   //0_0000_0011

b = a >>> 7 结果为-1。  //1_1111_1111

续:之后再取绝对值,方法一致吗?

取绝对值操作:

reg [7:0] d_a;

always@(*)

begin

    if(a[8])  //符号位,无论是>>还是>>>,只要设计者找到正确的符号位作为条件,即可带入该代码得到正确的绝对值;移位之后正确的符号位是b[1]

        d_a = 1+(~a[7:0]);

    else

        d_a = a[7:0];

end

文章仅作为个人思路整理,如有不足欢迎批评指正

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值