FPGA加法器实现与资源消耗-四位数加法器

这篇具有很好参考价值的文章主要介绍了FPGA加法器实现与资源消耗-四位数加法器。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

测试在实现半加器和全加器的基础上开始实现多位数的加法器

一、顺序加法器

可以按照一位全加器,然后循环实现多位加法器。

1、4位加法器 verilog代码

`timescale 1ns / 1ps
module mul_bit_add(
    input [3:0] A,
    input [3:0] B,
    input Ci1,
    output [3:0] SUM,
    output Ci
    );
    reg carry;
    reg [3:0] SUM_reg;
    always @(*) begin
        SUM_reg[0] = A[0] ^ B[0] ^ Ci1;
        carry = (A[0] & Ci1) | (A[0] & B[0]) | (B[0] & Ci1);
        for(integer i=1; i<=3; i= i+1)  begin
            SUM_reg[i] = A[i] ^ B[i] ^ carry;
            carry = (A[i] & carry) | (A[i] & B[i]) | (B[i] & carry);
        end
    end
    assign SUM = SUM_reg;
    assign Ci = carry;
endmodule

 2、testbench

`timescale 1ns / 1ps
module mul_bit_add_tb(
    );
    reg [3:0] A;
    reg [3:0] B;
    reg  Ci1;
    wire[3:0] SUM;
    wire Ci;
    mul_bit_add mul_bit_add1(
        .A(A),
        .B(B),
        .Ci1(Ci1),
        .SUM(SUM),
        .Ci(Ci)
    );
    initial begin
        A = 4'b0001;
        B = 4'b1000;
        Ci1 = 1;
        #10
        $display("A = %d, B = %d, Ci1 = %d, SUM = %d, Ci = %d",A,B,Ci1,SUM,Ci);
        A = 4'b1111;
        B = 4'b1;
        Ci1 = 0;
        #10
        $display("A = %d, B = %d, Ci1 = %d, SUM = %d, Ci = %d",A,B,Ci1,SUM,Ci);
        A = 4'b1001;
        B = 4'b1111;
        Ci1 = 0;
        #10
        $display("A = %d, B = %d, Ci1 = %d, SUM = %d, Ci = %d",A,B,Ci1,SUM,Ci);
    end
endmodule

3、测试结果:

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

相加正确,功能正确。

4、RTL实现

可能看不太清,但是基本就是按照与、或、异或进行连接,而且是串行实现的。

5、综合结果如图

分析可知,工具使用两个查找表(SUM[0]_INST_0,SUM[1]_INST_0)实现了A[1:0]+B[1:0]+Ci1 =》 sum[1:0]的计算,并用一个查找表(SUM[3]_INST_0_i_1)实现低两位相加产生进位的结果,如图中蓝色线;然后计算高两位相加的结果,用两个查找表(SUM[2]_INST_0,SUM[3]_INST_0)实现,最终输出的进位只需要考虑高位相加的结果,使用一个查找表(Ci_INST_0)实现,总共花费6个查找表。

6、实现:

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

在板卡上也是6个查找表实现

二、并行加法器

超前进位加法器(carry-look-ahead-adder),通过预先计算每一位的进位,减少进位的传递时延,从而更快产生加法结果。

一位加法器真值表

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

1、真值表达式:

公式1

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

令           

公式2 

 

 

其中P(progagate)代表传递进位,G(generate)代表生成进位,生成进位代表输入两位相加是否会产生进位,传递进位代表地位的进位是否会传递到高位。由公式2可知P、G的值只由两个输出相加数的每位决定,可以同时算出。

 

公式3

 ,

 FPGA加法器实现与资源消耗-四位数加法器,fpga开发

其中S很好计算,C的真值表达式如下:

公式4

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

由公式4可知,每位的进位可以不需要知道中间进位结果,直接通过输入进位以及P、G的值便可得到每位的进位,对比原本串行计算减少了进位结果等待的过程,所以被称为超进位。

其中FPGA加法器实现与资源消耗-四位数加法器,fpga开发

根据FPGA加法器实现与资源消耗-四位数加法器,fpga开发,所以

公式5

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

2、4位加法器 verilog代码

