HDLBits 系列(11)All about Adder

news/2025/1/25 9:13:15/

目录

半加器

全加器

Binary Ripple-Carry Adder

多位加法器

有符号加法溢出

Adder100

Bcdadd4

最后想说的一些话


 

半加器

Create a half adder. A half adder adds two bits (with no carry-in) and produces a sum and carry-out.

module top_module( input a, b,output cout, sum );assign sum = a^b;assign cout = a&b;endmodule

全加器

Create a full adder. A full adder adds three bits (including carry-in) and produces a sum and carry-out.

module top_module( input a, b, cin,output cout, sum );assign sum = a^b^cin;assign cout = a&b + (a&cin)^(b&cin);endmodule

全加器


Binary Ripple-Carry Adder

 

既然您已经知道如何构建一个完整的加法器,那么请制作3个实例来创建一个3位二进制纹波进位加法器。 加法器将两个3位数字和一个进位相加,以产生3位总和并执行。 为了鼓励您实际实例化完全加法器,还请在脉动进位加法器中输出每个完全加法器的进位。 cout [2]是最后一个完整加法器的最终进位,并且是通常看到的进位。

module top_module( input [2:0] a, b,input cin,output [2:0] cout,output [2:0] sum );assign cout[0] = a[0]&b[0] + (a[0]&cin)^(b[0]&cin);assign sum[0] = a[0]^b[0]^cin;genvar i;generate for(i = 1; i <= 2; i = i + 1) begin: adder_assign cout[i] = a[i]&b[i] + (a[i]&cout[i-1])^(b[i]&cout[i-1]);assign sum[i] = a[i]^b[i]^cout[i-1];endendgenerateendmodule

由于原题没有给出全加器的模块名,所以我只能这样例化,在知道模块名的情况下,可以直接替换上述写法。


多位加法器

看下面的这个电路图,实现电路图功能:

既然要实现这个功能,那么这个电路图实现的功能是什么呢?

例化四个半加器?每个半加器得到一个sum?

那你真是想错了,这个电路图简直就是扯个淡,如果仅仅是每个半加器得到一个输出sum,那么最后一个sum[4]是什么鬼?

所以,我们只能认为我们需要实现的功能是两个4bit数据相加,如此便简单了:

module top_module (input [3:0] x,input [3:0] y, output [4:0] sum);assign sum = x + y;endmodule

如果非要问sum[4]是什么?

我们当然可以说是前一位的进位输出,最终我们还可以如下实现上述电路图功能:

module top_module (input [3:0] x,input [3:0] y, output [4:0] sum);wire [3:0] cout;assign cout[0] = x[0]&y[0];assign sum[0] = x[0] ^ y[0];genvar i;generate for(i = 1; i <= 3; i = i + 1)begin: adder_4assign sum[i] = x[i] ^ y[i] ^ cout[i-1];assign cout[i] = x[i]&y[i] + (x[i] & cout[i-1])^(y[i] & cout[i-1]);endendgenerateassign sum[4] = cout[3];endmodule

上面的这个第0位的运算,用了一个半加器,1到3位用于3个全加器,最后sum[4]为第3位全加器的进位输出。


有符号加法溢出

Assume that you have two 8-bit 2's complement numbers, a[7:0] and b[7:0]. These numbers are added to produce s[7:0]. Also compute whether a (signed) overflow has occurred.

Module Declarationmodule top_module (input [7:0] a,input [7:0] b,output [7:0] s,output overflow
); 

如何解决这个问题呢?

输入a和b是二进制补码,如果a和b是正数,则最高位,即符号位是正的,如果二者相加为负,则为溢出:

overflow =  a[7] & b[7] & ~s[7];

如果a和b是负数,则最高位为负,如果二者相加为正,则表示溢出。

overflow =  ~a[7] & ~b[7] & s[7];

这样的话,就可以这样做这个题目了:

module top_module (input [7:0] a,input [7:0] b,output [7:0] s,output overflow
); //assign s = a + b;assign overflow = ( a[7] & b[7] & ~s[7] ) | (~a[7] & ~b[7] & s[7]);// assign s = ...// assign overflow = ...endmodule

Adder100

Create a 100-bit binary adder. The adder adds two 100-bit numbers and a carry-in to produce a 100-bit sum and carry out.

module top_module( input [99:0] a, b,input cin,output cout,output [99:0] sum );assign {cout, sum} = a + b + cin;endmodule

这题没什么好说的。


Bcdadd4

You are provided with a BCD (binary-coded decimal) one-digit adder named bcd_fadd that adds two BCD digits and carry-in, and produces a sum and carry-out.

module bcd_fadd

(

input [3:0] a,

input [3:0] b,

input cin,

output cout,

output [3:0] sum );

Instantiate 4 copies of bcd_fadd to create a 4-digit BCD ripple-carry adder. Your adder should add two 4-digit BCD numbers (packed into 16-bit vectors) and a carry-in to produce a 4-digit sum and carry out.

bcd_fadd已经给了,所以只需要例化四次4次就好了,采用等波纹进位加法器的方式来解决这个问题。

