[Verilog] 加法器(半加法器 | 全加法器 | 串行加法器 | 并行加法器 | 十进制加法器)详解

前言
在数字电路中,加法器是一种常见的逻辑电路,用于将两个数字相加。本文将介绍如何使用Verilog实现各种加法器。

1 加法器种类

整数加法器

  • 半加器(Half Adder):它是最简单的加法器,只能进行两个输入位的相加操作,不包括进位位。
  • 全加器(Full Adder):它是最基本的加法器,可以对两个输入位和进位位进行相加,并产生一个输出位和进位输出。
  • 多位加法器(Bit Adder):它是全加器的扩展,可以对多位输入进行相加操作,并产生多位输出和进位输出。
    串行加法器(Serial Adder):它是通过按位逐个相加的方式实现加法功能,适用于串行输入和输出的情况。
    并行加法器(Parallel Adder):它是通过同时对多个位进行相加的方式实现加法功能,适用于并行输入和输出的情况。

浮点加法器

  • 浮点加法器(Floating Point Adder):它是用于对浮点数进行加法操作的加法器,通常使用IEEE 754标准的浮点数表示。
  • 累加器(Accumulator):它是一种特殊的加法器,可以对输入信号进行累加,输出结果为累加的和。

2 半加法器

半加法器的功能是将两个输入位相加,并输出两个结果:一个是和位,即两个输入位相加的结果;另一个是进位位,表示相加操作是否产生了进位。在Verilog中,可以使用逻辑运算符和位选择器来实现半加法器。
在这里插入图片描述
根据真值表,可以快速的得到输入输出关系(逻辑结构)是:

  • cout = a^b(表示a异或b)
  • sum = a&b(表示a与b)
    在这里插入图片描述
    // 半加器模块定义
module half_adder(
  input a, // 输入a
  input b, // 输入b
  output sum, // 输出和
  output carry // 输出进位
);
  assign sum = a ^ b; // 异或操作得到和
  assign carry = a & b; // 与操作得到进位
endmodule

// 测试模块

module test;
  reg a, b; // 输入寄存器
  wire sum, carry; // 输出线

  // 实例化半加器模块
  half_adder ha(
    .a(a),
    .b(b),
    .sum(sum),
    .carry(carry)
  );

  // 测试数据
  initial begin
    a = 0; b = 0; // 输入为0
	#10;
    a = 0; b = 1; // 输入为1
	#10;
    a = 1; b = 0; // 输入为1
	#10;
    a = 1; b = 1; // 输入为0
	#10;
    $finish; // 结束仿真
  end

  // 显示结果
  always @(sum, carry)
    $display("a = %b, b = %b, sum = %b, carry = %b", a, b, sum, carry);

initial begin            
	$dumpfile("wave.vcd"); // 指定用作dumpfile的文件
	$dumpvars; // dump all vars
end
endmodule

开始执行了, 好激动,只要执行bat 一键批处理。
在这里插入图片描述
从打印的 log 看结果完全符合, 看看仿真波形是什么样子
在这里插入图片描述
仿真波形对应四个测试用例,妥妥的。这里用的是 gtkwave 查看波形, 非常方便

关于真值表
真值表(truth table)列出电路中每个输入组合的输出结果。有助于了解和验证电路的行为,并验证设计的正确性。真值表通常用于验证小规模和简单的电路。对于较大的电路,其他建模和仿真技术(如行为级建模、模块化测试等)可能更适合。
代码设计的时候,并不要求用真值表。

关于门电路
在使用Verilog编写代码时,可以按照门电路的思路进行设计,但并不一定要完全按照门电路的方式编写。

3. 1 位全加法器

全加法器与半加法器类似,但它还需要考虑来自前一位的进位。为了实现全加法器,我们需要使用两个半加法器和一个或门。

3.1 用两个半加器来组成一个全加器

设计

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

   output	wire        S   ,
   output   wire        Co   
);

	wire c_1;
	wire c_2;
	wire sum_1;
	
	add_half add_half_1(
	   .A   (A),
	   .B   (B),
	         
	   .S   (sum_1),
	   .C   (c_1)  
	);
	a
  • 27
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值