【Verilog学习日常】—牛客网刷题—Verilog企业真题—VL72、VL73

全加器

描述

① 请用题目提供的半加器实现全加器电路①

半加器的参考代码如下,可在答案中添加并例化此代码。

cpp 复制代码
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 |
| 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 |

代码如下:

代码一:
cpp 复制代码
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的逻辑表达式,如下所示:

cpp 复制代码
`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博客

代码如下:

cpp 复制代码
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
相关推荐
西岸行者2 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
ZPC82102 天前
docker 镜像备份
人工智能·算法·fpga开发·机器人
ZPC82102 天前
docker 使用GUI ROS2
人工智能·算法·fpga开发·机器人
悠哉悠哉愿意2 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码2 天前
嵌入式学习路线
学习
毛小茛2 天前
计算机系统概论——校验码
学习
babe小鑫2 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms2 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下2 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。2 天前
2026.2.25监控学习
学习