module top_module( input [15:0] a, b,input cin,output cout,output [15:0] sum );wire [3:0] cout_mid;bcd_fadd inst0(.a(a[3:0]),.b(b[3:0]),.cin(cin),.sum(sum[3:0]),.cout(cout_mid[0]));genvar i;generatefor(i = 1; i <= 3; i = i + 1) begin : bcd_fadderbcd_fadd inst(.a({a[4*i+3], a[4*i+2], a[4*i+1], a[4*i+0]}),.b({b[4*i+3], b[4*i+2], b[4*i+1], b[4*i+0]}),.cin(cout_mid[i-1]),.sum({sum[4*i+3], sum[4*i+2], sum[4*i+1], sum[4*i+0]}),.cout(cout_mid[i]));endendgenerateassign cout = cout_mid[3];endmodule

 

4bit BCD码加法器,也只不过是4bit二进制加法器。

可如下实现:

module bcd_fadder4(input [3:0] a,input [3:0] b,input cin,output cout,output [3:0] sum);assign {cout, sum} = a + b + cin;endmodule

最后想说的一些话

在今年的秋招一开始,我就建立了一个微信群,在CSDN发布了一条博文,召集全国各地的同行朋友们共同加入,共同讨论秋招求职笔试,面试经验,目前已经有300多人加入,各位才华横溢,让我大开眼界。

到今天11月份,从西北地区最早结束到其他各地陆续结束,但是我们曾开玩笑说,本群继续召集下一届同行,作为先行者的我们也会对你们给予应有的帮助,欢迎加入,到你们晒工资的时候,会不会再次把我们倒挂呢?拭目以待。

由于人数较多,所以加我的时候务必备注:CSDN+地区或学校+职位(意向职位)+昵称。

对于后来很晚的人,也许你看到这个博客我已经工作了,也许我已经变了,不再是一个热心的博主,因此,可能我没有时间做这些事情了,还请见谅。
 

 

 

 


http://www.ppmy.cn/news/582284.html

相关文章

Parallel Prefix Adder 简介

Parallel Prefix Adder 简介 本次介绍电路设计中的PPA (Parallel Prefix Adder)&#xff0c;该技术可以高效求布尔状态下的2-输入加法&#xff0c;用于安全多方计算中算术分享对布尔分享的转化。接下来首先介绍Full Adder (FA) 和基于 FA 构造的RCFA。进一步介绍PPA的构造。 0…

verilog 超前进位加法器(carry-look-ahead-adder)

目录 1. 数据流建模实现4位加法器 1.1 代码 1.2 资源占用结果 1.3 RTL综合 2. 结构建模&#xff08;门&#xff09;实现4位超前进位加法器 2.1 代码 2.2 资源占用结果 2.3 RTL综合 3. 行为级建模实现4位串行加法器 3.1 代码 3.2 资源占用结果 3.3 RTL综合 总结 与…

AdderNet

AdderNet是由华为、北大和悉尼大学共同提出的一个网络层结构。主要思想是用加法代替卷积层特征计算的乘法&#xff0c;从而实现减少深度网络的计算。 1、卷积计算 在深度卷积神经网络中&#xff0c;设 F ∈ R d d c i n c o u t F\in R^{d\times d\times c_{in}\times c_{o…

XILINX关于Adder/Subtracter加法器减法器 IP核的使用与仿真

平台&#xff1a;vivado21018.3&#xff0c;modelsim 10.6c 芯片&#xff1a;xc7k325tffg900-2 (active) Adder/Subtracter IP可提供LUT和单个DSP48 slice加法/减法实现方案。Adder/Subtracter 模块可实现加法器 (AB)、减法器 (A–B)&#xff0c;以及可通过签名或未签名数据运…

FPGA学习日志——一位全加器full_adder

全加器 全加器能进行被加数、加数和来自低位的进位信号相加&#xff0c;并根据求和结果给出该位的进位信号。 在电路上可以由两个半加器和一个或门构成全加器。 值得注意的是&#xff1a;一位全加器实现完成后&#xff0c;可以根据多个1位全加器的级联实现多位全加器。 实验框…

【Chisel学习】设计n位超前进位加法器生成器(Carry-Lookahead Adder Generator)

Chisel学习——设计n位超前进位加法器生成器&#xff08;Carry-Lookahead Adder Generator) 文章目录 Chisel学习——设计n位超前进位加法器生成器&#xff08;Carry-Lookahead Adder Generator)一&#xff0c;项目简介二&#xff0c;理论基础2.1 Chisel2.1 硬件生成器&#xf…

AdderSR

1. 摘要 该文利用加法器神经网络(AdderNets)研究了单幅图像的超分辨率问题。与卷积神经网络相比&#xff0c;AdderNets利用加法来计算输出特征&#xff0c;从而避免了传统乘法的大量能耗。然而&#xff0c;由于计算范式的不同&#xff0c;很难将addernet在大规模图像分类上的成…

JAVA并发-原子类/加法器(Adder)和累加器(Accumulator)

文章目录 一、原子类基础1. 什么是java原子类&#xff1f;2. demo测试&#xff0c;不使用原子类测试2.1 i是否原子操作&#xff1f;并解释为什么&#xff1f; 3. 原子类使用场景3.1 原子类如何使用 二、加法器(Adder)和累加器(Accumulator)1. java8中为什么要新增LongAdder&…