FPGA 无符号数和有符号数运算的相关问题

发布于 2025-05-12  18 次阅读


无符号数与有符号数相乘

只需要高位补0的同时用signed函数即可,位宽也是正常加,已经仿真验证过
如果不这样做,会自动把s_a也转化成无符号数

reg signed[7:0]s_a=-128;
reg [7:0]u_a=255;
wire signed[15:0]s_b=s_a*$signed({1'b0,u_a});

有符号数取反

有些情况数值不会达到最小值,可以直接取反,不用做判定

//有符号数取反
//如果直接取反,当被取数为最小值-128,得到的结果还是-128,因为溢出了,除非阔一位才能得到+128
wire signed[7:0]s_c=-s_a;
wire signed[7:0]s_d;
assign s_d=(s_a==-(2**7)) ? (2**7-1):-s_a;

整流

整流后的数据位宽可以小一位

wire [6:0]u_e;
assign u_e=(s_a>0) ? s_a : (s_a==-(2**7)) ? (2**7-1):-s_a;

无符号数与有符号数加减

同样,无符号数需要signed并高位补零,如果不signed结果也会错误

//有符号数与无符号数加减
wire signed [8:0]s_g=s_a-$signed({1'b0,s_e});

无符号数与无符号数加减

可以直接转化为有符号数

wire signed [8:0]s_f=u_e-u_a;

无符号数与有符号数移位

注意:“>>>”移位符号也需要声明有符号数,不然也只会逻辑右移

Pasted image 20250423132720

最后更新于 2025-05-12