1. 3-bit add
这个是3bit的,不能像1bit那样用行为级描述,需要3个1bit全加器。应该用generate来简化的。
module top_module(
input [2:0] a, b,
input cin,
output [2:0] cout,
output [2:0] sum );
full_adder inst1(
.a(a[0]),
.b(b[0]),
.cin(cin),
.cout(cout[0]),
.sum(sum[0])
);
full_adder inst2(
.a(a[1]),
.b(b[1]),
.cin(cout[0]),
.cout(cout[1]),
.sum(sum[1])
);
full_adder inst3(
.a(a[2]),
.b(b[2]),
.cin(cout[1]),
.cout(cout[2]),
.sum(sum[2])
);
endmodule
module full_adder(
input a, b, cin,
output cout, sum );
assign {cout,sum} = a + b + cin;
endmodule
2. adder
这个题本身没有进位输入,所以直接相加就好了
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
assign sum = x + y;
endmodule
3. signed add
有符号位相加,和直接加起来,溢出判断就是正正得负(001)和负负得正(110)两种
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
4. 100-bit adder
这个不需要用generate,因为cout不是一位一位的出,而只有最终的一个
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
assign {cout,sum} = a + b + cin;
endmodule
5. BCD 4-digital
用两个assign ,就避免i==0的情况。区别于more verilog features最后一题
module top_module(
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire link[4:0];
generate
genvar i;
for(i=0;i<4;i=i+1)begin:loop
bcd_fadd inst(
.a(a[4*i+3:4*i]),
.b(b[4*i+3:4*i]),
.cin(link[i]),
.cout(link[i+1]),
.sum(sum[4*i+3:4*i])
);
end
endgenerate
assign link[0] = cin;
assign cout = link[4];
endmodule



