Verilog 有符号数详解(含代码验证)

目录

sign( )使用

有符号位的二进制表示

有符号数扩位方法

代码验证

$signed( )和$unsigned( ) 函数


sign( )使用

如果想把a、b作为有符号数来运算,那么就得在a、b数据定义的时候用signed修改,或者在计算的时候用$signed()来修饰

在有符号数运算的时候常常需要扩位,比如verilog中的加法和乘法操作前,会先对操作数据扩位成结果相同的位宽,然后进行加法或者乘法处理。假如a和b都为4位数据,c为5位数据,c = a + b,这个运算的时候会先把a和b扩位成5位,然后按照无符号加法进行相加。

有符号位的二进制表示

用-2来举例:

首先求2的补码(计算2二进制的反码后+1)

10(原码)→01(反码)→10(补码)

然后一般我们再在最高位赋1 (代表负数)最后结果就是110

有符号数扩位方法

这里需要特别注意,扩位的时候,把扩充的位数全部当做符号位

如果需要扩位到16bit,需要把前面所有位都作为符号位,全赋1,最后结果是

1111_1111_1111_1110

代码验证

reg signed [15:0]     a;
wire signed [15:0]    b;
 
initial begin
 
a = -2;
 
$display("a = %b", a);
 
a = 3;
	
$display("a = %b", a);
 
end   

 


$signed( )和$unsigned( ) 函数

        在进行有符号数运算的代码设计时,往往需要用到2个系统函数$signed()和$unsigned()。$signed()是把无符号数当做有符号数运算

$unsigned()是把有符号数当做无符号数运算

还是用-2举例,输入无符号位的16'b1111_1111_1111_1110

无符号位 结果是65534,有符号位结果-2

reg [15:0]               data0;
 
initial begin
	
data0 = 16'b1111_1111_1111_1110;	
	
$display("data0 = %0d", data0);	
$display("data0 = %0d", $signed(data0));

end

  

还是用-2举例,输入有符号位的16'b1111_1111_1111_1110

无符号位 结果是65534,有符号位结果-2

reg signed [15:0]   data0;
 
initial begin
	
data0 = 16'b1111_1111_1111_1110;	
	
$display("data0 = %0d", data0);	
$display("data0 = %0d", $unsigned(data0));

end

 

 verilog有符号数使用方法简介_MmikerR的博客-CSDN博客_verilog有符号数

verilog中signed的使用 - 下夕阳 - 博客园 (cnblogs.com)

  • 4
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值