HDLFPGA学习笔记十七:verilog 8位有符号加法器

    科技2022-07-11  92

    一、有符号加法器

    对于同一个加法器来说,其实输入无论是有符号数还是无符号数都是可以的。以我之前写的8位二进制加法器:传送门 为例,第一张图我们选radix是unsigned,表示无符号加法,第二张图我们选radix是signed,表示有符号数,从图中可知结果都是正确的。

    假设二进制数是n位,则对于无符号数来说,表示范围是(0,2 ^ n -1),对于有符号数,表示的范围是(-2 ^ (n-1),2^(n-1) - 1)。

    二、添加溢出标志的8位有符号加法器

    1、RTL代码

    module adder_1bit(a,b,cin,sum,cout); input a,b,cin; output sum,cout; sum sum1(a,b,cin,sum); carry carry1(a,b,cin,cout); endmodule module sum(a,b,cin,sum); input a,b,cin; output sum; assign sum=a+b+cin; endmodule module carry(a,b,cin,cout); input a,b,cin; output cout; wire [1:0] sum; assign sum = a+b+cin; assign cout=sum[1]; endmodule module adder_8bit(a,b,cin,sum,cout,overflow); input[7:0] a,b; input cin; output[7:0] sum; output cout,overflow; wire c1,c2,c3,c4,c5,c6,c7; adder_1bit u1(a[0],b[0],cin,sum[0],c1); adder_1bit u2(a[1],b[1],c1,sum[1],c2); adder_1bit u3(a[2],b[2],c2,sum[2],c3); adder_1bit u4(a[3],b[3],c3,sum[3],c4); adder_1bit u5(a[4],b[4],c4,sum[4],c5); adder_1bit u6(a[5],b[5],c5,sum[5],c6); adder_1bit u7(a[6],b[6],c6,sum[6],c7); adder_1bit u8(a[7],b[7],c7,sum[7],cout); assign overflow = (a[7]&b[7]&~sum[7])|(~a[7]&~b[7]&sum[7]); endmodule

    2、仿真程序

    module tb_adder_8bit(); reg signed[7:0] a,b; reg cin; wire signed[7:0] sum; wire cout,overflow; initial begin #400 $finish; end initial begin a=-1; b=0; cin=0; forever begin #5 a=a-3;b=b+1; end end adder_8bit U1( .a(a), .b(b), .cin(cin), .sum(sum), .cout(cout), .overflow(overflow) ); endmodule

    3、仿真结果 可以看到,当计算结果出现异常,也即超出正常范围的时候,溢出标志被置为了1,测试结果是正确的。

    Processed: 0.008, SQL: 8