FPGA verilog 有符号数和无符号数运算的位扩展-FPGA常见问题社区-FPGA CPLD-ChipDebug

FPGA verilog 有符号数和无符号数运算的位扩展

总述:

  1. 当所有操作数和结果数据位宽一样时,有符号数和无符号数所产生的运算电路是一样的。
  2. 当所有操作数和结果数据位宽不一样时,无符号数进行0扩展,而有符号数进行符号扩展。
    注:在verilog中支持无符号数和有符号数混合使用,当表达式右侧所有数均为符号数时,才进行符号位扩展,否则全部0扩展。

具体实现:

法一:

      reg[7:0]a,b;
      reg[3:0]c;
      reg[7:0]sum1,sum2,sum3,sum4;
      ……
      sum1 = a + b;      //当位宽一样时,无符号和有符号产生的电路是一样的。
      sum2 = a + c;  //当位宽不一样时reg类型被看成无符号数,进行0扩展。
      sum3 = a + {4’b0,c};  // 此处手动补0。
      sum4 = a + {4{c[3]},c}; //此处手动补符号位。

法二:

      reg signed [7:0]a,b;
      reg signed [3:0]c;
      reg[3:0] d;
      regsigend [7:0]sum1,sum2,sum3;
      ……
      sum1 = a + b;  // 同法一。
      sum2 = a + c; //因为右侧所有数都为有符号数,所以c自动进行符号位扩展。
      sum3 = a + c + d; // 因为右侧不是所有数都为有符号数,所以都进行0扩展。

法三(避免使用此方法):

      verilog中有两个系统函数$signed()和$unsigned(),将括号内的表达式分别转换成signed 和 unsigned数据类型。
      eg:sum = a + c + $signed(c); //此时右侧均为有符号数。
请登录后发表评论

    没有回复内容