今天学习了1位全加器的设计,然后我脑洞大开,自己模块化搭建了一个4位全加器。
思路:自上而下模块化编程
第一层:2个2位全加器构成1个四位全加器
直接将两个2位全加器例化过来即可。
module add_full_4bit(
input wire [3:0] A,
input wire [3:0] B,
input wire CIN,
output wire [3:0] SUM,
output wire COUT
);
//2位全加器构成4位
wire c_12;
add_full_2bit add_full_2bit_inst1(
.A (A[1:0]),
.B (B[1:0]),
.CIN (CIN),
.SUM (SUM[1:0]),
.COUT (c_12)
);
add_full_2bit add_full_2bit_inst2(
.A (A[3:2]),//4位中的高2位
.B (B[3:2]),
.CIN (c_12),
.SUM (SUM[3:2]),
.COUT (COUT)
);
endmodule
第二层:2个全加器构成1个2位全加器
我们将第三层的思路框图打包成1位全加器:
module add_full_2bit(
input wire [1:0] A,
input wire [1:0] B,
input wire CIN,
output wire [1:0] SUM,
output wire COUT
);
wire c_01;//低位向高位的进位
add_full_1bit add_full_1bit_inst1(
.A (A[0]),
.B (B[0]),
.CIN (CIN),
.SUM (SUM[0]),
.COUT (c_01)
);
add_full_1bit add_full_1bit_inst2(
.A (A[1]),
.B (B[1]),
.CIN (c_01),
.SUM (SUM[1]),
.COUT (COUT)
);
endmodule
第三层:2个半加器构成1个全加器
根据此思路,我们可以这样写:
module add_full_1bit(
input wire A,
input wire B,
input wire CIN,
output wire SUM,
output wire COUT
);
//2个半加器构成1位全加器
wire d1,d2,d3;//设置三个变量
//例化,第一个半加器
add_half add_half_inst1(
.A (A),
.B (B),
.SUM (d1),
.COUT (d2)
);
//例化,第一个半加器
add_half add_half_inst2(
.A (d1),
.B (CIN),
.SUM (SUM),
.COUT (d3)
);
or
or1(COUT,d2,d3);
endmodule
第五层:半加器
半加器电路是指对两个输入数据位相加,输出一个结果位和进位,没有进位输入的加法器电路。 是实现两个一位二进制数的加法运算电路。
半加器是实现两个一位二进制数加法运算的器件。它具有数据输入被加数A、加数B,数据输出S和数(半加和)、进位C0。A和B是相加的两个数,S是半加和数,C是进位数。
根据此结论可以写出半加器电路代码
module add_half(
input wire A,
input wire B,
output wire SUM,
output wire COUT
);
assign SUM=A^B;
assign COUT=A&B;
endmodule
程序编写完成后,模块组合如下
这样我们就完成了4位全加器的设计。
//大三小白第一次投稿,望各方大佬多多指教!!(✪ω✪)