verilog中,逻辑右移>>、算数右移>>>、以及无符号右移、有符号右移,仿真对比图(右移结果还跟被赋值的位数有关)

(好多资料都是说>>>是逻辑右移,>>是算数右移,但我的仿真结果却不是这样,,,有不对的地方还请大佬指出)

1、无符号逻辑右移>>,右移1位,等价于除以2



2、有符号逻辑右移>>



仿真结果跟之前的无区别,但是,我把被赋值位数改变,就会有区别了(不知道为什么)

3、将2中的c、d变成6bit



看到不同了吧。此时b=10000,带符号右移移位,变成11000,即24,也就是-8,为何跟d的位数有关,就不太懂了。。。

4、再来看一下,我认为的算数右移>>>



与逻辑右移>>结果一样,之后,我又改变一下c、d的bit,结果也是一样。

5、带符号的算数右移和逻辑右移



看到了吧,cd与ab的bit是一样的,此时当b=10000时,d就为11000了。接下来,再看cd为6bit的情况

6、在5的基础上,把cd改成6bit



此时应该非常清楚了吧,b=10000时,d=11100。

我再换成signed Decimal显示,就一目了然了


总结如下:

1、如果对无符号数据进行移位,算数右移>>>和逻辑右移>>右移效果是等同的,就是把二进制数据向右移位,最高位补零;

2、如果想对有符号数据右移时(我觉着大部分人对有符号数据右移都是想进行除法运算吧),就直接使用>>>操作符。

(如有不对,还望指出)


补充:刚才试了一下,



我明白为何逻辑右移的结果与被赋值的位数有关了。。。运算过程是这样的,逻辑右移>>,第一步是把-16(10000)扩展成与被赋值位数相同的位数(用6位举例),因为a是带符号数据,所以扩展成110000,这时逻辑右移1位,即011000,即24。

算数右移不受位数影响,即相当于除法运算。

### Verilog有符号数的左移和右移操作 在 Verilog 中处理有符号数(signed numbers)时,可以使用特定的操作符来执行算术位移。对于有符号数来说,重要的是保持符号扩展以确保数值表示正确。 #### 左移运算 当对有符号数进行逻辑左移 (`<<`) 或者算术左移时,实际上两者效果相同,因为都是向高位填充零。下面是一个例子: ```verilog reg signed [7:0] a = 8'b1000_0001; // -127 的二进制补码形式 wire signed [9:0] result; assign result = a << 2; // 结果为 8'b1000000100 (-508) ``` 这里 `a` 是一个带符号寄存器变量,在对其进行左移两位之后得到的结果同样保留了原始数据的符号属性[^1]。 #### 右移运算 对于有符号数而言,应该采用算术右移(`&gt;&gt;&gt;`)而不是简单的逻辑右移(`&gt;&gt;`)。算术右移会复制最高有效位(MSB),即符号位到新产生的空缺位置上,从而维持原值的正负性质不变;而逻辑右移则会在左侧填入零,这可能会改变原有数值的实际意义。 ```verilog reg signed [7:0] b = 8'b1000_0001; // -127 的二进制补码形式 wire signed [7:0] arith_shift_right_result; assign arith_shift_right_result = b &gt;&gt;&gt; 1; // 算术右移一位后的结果应接近于除以2(-64) // 对比之下,如果使用逻辑右移将会丢失符号信息 wire logic_shift_right_result; assign logic_shift_right_result = b &gt;&gt; 1; // 这里会产生不正确的正值 ``` 需要注意的是,并不是所有的仿真工具都支持三字符长度的算术右移运算符 `&gt;&gt;&gt;` ,因此有时可能需要用其他方法实现相同的计算功能,比如通过条件语句手动控制MSB的行为[^3]。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值