Circuits>Combinational Logic>Airthmetic Circuits
1.Half adder
功能:
加法器,半加器,不计算进位。
收获:
代码:
module top_module(
input a, b,
output cout, sum );
assign {cout,sum} = a + b;
endmodule
2.Full adder
功能:
全加器,计算进位。
收获:
代码:
module top_module(
input a, b, cin,
output cout, sum );
assign {cout,sum} = a + b + cin;
endmodule
3.3-bit binary adder
功能:
将三个一位全加器组合成一个三位全加器,并将进位信号全部输出出来。
收获:
代码:
module top_module(
input [2:0] a, b,
input cin,
output [2:0] cout,
output [2:0] sum );
wire [1:0]link;
assign cout = {cout[2],link};
full_adder full_adder0(
.a(a[0]),
.b(b[0]),
.cin(cin),
.cout(link[0]),
.sum(sum[0])
);
full_adder full_adder1(
.a(a[1]),
.b(b[1]),
.cin(link[0]),
.cout(link[1]),
.sum(sum[1])
);
full_adder full_adder2(
.a(a[2]),
.b(b[2]),
.cin(link[1]),
.cout(cout[2]),
.sum(sum[2])
);
endmodule
module full_adder(input a,input b,input cin,output cout,output sum);
assign {cout,sum} = a + b + cin;
endmodule
4.Adder
功能:
实现下面的电路。
收获;
代码:
module top_module (
input [3:0] x,
input [3:0] y,
output [4:0] sum);
wire [2:0] link;
full full_inst0(
.a(x[0]),
.b(y[0]),
.cin(1'b0),
.cout(link[0]),
.sum(sum[0])
);
full full_inst1(
.a(x[1]),
.b(y[1]),
.cin(link[0]),
.cout(link[1]),
.sum(sum[1])
);
full full_inst2(
.a(x[2]),
.b(y[2]),
.cin(link[1]),
.cout(link[2]),
.sum(sum[2])
);
full full_inst3(
.a(x[3]),
.b(y[3]),
.cin(link[2]),
.cout(sum[4]),
.sum(sum[3])
);
endmodule
module full(input a,input b,input cin,output cout,output sum);
assign {cout,sum} = a + b + cin;
endmodule
5.Signed addition overflow
功能:
两个八位二进制补码相加,判断溢出和计算结果。
收获:
补码相加,有两种判断溢出方法。第一种是,对于补码相加,一般分为三种情况,分别是正+负,正+正,负+负,对于正+负的情况是不会发生溢出的,所以不用管这种情况,对于正+正的情况,如果符号位变成了1,即数值最高位产生了进位,那么就产生了溢出,即向上溢出。对于负+负的情况,首先其符号位一定是会产生进位的,但是对于数值最高位,如果没有产生进位,反而视为发生溢出,但并不是向上溢出,而是向下溢出,即太小了,所以才没有产生进位。总的来说,就是,对于这种情况,只要是符号位和数值最高位只有一个发生改变,而另外一个没有变化,则认为其发生了溢出。第二种判断方法则是,将其符号位复制一次,放置到数值最前边,即数最高两位都是符号位,若加法计算之后。最高两位变成了01,则发生了正溢出(正数太大了),若最高两位变成了10,则发生了负溢出(负数太小了)。
代码:
module top_module (
input [7:0] a,
input [7:0] b,
output [7:0] s,
output reg overflow
); //
reg [8:0] q;
assign s = a + b;
always@(*)
begin
q = {a[7],a}+{b[7],b};
case(q[8:7])
2'b01,2'b10:overflow = 1'b1;
default: overflow = 1'b0;
endcase
end
// assign s = ...
// assign overflow = ...
endmodule
6.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. 4-digit BCD adder
功能:将四个四位二进制转十进制的模块组合成一个16位二进制转十进制的模块,主要是模块实例化和组合。
收获:
代码:
module top_module(
input [15:0] a, b,
input cin,
output cout,
output [15:0] sum );
wire link[2:0];
bcd_fadd bcd_fadd_inst0(
.a(a[3:0]),
.b(b[3:0]),
.cin(cin),
.cout(link[0]),
.sum(sum[3:0])
);
bcd_fadd bcd_fadd_inst1(
.a(a[7:4]),
.b(b[7:4]),
.cin(link[0]),
.cout(link[1]),
.sum(sum[7:4])
);
bcd_fadd bcd_fadd_inst2(
.a(a[11:8]),
.b(b[11:8]),
.cin(link[1]),
.cout(link[2]),
.sum(sum[11:8])
);
bcd_fadd bcd_fadd_inst3(
.a(a[15:12]),
.b(b[15:12]),
.cin(link[2]),
.cout(cout),
.sum(sum[15:12])
);
endmodule