`timescale 1ns / 1ps
module adder1(//一位全加器
    input X,
    input Y,
    input Ci1,
    output S,
    output P,
    output G
);
//真值表达公式2
    assign P = X ^ Y;
    assign G = X & Y;
//真值表达公式3
    assign S = X ^ Y ^ Ci1;
endmodule

module CLA_4(//超前进位加法器
    input [3:0] P,
    input [3:0] G,
    input Ci1,
    output [3:0] Cout,
    output Pout,
    output Gout
);
//真值表达公式4
    assign Cout[0] = G[0] | (P[0]&Ci1);
    assign Cout[1] = G[1] | (P[1]&G[0]) | (P[1]&P[0]&Ci1);
    assign Cout[2] = G[2] | (P[2]&G[1]) | (P[2]&P[1]&G[0]) | (P[2]&P[1]&P[0]&Ci1);
    assign Cout[3] = G[3] | (P[3]&G[2]) | (P[3]&P[2]&G[1]) | (P[3]&P[2]&P[1]&G[0]) | (P[3]&P[2]&P[1]&P[0]&Ci1);

//真值表达公式5
    assign Pout = P[3]&P[2]&P[1]&P[0];
    assign Gout = G[3] | (P[3]&G[2]) | (P[3]&P[2]&G[1]) | (P[3]&P[2]&P[1]&G[0]);
endmodule

module CLA_add(
    input [3:0] X,
    input [3:0] Y,
    input Ci1,
    output [3:0] S,
    output Pout,
    output Gout,
    output Cout
);

    wire [3:0] P;
    wire [3:0] G;
    wire [3:0] C;
    adder1 adder1_0(
        .X(X[0]),
        .Y(Y[0]),
        .Ci1(Ci1),
        .S(S[0]),
        .P(P[0]),
        .G(G[0])
    );
    adder1 adder1_1(
        .X(X[1]),
        .Y(Y[1]),
        .Ci1(C[0]),
        .S(S[1]),
        .P(P[1]),
        .G(G[1])
    );
    adder1 adder1_2(
        .X(X[2]),
        .Y(Y[2]),
        .Ci1(C[1]),
        .S(S[2]),
        .P(P[2]),
        .G(G[2])
    );
    adder1 adder1_3(
        .X(X[3]),
        .Y(Y[3]),
        .Ci1(C[2]),
        .S(S[3]),
        .P(P[3]),
        .G(G[3])
    );  
    CLA_4 CLA_4_1(
        .P(P),
        .G(G),
        .Ci1(Ci1),
        .Cout(C),
        .Pout(Pout),
        .Gout(Gout)
    );
    assign Cout = C[3];
endmodule

参考结构夏宇闻《verilog 数字系统设计教程第三版》第十章

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

3、testbench

`timescale 1ns / 1ps
module CLA_add_tb(
    );
    reg [3:0] A;
    reg [3:0] B;
    reg  Ci1;
    wire[3:0] S;
    wire P;
    wire G;
    wire Cout;
    CLA_add CLA_add1(
        .X(A),
        .Y(B),
        .Ci1(Ci1),
        .S(S),
        .Pout(P),
        .Gout(G),
        .Cout(Cout)
    );
    initial begin
        A = 4'b0001;
        B = 4'b1000;
        Ci1 = 1;
        #10
        $display("A = %d, B = %d, Ci1 = %d, S = %d, Cout = %d",A,B,Ci1,S,Cout);
        A = 4'b1111;
        B = 4'b1;
        Ci1 = 0;
        #10
        $display("A = %d, B = %d, Ci1 = %d, S = %d, Cout = %d",A,B,Ci1,S,Cout);
        A = 4'b1001;
        B = 4'b1111;
        Ci1 = 0;
        #10
        $display("A = %d, B = %d, Ci1 = %d, S = %d, Cout = %d",A,B,Ci1,S,Cout);
    end
endmodule

4、测试结果:

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

功能正确

5、RTL实现

整体结构如下,基本与参考结构相同

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

全加器的实现如下:

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

基本按照表达式实现的电路。

超进位结构如下:

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

6、综合:

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

7、实现:

FPGA加法器实现与资源消耗-四位数加法器,fpga开发

消耗了10个LUT。

有很多地方都分析不了,先做个暂存结果吧。文章来源地址https://www.toymoban.com/news/detail-777852.html

