【HDLBits习题 2】Circuit - Combinational Logic(3)Arithmetic Circuits

1. Hadd(Half adder)

module top_module( 
    input a, b,
    output cout, sum
);
	assign sum  = a^b;
    assign cout = a&b;
endmodule

2. Fadd(Full adder)

module top_module( 
    input a, b, cin,
    output cout, sum
);
	assign sum  = a^b^cin;
    assign cout = a&b | a&cin | b&cin;
endmodule

3. Adder3(3-bit binary adder)

(1)方法1:

module top_module (
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum
);
    genvar i;
    
    generate
        for (i=0; i<3; i++) begin: adder
            if (i==0)
                assign {cout[0], sum[0]} = a[0]+b[0]+cin;
            else
                assign {cout[i], sum[i]} = a[i]+b[i]+cout[i-1];
        end
    endgenerate
endmodule

(2)方法2:

module top_module (
    input [2:0] a, b,
    input cin,
    output [2:0] cout,
    output [2:0] sum
);
    assign {cout[0], sum[0]} = a[0]+b[0]+cin;
    assign {cout[1], sum[1]} = a[1]+b[1]+cout[0];
    assign {cout[2], sum[2]} = a[2]+b[2]+cout[1];
endmodule

4. Exams/m2014 q4j(Adder)

(1)方法1:

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum
);
    wire [2:0] c;
    genvar i;
    
    generate
        for (i=0; i<4; i++) begin: adder
            if      (i==0)
                assign {c[0],   sum[0]} = x[0]+y[0];
            else if (i==3)
                assign {sum[4], sum[3]} = x[3]+y[3]+c[2];
            else
                assign {c[i],   sum[i]} = x[i]+y[i]+c[i-1];
        end
    endgenerate
endmodule

(2)方法2:

module top_module (
    input [3:0] x,
    input [3:0] y, 
    output [4:0] sum
);
	assign sum = x+y;
endmodule

5. Exams/ece241 2014 q1c(Signed addition overflow)

module top_module (
    input [7:0] a,
    input [7:0] b,
    output [7:0] s,
    output overflow
);
	assign s = a+b;
    assign overflow = (a[7] & b[7] & ~s[7]) | (~a[7] & ~b[7] & s[7]);
endmodule

6. Adder100(100-bit binary adder)

module top_module( 
    input [99:0] a, b,
    input cin,
    output cout,
    output [99:0] sum
);
    assign {cout, sum} = a+b+cin;
endmodule

7. Bcdadd4(4-digit BCD adder)

(1)方法1:

module top_module ( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum
);
    wire [2:0] c;
	genvar i;
    
    generate
        for (i=0; i<4; i++) begin: bcd
            if 		(i==0)
                bcd_fadd bcd_fadd_inst ( a[3:0], b[3:0], cin, c[0], sum[3:0] );
            else if (i==3)
                bcd_fadd bcd_fadd_inst ( a[15:12], b[15:12], c[2], cout, sum[15:12] );
            else
                bcd_fadd bcd_fadd_inst ( a[4*i+3:4*i], b[4*i+3:4*i], c[i-1], c[i], sum[4*i+3:4*i] );
        end
    endgenerate
endmodule

(2)方法2:

module top_module ( 
    input [15:0] a, b,
    input cin,
    output cout,
    output [15:0] sum
);
    wire [2:0] c;
    
    bcd_fadd bcd_fadd_inst1 ( a[3:0],   b[3:0],   cin,  c[0], sum[3:0] );
    bcd_fadd bcd_fadd_inst2 ( a[7:4],   b[7:4],   c[0], c[1], sum[7:4] );
    bcd_fadd bcd_fadd_inst3 ( a[11:8],  b[11:8],  c[1], c[2], sum[11:8] );
    bcd_fadd bcd_fadd_inst4 ( a[15:12], b[15:12], c[2], cout, sum[15:12] );
endmodule

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值