FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?

这篇具有很好参考价值的文章主要介绍了FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

前言

在FPGA中计算两个数据相加和C语言中的加法不太一样,在FPGA中是二进制相加,要考虑数据的进位、数据时单比特还是多比特,数据若位宽过大引起的时延该怎么解决,本文就对以上问题进行梳理

另外我想挖个新坑,把HDLBits中的内容整理一下,就从加法器进行入手,等写好了就过来填坑

正文

一、半加器和全加器的区别

1.1 区别

首先区别,什么是半加器,什么是全加器,从下面图中可以看到
半加器:没有来自上一级的进位(cin), {cout,sum} = a + b
全加器:有来自上一级的进位(cin), {cout,sum} = a + b + cin
并且可以使用2个半加器构成一个全加器,即第一个半加器计算 sum = a + b ,第二个半加器计算 cin + sum
FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?

1.2 表达式

全加器:FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?

二、多比特数据怎么相加

2.1 等波纹进位加法器

此处考虑多比特全加器
FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?
由上图可知,多比特全加器,可以将数据从低到高一次使用单比特的全加器求解,他还有一个名字,叫:等波纹进位加法器,这个名字就很形象,全加器一级一级地如同波纹传递着上一级的cin
举例:
FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?
但是此时出现一个新的问题,如果是100bit的数据进行相加,那就需要100个单比特的全加器,这样会导致时延
那如何解决这个问题呢?

2.2 超前进位加法器

为了解决等波纹进位带来的时延,提出一种基于并行处理的思想的超前进位加法器
核心思想:使用并行求解 C o u t C_{out} Cout
牛客刷题 - VL12 4bit超前进位加法器电路

三、用面积换速度

3.1 流水线

最开始接触到流水线是在FFT算法实现中,这里——> FFT算法实现
再挖个坑,写一篇详细介绍流水线的文章
填坑:流水线

通过分析发现,8bit的全加器是一种单向的、并且前面输出的cout要作为后面的cin,因此可以使用流水线来提高工作频率

实现的效果:第一级流水线在每个时钟上升沿到来时,只负责计算数据低4位的全加结果,以及将高4位打一拍;第二级流水线只负责将第一级流水线的结果进行相加和拼接

设计文件

// 用流水线实现8bit加法
module water_add8 (
    input       clk,
    input       rst_n,
    input [7:0] a,
    input [7:0] b,
    input       cin,

    output  [7:0] sum,
    output       cout
);

reg       cout_low4_1;
reg [3:0] sum_low4_4;

reg [3:0] a_high4_4;
reg [3:0] b_high4_4;

reg       cout_reg;
reg [7:0] sum_reg;

// 第一级流水线
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        cout_low4_1 <= 1'd0;
        sum_low4_4 <= 4'd0;
    end
    else 
        {cout_low4_1, sum_low4_4[3:0]} <= a[3:0] + b[3:0] + cin;   
end

always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        a_high4_4 <= 1'd0;
        b_high4_4 <= 4'd0;
    end
    else 
        a_high4_4 <= a[7:4];
        b_high4_4 <= b[7:4];
end