到了这里,关于FPGA加法器实现与资源消耗-四位数加法器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • FPGA实验一:层次法设计组合电路(加法器)

    目录 一、实验目的 二、实验要求 三、实验代码 四、实验结果及分析

    2024年02月12日
    浏览(46)
  • 【基于FPGA的芯片设计】4位超前进位加法器

    目录 实验原理 源代码 仿真代码 管脚配置 实验板卡:xc7a100tlc sg324-2L,共20个开关         顶层模块 超前进位模块 全加器模块 注:vivado版本为2018版,板卡为xc7a100tlcsg324-2L

    2024年02月06日
    浏览(47)
  • [FPGA]用Verilog写一个简单三位二进制加法器和减法器

    加法器和减法器是数字电路中的基本组件,它们可以对二进制数进行算术运算。加法器可以将两个或多个二进制数相加,得到一个和和一个进位。减法器可以将两个二进制数相减,得到一个差和一个借位。加法器和减法器可以用来实现更高级的运算,例如乘法、除法、移位等

    2024年02月04日
    浏览(45)
  • 【FPGA & Verilog】4bitBCD码加法器+7段数码管

    顶层文件: module add_bcd( input [9:0]I_1, input [9:0]I_0, input clk, input rst_n, output [7:0]seg, output [7:0]value, output select, output  [3:0]encode_1, output  [3:0]encode_0, output  [3:0]high_bit, output  [3:0]low_bit ); assign value ={high_bit,low_bit}; encoder encoder_inst2( .in(I_1), .out(encode_1) ); encoder encoder_inst1( .in(I_0), .out(e

    2024年01月18日
    浏览(46)
  • 【FPGA】Verilog:模块化组合逻辑电路设计 | 半加器 | 全加器 | 串行加法器 | 子模块 | 主模块

    前言: 本章内容主要是演示Vivado下利用Verilog语言进行电路设计、仿真、综合和下载 示例:加法器   ​ 功能特性: 采用 Xilinx Artix-7 XC7A35T芯片  配置方式:USB-JTAG/SPI Flash 高达100MHz 的内部时钟速度  存储器:2Mbit SRAM   N25Q064A SPI Flash(样图旧款为N25Q032A) 通用IO:Switch :

    2024年02月15日
    浏览(51)
  • 数字IC经典电路(1)——经典加法器的实现(加法器简介及Verilog实现)

    加法器是数字系统最基础的计算单元,用来产生两个数的和,加法器是以二进制作运算。负数可用二的补数来表示,减法器也是加法器,乘法器可以由加法器和移位器实现。加法器和乘法器由于会频繁使用,因此加法器的速度也影响着整个系统的计算速度。对加法器的设计也

    2024年02月14日
    浏览(54)
  • Verilog实现超前进位加法器

    在CPU等对性能要求较高的电路中,一般都会采用超前进位加法器,因为超前进位加法器的延时相对来说比较小。下面讲述超前进位加法器的原理: 我们知道,一个三输入,二输出的全加器,其逻辑关系为 S = A ⊕ B ⊕ C i n S=Aoplus Boplus C_{in} S = A ⊕ B ⊕ C in ​ C o u t = ( A B ) ∣

    2023年04月08日
    浏览(40)
  • 用逻辑门实现四位加法器

    一.无符号数全加器 1.无符号数四位全加器原理: 先来看一位全加器: 加数A 加数B 结果 0 0 0 0 1 1 1 0 1 1 1 0(进位1) 与 异或门 相似,用异或门记录 用与门记录A+B的进位 将进位输入与A+B结果相与再与进位相或得进位输出,将进位输入与加数相加计算结果 四位全加器则将低位

    2024年01月19日
    浏览(41)
  • 用加法器实现补码的加/减运算

    目录 1.原码的加减运算 (1)原码的加/减法运算 (2)溢出判断 (3)符号扩展 2.加法器原理 3.加法器实现补码的加减运算 1.原码的加减运算 (1)原码的加/减法运算 正+正---绝对值做加法,结果为正 负+负---绝对值做加法,结果为负 正+负---绝对值大的减绝对值小的,符号同绝

    2024年01月18日
    浏览(51)
  • 各种加法器的比对分析与Verilog实现(2)

          本文将介绍Kogge-Stone加法器和brent-kung加法器的原理,在下一篇博客中我将用Verilog进行实现。 目录 1. 并行前缀加法器(Parallel-Prefix Adder, PPA)  2. Kogge-Stone加法器原理 3. brent-kung加法器原理        为了减少AND门的深度,PPA对CLA进行了进一步优化。不过PPA和CLA进行的计算

    2024年02月07日
    浏览(55)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包