VerilogHDL中的带符号加减运算
(2018-07-25 14:44:39)
标签:
verilog有符号数运算绝对值 |
分类: VerilogHDL |
有符号数加减运算关键就是扩展符号位,若为负数高位补1,正数高位补0
reg [4:0] a;
reg [5:0] b;
reg [6:0] c;
wire [8:0] a_b_c;
assign a_b_c =
{a[4],a[4],a[4],a[4],a} + {b[5],b[5],b[5],b} +
{c[6],c[6],c};
1、无符号数进行加减法运算
reg [7:0] add_a;
reg
[6:0] add_b;
wire
[8:0] minus_ab;
wire
[8:0] add_ab;
add_a 和add_b 为无符号数,add_a - add_b时,应该扩展符号位进行,再进行减法。
assign minus_ab = {1'b0,add_a} - {2'b0,add_b};
加法运算相对简单,和总为无符号数,assign add_ab = add_a + add_b;
2、求一个数的绝对值
wire [8:0] minus_ab;
wire [8:0] abs_minus_ab;
以minus_ab为例, assign abs_minus_ab = minus_ab[8] ?
(~minus_ab[7:0] + 8'd1) : minus_ab
若负数的符号位为1,绝对值为取反加1(除符号位),因为在负数是以补码的形式表示的。
以-5为例,Verilog中二进制表示为1011, 011取反再加1,即为101=5,为-5的绝对值。