// 第二级流水线
always @(posedge clk or negedge rst_n) begin
    if(!rst_n)begin
        cout_reg <= 1'd0;
        sum_reg <= 8'd0;
    end
    else 
        {cout_reg, sum_reg[7:0]} <= {5'd0+a_high4_4[3:0]+b_high4_4[3:0]+cout_low4_1,sum_low4_4[3:0]};   //{{{1'b0,ina_reg[3:0]}+{1'b0,inb_reg[3:0]}+cout1},sum1[3:0]}
end

assign cout = cout_reg;
assign sum  = sum_reg;
    
endmodule

测试文件

`timescale	1ns/1ns
module tb_add8_2;
reg					clk;
reg					rst_n;
reg					cin;
reg			[7:0]		a;
reg			[7:0]		b;

wire [7:0] sum;
wire cout;
 
initial	begin
			clk=0;
			rst_n=0;
			cin=1;
			a=2;
			b=3;
			#20
			rst_n=1;						
end
 
initial begin
	#30
	data_ina();	
end
initial	begin
	#30;
	data_inb();		
	end
	
always #10 clk	= ~clk;
 
task	data_ina();
		integer i;
		begin
			for(i=0;i<256;i=i+1)
				begin
					@(posedge clk)
					a<=i;					
				end	
		end	
endtask
 
task data_inb();
		integer j;
		begin
		for(j=1;j<254;j=j+1)
			begin
				@(posedge clk)				
				b<=j;
				cin<=b[0];				
			end	
		end	
endtask

water_add8 water_add8_inst(
    .clk(clk),
    .rst_n(rst_n),
    .a(a),
    .b(b),
    .cin(cin),

    .sum(sum),
    .cout(cout)
);
 
endmodule
波形图

FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?

3.2 进位选择加法器

HDLBits-进位选择加法器这里提到过这种思想,刷了题这不就用上了哇哈哈哈
结构:使用3个全加器模块,1个用来求解数据低16位,另外2个分别在cin=0、cin=1的情况下求解出sum,然后通过二选一选择器得到高16位的输出,最后将低16位和高16位的输出拼接即可
FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?文章来源地址https://www.toymoban.com/news/detail-439099.html

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);

wire cout1;
wire [15:0] sum0;
wire [15:0] sum1;
wire [15:0] sum2;
wire [15:0] sum_mux;

always @(*) begin
    case(cout1)
        1'd0: sum_mux = sum1;
        1'd1: sum_mux = sum2;
    default: sum_mux = sum1;
    endcase
end
// 上面的组合逻辑还可以使用条件判断
// assign sum_mux = (cout1)?sum2:sum1;

assign sum = {sum_mux,sum0};

到了这里,关于FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 加法器、半加器、全加器、超前进位加法器

    简单来讲,半加器不考虑低位进位来的 进位值 ,只有两个输入,两个输出。由一个与门和异或门构成. 真值表: 输入 输出 A B C S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 半加器不考虑低位向本位的[进位],因此它不属于[时序逻辑电路],有两个输入端和两个输出。 设加数(输入端)为A、B

    2024年02月02日
    浏览(55)
  • 实验四 QUARTUS开发环境实验 设计半加器、全加器和四位全加器 blueee的学习笔记

    一、实验目的 1、通过实验,能熟悉QUARTUS开发环境,能够掌握QUARTUS的原理图输入法设计电路,掌握使用相关仿真工具进行功能和时序仿真的方法; 2、通过实验,加深对全加器电路的理解,并能使用QUARTUS的原理图输入法完成全加器的设计,并能在QUARTUS中完成相关的仿真验证

    2024年02月05日
    浏览(98)
  • CMOS 半加器和全加器&&数字集成电路&& Cadence Virtuoso

    NOR: NAND: 最重要的反相器: NOR: NAND: 最简单的反相器: 好,现在开始设计半加器 我是默认你是懂半加器原理的 这里先放一个模块间连线: 然后shift+f看细节图: 这里一个小技巧: 如果发生导线交叉,可以换个材料,否则就会短路。 直接看Schematic吧 到这里,应该能生成

    2024年02月13日
    浏览(61)
  • Quartus-II利用两个半加器实现简单全加器

    软件基于 quartusII 13.1 版本,开发板基于Intel DE2-115 。 1.新建并命名工程 2.选择芯片型号 3.新建半加器原理图

    2023年04月08日
    浏览(41)
  • FPGA实现1位全加器和4位全加器

    1、基于Quartus件完成一个1位全加器的设计,分别采用:1)原理图输入 以及 2)Verilog编程 这两种设计方法。 2、在此基础上,用原理图以及Verilog 编程两种方式,完成4位全加器的设计,对比二者生成的 RTL差别;使用modelsim验证逻辑设计的正确性。 num1和num2是加数,cin是低位进

    2024年02月05日
    浏览(40)
  • 一位全加器及四位全加器————FPGA

    环境: 1、Quartus18.0 2、vscode 3、基于Intel DE2-115的开发板 全加器简介: 全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。

    2024年02月03日
    浏览(50)
  • FPGA——1位全加器和4位全加器的实现

    1、半加器 半加器是实现两个一位二进制数加法运算的器件。它具有两个输入端(被加数A和加数B)及输出端Y。 是数据输入被加数A、加数B,数据输出S和数(半加和)、进位C。 A和B是相加的两个数,S是半加和数,C是进位数。 所谓半加就是不考虑进位的加法,它的真值表如下 (见表

    2024年02月04日
    浏览(63)
  • FPGA基础——全加器

    全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。 一位全加器为例 Ain表示被加数,Bin表示加数,Cin表示低位进位,Cou

    2024年02月09日
    浏览(45)
  • 【FPGA】如何理解全加器

    半加器 比较容易理解,它的电路指对两个输入数据位(a、b)相加,输出一个结果位(sum)和进位(cout),但没有计算进位输入的加法器电路。 输出表达式 相比半加器, 全加器 是将低位进位输入也代入计算的加法电路,同样输出一个结果位和进位。1位全加器就是计算带进

    2024年02月05日
    浏览(42)
  • FPGA-1位全加器的实现

    1.半加器的定义 半加器是能够对两个一位的二进制数进行相加得到半加和以及半加进位的组合电路。 2.半加器的真值表 A,B表示二进制数,C表示半加进位,S表示半加和 A B C S 0 0 0 0 0 1 0 1 1 0 0 1 1 1 1 0 3.输出表达式 S = A ˉ B + A B ˉ = A ⊕ B C = A B 1.1位全加器的真值表 Ain表示被加数

    2024年02月03日
    浏览(44)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包