【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL72、VL73
全加器
描述
① 请用题目提供的半加器实现全加器电路①
半加器的参考代码如下,可在答案中添加并例化此代码。
module add_half(
input A ,
input B ,
output wire S ,
output wire C
);
assign S = A ^ B;
assign C = A & B;
endmodule
输入描述:
input A ,
input B ,
input Ci ,
输出描述:
output wire S ,
output wire Co
解题思路
全加器和半加器的工作原理
内容主要来自博文
半加法和全加法是算数运算电路的基本单元。它们是完成1位二进制相加的一种组合逻辑电路。
半加器
半加即为不考虑低位来的进位信号;下面给出一位半加法器的真值表;
被加数A | 加数B | 和S | 进位C |
0 | 0 | 0 | 0 |
0 | 1 | 1 | 0 |
1 | 0 | 1 | 0 |
1 | 1 | 0 | 1 |
全加器
全加器能进行加数、被加数和低位来的进位信号相加,并根据求和结果给出该位数的进位信号;下面给出一位全加法器的真值表;
被加数A | 加数B | 低位进位 | 和 | 进位 |
0 | 0 | 0 | 0 | 0 |
0 | 0 | 1 | 1 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
- 当多位数相加时,半加器可用于最低位求和,并给出进位数。第二位的相加有两个待加数和,还有一个来自前面低位送来的进位数。这三个数相加,得出本位和数(全加和数)和进位数。
- 半加器和全加器的区别主要是半加器没有接收进位的输入端,全加器有进位输入端,在将两个多位二进制数相加时,除了最低位外,每一位都要考虑来自低位的进位,半加器则不用考虑,只需要考虑两个输入端相加即可。
下面考虑如何将两个半加器构成一个全加器:
- ①将全加器的被加数A和加数B先进入一个半加器HADD1中(即不考虑从低位的进位), 其中和相当于全加器的低位A、B进行加法运算后的结果;
- ②将全加器的低位进位和作为被加数A和加数B再进入另一个半加器HADD2中,得出的和即为最终全加器对应的和,进位记为;
- ③将进位和进位进行异或操作得到最终全加器的进位;
- 上述过程对应的真值表如下所示:
被加数 | 加数 | 和 | 进位 | 进位 | 和 | 进位 | 进位 |
0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 |
0 | 0 | 0 | 0 | 1 | 1 | 0 | 0 |
0 | 1 | 1 | 0 | 0 | 1 | 0 | 0 |
0 | 1 | 1 | 0 | 1 | 0 | 1 | 1 |
1 | 0 | 1 | 0 | 0 | 1 | 0 | 0 |
1 | 0 | 1 | 0 | 1 | 0 | 1 | 1 |
1 | 1 | 0 | 1 | 0 | 0 | 0 | 1 |
1 | 1 | 0 | 1 | 1 | 1 | 1 | 1 |
代码如下:
代码一:
module add_full(
input A ,
input B ,
input Ci ,
outputwire S ,
output wire Co
);
wire S_1, Co_1, Co_2;
add_half HADD1(.A(A), .B(B), .S(S_1), .C(Co_1));
add_half HADD2(.A(S_1), .B(Ci), .S(S), .C(Co_2));
assign Co = Co_1 | Co_2;
endmodule
代码二:
使用基本组合逻辑电路的思路,即写出S和Co的逻辑表达式,如下所示:
`timescale 1ns/1ns
module add_full(
input A ,
input B ,
input Ci ,
outputwire S ,
output wire Co
);
//代码二
assign S = A ^ B ^ Ci;
assign Co = A&B | Ci&(A^B);
endmodule
串行(行波)进位加法器
请用全加器电路①实现串行进位的4位全加器电路;
输入描述:
input [3:0] A ,
input [3:0] B ,
input Ci ,
输出描述:
output wire [3:0] S ,
output wire Co
解题思路
主要参考以下博文:
数电——超前进位加法器 - 一曲挽歌 - 博客园 (cnblogs.com)
代码如下:
module add_4(
input [3:0] A ,
input [3:0] B ,
input Ci ,
outputwire [3:0] S ,
output wire Co
);
wire [3:0] Co_t;
add_full A0 (.A(A[0]), .B(B[0]), .Ci(Ci), .S(S[0]), .Co(Co_t[0]));
add_full A1 (.A(A[1]), .B(B[1]), .Ci(Co_t[0]), .S(S[1]), .Co(Co_t[1]));
add_full A2 (.A(A[2]), .B(B[2]), .Ci(Co_t[1]), .S(S[2]), .Co(Co_t[2]));
add_full A3 (.A(A[3]), .B(B[3]), .Ci(Co_t[2]), .S(S[3]), .Co(Co_t[3]));
assign Co = Co_t[3];
endmodule
原文地址:https://blog.csdn.net/qq_44629558/article/details/142661467
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!