Advertisement

对verilog中有符号数和无符号数的理解

阅读量:

文章目录

  • 对verilog中有符号数和无符号数的理解

对verilog中有符号数和无符号数的理解


​ verilog中使用signed表示有符号数,比如:

复制代码
    wire signed [7:0] din;
    
    assign din = -8'd1;

在书写上采用DIN编码时会遇到一些特殊规定,在计算机系统中采用二进制补码表示法时必须注意这一点

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

尽管在书写上我们可以将一个信号表示为负数的形式,在电路中并没有真正意义上的负数值存在;这些数值在运算时会被转换为补码形式。

如果我们暂时不考虑signed类型的影响,则可以将reg和wire两类数据统一视为带有符号或无符号的形式进行处理。在此情况下(视为有符号),数值表示为补码;而视为无符号时,则直接采用原始编码(即源码)。举个例子来说:当将其视为无符号时(即原码),二进制数1111等于十进制7;而当视为有符号数时,则为-1

对于两个无符号数,什么时候相加会出现错误(溢出)的情况呢?

复制代码
    reg [7:0] din1;
    reg [7:0] din2;
    wire [7:0] dout;
    wire ov;
    {ov,dout} = din1 + din2;

很明显,如果ov的值为1的话,就说明发生了溢出,即出错了。

对于两个有符号数,什么时候相加会出现错误呢?

复制代码
    reg [7:0] din1;
    reg [7:0] din2;
    wire [7:0] dout;
    wire ov;
    
    assign dout = din1 + din2;
    assign ov = ((~dout[7]) & din1[7] & din2[7]) | (dout[7] & (~din1[7]) & (~din2[7]));

这里将din1和din2都被视为有符号数值(采用补码形式表示),其数值范围限定在-128至+127之间。当两个整数进行加法运算时若出现进位而导致结果为负值或者两个负数值相加反而得到正值则表明计算出现了错误即当标志ov被置位时计算结果即为错误状态

比如1001是-7,1110是-2,1001+1110 = 10111,取后四位的话就是7,明显错了。

1110是-2,1101是-3,1110 + 1101 = 11011,取后四位就是-5,结果就对了。

当然如果加上溢出位的话,那么结果就都是对的了。

全部评论 (0)

还没有任何评论哟~