参考链接:HDLBits导学
Problem 65 : Half adder (Hadd)
问题:本题中需要实现一个 2 进制 1bit 加法器,加法器将输入的两个 1bit 数相加,产生两数相加之和以及进位
思路:参考全加器的写法
解决:
module top_module(
input a, b,
output cout, sum );
assign sum = a ^ b;
assign cout = a & b;
//参考大佬写法
assign {cout,sum} = a + b;
endmodule
Problem 66 : Full adder (Fadd)
问题:本题中需要实现一个 2 进制 1bit 全加器,全加器与上一题中的加法器的区别在于,除了将输入的两个 1bit 数相加之外,还累加来自前级的进位,产生相加之和以及进位
解决:
module top_module(
input a, b, cin,
output cout, sum );
assign sum = a ^ b ^ cin;
assign cout = (a&b) | (b&cin) |(a&cin);
//参考大佬写法
assign{cout,sum} = a + b + cin;
endmodule
Problem 67 : 3-bit binary adder(Adder3 )
问题:在上一题中,我们实现了一个全加器,本题中需要通过实例化 3 个全加器,并将它们级联起来实现一个位宽为 3 bit 的二进制加法器,加法器将输入的两个 3bit 数相加,产生相加之和以及进位
解决:
module top_module(
input [2:0] a, b,
input cin,
output [2:0] cout,
output [2:0] sum );
full_add full_add_inst1(
.a(a[0]),
.b(b[0]),
.cin(cin),
.cout(cout[0]),
.sum(sum[0])
);
full_add full_add_inst2(
.a(a[1]),
.b(b[1]),
.cin(cout[0]),
.cout(cout[1]),
.sum(sum[1])
);
full_add full_add_inst3(
.a(a[2]),
.b(b[2]),
.cin(cout[1]),
.cout(cout[2]),
.sum(sum[2])
);
endmodule
module full_add(
input a, b, cin,
output cout, sum
);
assign sum = a ^ b ^ cin;
assign cout = (a&b) | (b&cin) |(a&cin);
endmodule
简单写法:
assign {cout,sum} = a + b + cin
Problem 68 : Adder
问题:实现下图中的电路
解决:
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
wire [2:0] cout;
full_add full_add_inst1(
.a(x[0]),
.b(y[0]),
.cout(cout[0]),
.sum(sum[0])
);
full_add full_add_inst2(
.a(x[1]),
.b(y[1]),
.cin(cout[0]),
.cout(cout[1]),
.sum(sum[1])
);
full_add full_add_inst3(
.a(x[2]),
.b(y[2]),
.cin(cout[1]),
.cout(cout[2]),
.sum(sum[2])
);
full_add full_add_inst4(
.a(x[3]),
.b(y[3]),
.cin(cout[2]),
.cout(sum[4]),
.sum(sum[3])
);
endmodule
module full_add(
input a, b, cin,
output cout, sum
);
assign sum = a ^ b ^ cin;
assign cout = (a&b) | (b&cin) |(a&cin);
endmodule
简单写法:
assign sum = x+y;
Problem 69 : Signed addition overflow
问题:本题讨论的是有符号数相加的溢出问题中,需要实现一个 2 进制 8bit 有符号数加法器,加法器将输入的两个 8bit数补码相加,产生相加之和以及进位
思路:什么时候会溢出:正数和正数相加,正数高位为0,溢出后和的高位为1
~a[7] && ~b[7] && s[7]
负数和负数相加,负数高位为1,溢出后和的高位为0
a[7] && b[7] && ~s[7]
解决:
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output overflow
); //
// assign s = ...
// assign overflow = ...
assign s = a + b;
assign overflow = ( a[7] && b[7] && ~s[7] ) || (~a[7] && ~b[7] && s[7]);
endmodule
Problem 70 100-bit binary adder
问题:题目要求我们创建一个100bit的二进制的加法器,该电路共包含两个100bit的输入和一个cin, 输出产生sum和cout
期望使用一条语句
解决:
module top_module(
input [99:0] a, b,
input cin,
output cout,
output [99:0] sum );
assign {cout,sum} = a + b + cin;
endmodule
Problem 71 4-digit BCD adder
问题:在本题中,题目给我们提供了一个BCD加法器名字为bcd_fadd, 输入为两个4bitBCD码,一个cin,产生输出为sum和cout
module bcd_fadd {
input [3:0] a,
input [3:0] b,
input cin,
output cout,
output [3:0] sum
);
解决:
module top_module(
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire [2:0] cout_t;
bcd_fadd bcd_add_inst1(
.a(a[3:0]),
.b(b[3:0]),
.cin(cin),
.cout(cout_t[0]),
.sum(sum[3:0])
);
bcd_fadd bcd_add_inst2(
.a(a[7:4]),
.b(b[7:4]),
.cin(cout_t[0]),
.cout(cout_t[1]),
.sum(sum[7:4])
);
bcd_fadd bcd_add_inst3(
.a(a[11:8]),
.b(b[11:8]),
.cin(cout_t[1]),
.cout(cout_t[2]),
.sum(sum[11:8])
);
bcd_fadd bcd_add_inst4(
.a(a[15:12]),
.b(b[15:12]),
.cin(cout_t[2]),
.cout(cout),
.sum(sum[15:12])
);
endmodule