【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   

解题思路

全加器和半加器的工作原理

内容主要来自博文

【连载】FPGA Verilog HDL系列实例 —— 半加器与全加器

半加器和全加器的区别

半加法全加法是算数运算电路的基本单元。它们是完成1位二进制相加的一种组合逻辑电路

半加器

半加即为不考虑低位来的进位信号;下面给出一位半加法器的真值表

被加数A加数B和S进位C
0000
0110
1010
1101
全加器

全加器能进行加数、被加数和低位来的进位信号相加,并根据求和结果给出该位数的进位信号;下面给出一位全加法器的真值表

被加数A加数B低位进位C_iS进位C_o
00000
00110
01010
01101
10010
10101
11001
11111
  • 当多位数相加时,半加器可用于最低位求和,并给出进位数。第二位的相加有两个待加数和,还有一个来自前面低位送来的进位数。这三个数相加,得出本位和数(全加和数)和进位数。
  • 半加器和全加器的区别主要是半加器没有接收进位的输入端,全加器有进位输入端,在将两个多位二进制数相加时,除了最低位外,每一位都要考虑来自低位的进位,半加器则不用考虑,只需要考虑两个输入端相加即可。

下面考虑如何两个半加器构成一个全加器

  • ①将全加器的被加数A加数B先进入一个半加器HADD1中(即不考虑从低位的进位C_i), 其中和S_1相当于全加器的低位A、B进行加法运算后的结果;
  • ②将全加器的低位进位C_iS_1作为被加数A和加数B再进入另一个半加器HADD2中,得出的和即为最终全加器对应的S,进位记为Co_2
  • 将进位Co_1和进位Co_2进行异或操作得到最终全加器的进位Co
  • 上述过程对应的真值表如下所示:
被加数A加数BS_1进位Co_1进位C_iS进位Co_2进位Co
00000000
00001100
01100100
01101011
10100100
10101011
11010001
11011111

代码如下:

代码一:
module add_full(
   input                A   ,
   input                B   ,
   input                Ci  , 

   output	wire        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的逻辑表达式,如下所示:

S= \overset{-}{A} \overset{-}{B}C_i + \overset{-}{A}B \overset{-}{C_i} + A \overset{-}{B} \overset{-}{C_i} + ABC_i\\ =C_i( \overset{-}{A} \overset{-}{B} + AB)+ \overset{-}{C_i}( \overset{-}{A}B+A \overset{-}{B})\\ =C_i (\overset{-}{A\oplus B})+C_i(A\oplus B) = A\oplus B\oplus C_i

C_o = \overset{-}{A}BC_i+A \overset{-}{B}C_i+AB \overset{-}{C_i}+ABC_i\\ =C_i( \overset{-}{A}B+A \overset{-}{B})+AB=C_i(A\oplus B)+AB

`timescale 1ns/1ns

module add_full(
   input                A   ,
   input                B   ,
   input                Ci  , 

   output	wire        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)

【Verilog学习日常】—牛客网刷题—Verilog快速入门—VL12-CSDN博客

【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL66-CSDN博客

代码如下:

module add_4(
   input         [3:0]  A   ,
   input         [3:0]  B   ,
   input                Ci  , 

   output	wire [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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值