精华内容
下载资源
问答
  • 四位加法器

    2013-03-19 20:48:05
    这是vhdl四位加法器的源码,计算机组成
  • Verilog——四位加法器74HC283设计思路实现过程一位全加器原理代码实现设计模块测试模块仿真结果四位全加器74HC283原理 设计思路 先设计出一位全加器,再根据分层次分模块设计出四位加法器。原理图如下: 实现过程 ...

    一. 串行四位加法器

    设计思路

    先设计出一位全加器,在根据分层次分模块设计出四位加法器。

    1. 一位全加器

    1.1原理

    根据全加器真值表进行行为级建模。 真值表如下图所示:
    在这里插入图片描述

    1.2代码实现

    1.2.1设计模块

    module full_adder(
    input A,B,Ci,
    output reg S,Co);
    /*参数说明:
    输入:
    A,B为一位二进制被加数,Ci为来自低位的进位
    输出:
    S为和,Co为进位
    */
    always@(*)
    begin
        case({A,B,Ci})
    	3'b000:begin S=0;Co=0; end
    	3'b001:begin S=1;Co=0; end
    	3'b010:begin S=1;Co=0; end
    	3'b011:begin S=0;Co=1; end
    	3'b100:begin S=1;Co=0; end
    	3'b101:begin S=0;Co=1; end
    	3'b110:begin S=0;Co=1; end
    	3'b111:begin S=1;Co=1; end
        endcase
    end
    endmodule
    

    1.2.2测试模块

    //filename:tb_fulladder.v
    `timescale 10ns/1ns
    module tb_fulladder();
    reg A,B,Ci;
    wire S,Co;
    
    full_adder U(A,B,Ci,S,Co);
    
    initial
    	$monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co);
    initial
    begin
    	A=0;B=0;Ci=0;
    	#5;
    	A=1;B=0;Ci=1;
    	#5;
    	A=1;B=1;Ci=0;
    	#5;
    	$stop;
    end
    endmodule
    

    1.3 仿真结果

    在这里插入图片描述
    在这里插入图片描述

    2.用四个一位全加器串行成四位加法器

    2.1原理

    串行进位加法器。采用四个全加器构成四位数加法器。其原理图如图所示,将低位的进位输出信号接到高位的进位输出端。
    在这里插入图片描述

    2.2代码

    2.2.1设计模块

    module full_adder(
    input A,B,Ci,
    output reg S,Co);
    /*参数说明:
    输入:
    A,B为一位二进制被加数,Ci为来自低位的进位
    输出:
    S为和,Co为进位
    */
    always@(*)
    begin
        case({A,B,Ci})
    	3'b000:begin S=0;Co=0; end
    	3'b001:begin S=1;Co=0; end
    	3'b010:begin S=1;Co=0; end
    	3'b011:begin S=0;Co=1; end
    	3'b100:begin S=1;Co=0; end
    	3'b101:begin S=0;Co=1; end
    	3'b110:begin S=0;Co=1; end
    	3'b111:begin S=1;Co=1; end
        endcase
    end
    endmodule
    
    module _4adder(
    input [3:0] A,B,
    input Ci,
    output [3:0] S,
    output Co);
    /*参数说明:
    输入:
    A,B为四位二进制被加数,Ci为来自低位的进位
    输出:
    S为和,Co为进位
    */
    
    wire C0,C1,C2;
    full_adder U0(A[0],B[0],Ci,S[0],C0);
    full_adder U1(A[1],B[1],C0,S[1],C1);
    full_adder U2(A[2],B[2],C1,S[2],C2);
    full_adder U3(A[3],B[3],C2,S[3],Co);
    
    endmodule
    

    2.2.2测试模块

    //filename:tb_4adder.v
    `timescale 10ns/1ns
    module tb_74HC283();
    reg [3:0] A,B;
    reg Ci;
    wire [3:0] S;
    wire Co;
    /*参数说明:
    输入:
    A,B为一位二进制被加数,Ci为来自低位的进位
    输出:
    S为和,Co为进位
    */
    
    _74HC283 U(A,B,Ci,S,Co);
    
    initial
    	$monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co);
    initial
    begin
    	A=4'b0000;B=4'b0000;Ci=0;
    	#5;
    	A=4'b0000;B=4'b0000;Ci=1;
    	#5;
    	A=4'b1111;B=4'b1111;Ci=0;
    	#5;
    	A=4'b1111;B=4'b1111;Ci=1;
    	#5;
    	$stop;
    end
    endmodule
    

    2.3仿真结果

    在这里插入图片描述在这里插入图片描述

    二.超前四位加法器74HC283

    设计思路

    行为级建模加法器的功能明晰的,直接列真值表行为级建模,但是在编写过程中发现会出现这样

    case({A,B,Ci})
    	9'b0000_0000_0:begin S=4'b0000;Co=0; end
    	9'b0000_0001—0:begin S=4'b0001;Co=0; end
    ......
        endcase
    

    case语句会出现512条语句,显然不可取。

    数据流建模:
    由于串行进位加法器速度受到进位信号的限制。人们又设计出一种多位数超前进位加法逻辑电路。
    定义两个中间变量:产生变量Gi,传输变量Pi。这两个变量都与进位信号无关。通过代换将各位进位信号表达为只含有Gi,Pi与Ci-1的逻辑表达式(如下),所以个位的进位信号都只与两个加数和向最低位的进位信号Ci-1有关,因此它们是可以并行产生的。
    难点核心体现在这个超前进位产生电路中,上面我们知道超前进位产生电路输入和输出的逻辑表达式之后,采用数据流建模即可。
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    1.超前进位产生电路

    1.1代码实现

    1.1.1设计代码

      //filename:ahead_gene_circuit.v
    module ahead_gene_circuit(
    input [3:0] P,G,
    input Ci,
    output  [3:0] C);
    /*参数说明:
    输入:
    P,G为定义的中间变量,产生变量Gi,传输变量Pi
    Ci为来自低位的进位
    输出:
    C为各位的进位信号
    */
    //根据各位进位信号的逻辑表达式,进行数据流建模。
    assign C[0]=G[0]|(P[0]&Ci);
    assign C[1]=G[1]|(P[1]&C[0]);
    assign C[2]=G[2]|(P[2]&C[1]);
    assign C[3]=G[3]|(P[3]&C[2]);
    endmodule
    

    1.1.2测试代码

    //filename:tb_ahead_gene_circuit.v
    `timescale 10ns/1ns
    module tb_ahead_gene_circuit();
    reg [3:0] P,G;
    reg Ci;
    wire  [3:0] C;
    
    ahead_gene_circuit U(P,G,Ci,C);
    initial
    	$monitor($time,"\tP=%b,G=%b,Ci=%b,C=%b",P,G,Ci,C);
    initial    begin
    	P=4'b0000;G=4'b0000;Ci=0;
    	#5;
    	P=4'b1111;G=4'b1111;Ci=0;
    	#5;
    	P=4'b1010;G=4'b1010;Ci=0;
    	#5;
    	P=4'b1010;G=4'b1010;Ci=1;
    	#5;
    	$stop;
    end
    endmodule
    

    1.2 仿真结果

    在这里插入图片描述
    在这里插入图片描述

    2.应用超前进位产生电路设计出74HC283

    2.1代码实现

    2.1.1设计模块

    //filename:ahead_gene_circuit.v
    module ahead_gene_circuit(
    input [3:0] P,G,
    input Ci,
    output  [3:0] C);
    /*参数说明:
    输入:
    Pi为传输信号,Gi为产生信号
    Ci为对最低位的进位
    输出:
    C为各位的进位信号
    */
    //根据各位进位信号的逻辑表达式,进行数据流建模。
    assign C[0]=G[0]|(P[0]&Ci);
    assign C[1]=G[1]|(P[1]&C[0]);
    assign C[2]=G[2]|(P[2]&C[1]);
    assign C[3]=G[3]|(P[3]&C[2]);
    endmodule
    
    module _74HC283(
    input [3:0] A,B,
    input Ci,
    output [3:0] S,
    output Co);
    /*参数说明:
    输入:A,B为被加数;Ci为对最低位的进位
    输出:S为和,co为产生的进位信号
    */
    //根据中间变量的定义表示出gi和pi。
    wire [3:0] P,G,C;
    assign P=A^B;
    assign G=A&B;
    //应用超前进位产生电路。
    ahead_gene_circuit U(P,G,Ci,C);
    
    assign Co=C[3];
    assign S[3]=C[2]^P[3];
    assign S[2]=C[1]^P[2];
    assign S[1]=C[0]^P[1];
    assign S[0]=Ci^P[0];
    endmodule
    

    2.1.2测试模块

    `timescale 10ns/1ns
    module tb2_74HC283();
    reg [3:0] A,B;
    reg Ci;
    wire [3:0] S;
    wire Co;
    
    _74HC283 U(A,B,Ci,S,Co);
    initial
    	$monitor($time,"\tA=%b,B=%b,Ci=%b,S=%b,Co=%b",A,B,Ci,S,Co);
    initial    begin
    	A=4'b0000;B=4'b0000;Ci=0;
    	#5;
    	A=4'b1111;B=4'b1111;Ci=0;
    	#5;
    	A=4'b1010;B=4'b1010;Ci=0;
    	#5;
    	A=4'b1010;B=4'b1010;Ci=1;
    	#5;
    	$stop;
    end
    endmodule
    

    2.2仿真结果

    在这里插入图片描述
    在这里插入图片描述

    三.问题与总结

    1。对于两个多位二进制数,也可以直接按位或,按位异或等等,不需要对数组一个一个进行或,异或等操作。
    2.仿真时,对于多位二进制数进行波形显示时,点击对用变量左侧的加号,将数据波形分开,效果更好。

    文章图片来自康华光编写的《电子技术基础——数字部分》

    展开全文
  • 四位加法器verilog

    2011-11-22 17:03:20
    使用verilog编写的四位加法器,module aad4()
  • 计算机组成 实验四 四位加法器 山东大学
  • VHDL实现四位加法器

    千次阅读 多人点赞 2019-09-09 15:54:47
    1、实验目的:进一步练习VHDL语言设计工程的建立...3、实验要求:设计一个四位加法器,实体名称为“adder4”,其引脚与功能如下表。 端口模式 端口名 数据类型 功能逻辑表达式 说明 in输入 a std_logic_vect...

    1、实验目的:进一步练习VHDL语言设计工程的建立与仿真的步骤和方法、熟悉VHDL语言RTL描述方式的编写方法。
    2、实验环境:PC个人计算机、Windows操作系统、Quartus II集成开发环境软件。
    3、实验要求:设计一个四位加法器,实体名称为“adder4”,其引脚与功能如下表。

    端口模式 端口名 数据类型 功能逻辑表达式 说明
    in输入 a std_logic_vector(3 downto 0) 加数
    in输入 b std_logic_vector(3 downto 0) 加数
    in输入 ci std_logic 来自低位进位
    out输出 s std_logic_vector(3 downto 0) s(0) <= a (0) xor b(0) xor cic0<= (a(0) and b(0)) or (a(0) and ci) or (b(0) and ci) 加数
    out输出 co std_logic co<= (a(3) and b(3)) or (a(3) and c2) or (b(3) and c2) 加数

    4、实验步骤:①建立工程、②编辑代码、③编译及修改错误、④建立仿真波形并仿真、⑤根据仿真结果分析设计是否正确。
    提示:模块内部(构造体说明部分)需要定义三个连接线,定义语句为:
    signal c0,c1,c2 : std_logic

    说明:xzfc是我的工程名,有需要替换即可

    
    LIBRARY IEEE;
    use ieee.std_logic_1164.all;
    
    entity xzfc is
    port(a,b:in std_logic_vector(3 downto 0);
    		ci:in std_logic;
    		s:out std_logic_vector(3 downto 0);
    		co:out std_logic);
    end entity;
    		architecture aqjq of xzfc is
    		SIGNAL c0,c1,c2:std_logic;
    		begin	
    			s(0) <= a (0) xor b(0) xor ci;
    			c0<= (a(0) and b(0)) or (a(0) and ci) or (b(0) and ci);
    			
    			s(1) <= a (1) xor b(1) xor c0;
    			c1<= (a(1) and b(1)) or (a(1) and c0) or (b(1) and c0);
    			
    			s(2) <= a (2) xor b(2) xor c1;
    			c2<= (a(2) and b(2)) or (a(2) and c1) or (b(2) and c1);
    			
    			s(3) <= a (3) xor b(3) xor c2;
    			co<= (a(3) and b(3)) or (a(3) and c2) or (b(3) and c2);
    		end architecture aqjq;
    			
    		
     
    
    
    展开全文
  • 用FPGA实现四位加法器,代码正确,无需改动
  • 四位加法器和比较器基于VHDL语言 四位加法器和比较器基于VHDL语言
  • 数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计) 前面介绍了关于xilinx FPGA CLB的基本原理和结构,以及如何使用原语进行设计 一、基于LUT3的四位加法器设计 对于generate语句块,这是...

    数字IC设计 FPGA——再谈加法器设计(使用Verilog 原语 进行四位加法器设计)

    前面介绍了关于xilinx FPGA CLB的基本原理和结构,以及如何使用原语进行设计(在一般的设计中使用不到,本节只是更好理解FPGA内部逻辑块资源的使用),参考这篇博客:
    浅谈XILINX FPGA CLB单元 汇总 (CLB、LUT、存储单元、Distributed RAM、移位寄存器、多路复用器、进位逻辑(Carry Logic))

    之前写过一篇关于如何使用Verilog 设计半加器,全加器及超前进位加法器的博客:数字电路基础知识(四) 加法器-半加器、全加器与超前进位加法器

    在使用FPGA进行设计时,如果能对FPGA中的资源分布及配置能有详细的了解,对于设计高性能的计算硬件具有更好的指导意义。因此我们可以使用原语来设计快速加法器或乘法器等比较常用的电路。

    一、基于LUT3的四位加法器设计

    因为一个全加器由输入A,B,及进位信号Cout 三个输入端口,所以利用查找表进行设计,应该选用LUT3以上的查找表,下面针对LUT3 单元进行设计分析
    下面的结构是经典的行波进位加法器
    在这里插入图片描述

    1. 全加器
      有关基本的加法器的介绍本节会略去。
      一位全加器的基本逻辑方程:
      S = A xor B xor Cin
      Cout = (A and B) or (A and Cin) or (B and Cin)

      下表给出了真值表:
      在这里插入图片描述
      因此输出S的三位查找表的初始值为:8’b1001_0110 (8’h96)
      进位输出Cout的三位查找表的初始值为:8’b1110_1000 (8’hE8)

    2. 使用Vivado进行一位全加器的设计
      代码如下:

    module addr_1bit(
    A,B,Cin,S,Cout
        );
    
    input A,B;
    input Cin;
    output S,Cout;
    
    LUT3 #(
          .INIT(8'h96)  // Specify LUT Contents    查找表值
       ) LUT3_inst1 (		
          .O(S),   // LUT general output 结果输出端
          .I0(Cin), // LUT input
          .I1(B), // LUT input
          .I2(A)  // LUT input
       );
    
    LUT3 #(
          .INIT(8'hE8)  // Specify LUT Contents 	查找表值
       ) LUT3_inst2 (		
          .O(Cout),   // LUT general output 进位输出端
          .I0(Cin), // LUT input
          .I1(B), // LUT input
          .I2(A)  // LUT input
       );
    
    endmodule
    

    LUT3_inst1和LUT3_inst2分别是S 结果输出端和Cout进位输出端。

    1. 仿真结果在这里插入图片描述
    2. 四位全加器的设计
    module addr_4bit(
    A,B,Ci,S,Co
        );
    
    input [3:0] A,B;
    input Ci;
    output [3:0] S;
    output Co;
    
    wire [4:0] Cin;
    
    genvar i;
    generate
       assign Ci = Cin[0];
       assign Co = Cin[4];
       for (i=0;i<4;i=i+1)
       begin: label				// label是实例化之后的名称
            addr_1bit u(
            .A(A[i]),
            .B(B[i]),
            .S(S[i]),
            .Cout(Cin[i+1]),
            .Cin(Cin[i])
            );  
       end  
    endgenerate
    
    endmodule
    

    需要注意的是Cin是线网wire类型的变量,位宽为5bit。addr_1bit即为上面的一位全加器的模块。

    对于generate语句块,这是Verilog 2001语法中新增的语法,方便了设计者设计电路。
    但需要注意generate-for语句:
    (1) 必须有genvar关键字定义for语句的变量。
    (2)for语句的内容必须加begin和end(即使就一句)。
    (3)for语句必须有个名字。

    上面的generate 的代码片段等效于下面:

    /*
    addr_1bit u1(.A(A[0]),.B(B[0]),.S(S[0]),.Cin(Cin[0]),.Cout(Cin[1]));
    addr_1bit u2(.A(A[1]),.B(B[1]),.S(S[1]),.Cin(Cin[1]),.Cout(Cin[2]));
    addr_1bit u3(.A(A[2]),.B(B[2]),.S(S[2]),.Cin(Cin[2]),.Cout(Cin[3]));
    addr_1bit u4(.A(A[3]),.B(B[3]),.S(S[3]),.Cin(Cin[3]),.Cout(Cin[4]));
    
    assign Ci = Cin[0];
    assign Cout = Cin[4];
    */
    

    其RTL电路为:
    在这里插入图片描述
    仿真结果如下:
    可以看到有正确的结果输出和进位输出
    在这里插入图片描述
    5. 利用LUT3设计四位加法器的资源利用及延迟情况
    在这里插入图片描述
    在这里插入图片描述

    二、基于LUT5的四位加法器设计

    1. 对于上面利用LUT3来设计加法器的情况,无论是资源使用情况还是延迟都存在改进的空间,由于Xilinx 7 系列中CLB是由LUT5/6组成,而上述的LUT3实际上把LUT5当作是LUT3来使用了,即资源中所使用的8个LUT3实际上占用8个LUT5。
      因此可以想到的是将加法器直接使用LUT5,就可以减少资源的使用及可以减少延迟。
      下图是改进的四位加法器结构:
      使用5输入查找表,就可以使用俩位全加器,即五个输入分别是,两个加数A0,A1、两个加数B0,B1,进位输入Cin;输出需要三个结果输出S0,S1,进位输出Cout。
      在这里插入图片描述
    2. 设计思路
      由于把两个全加器当作一级来使用,因此有五个输入,三个输出,但是LUT5只能提供俩输出,因此还需要一个LUT3来作为第三个输出使用。因此,每一级使用2个五输入查找表和一个三输入查找表。
      具体的每一级全加器的真值表如下:
      在这里插入图片描述

    我们将S0作为三位查找表的输出,其初始值仍为:8’b1001_0110 (8’h96);
    输出S1的五位查找表,初始值为:32’b1001_1001_1001_0110_1001_0110_0110_0110 (32’h9996_9666);
    输出Cout的五位查找表,初始值为:32’b1110_1110_1110_1000_1110_1000_1000_1000 (32’hEEE8_E888)

    1. 一级对应的全加器代码如下:
      在这里插入图片描述
      RTL电路结构:
      在这里插入图片描述
    2. 两级形成四位全加器
    module addr_4bit(
    a0,a1,b0,b1,Ci,s0,s1,Co
        );
    
    input [1:0] a0,a1,b0,b1;
    input Ci;
    output [1:0] s0,s1;
    output Co;
    
    wire [2:0] Cin;
    
    addr_2bit u1(
            .A0(a0[0]),
            .A1(a0[1]),
            .B0(b0[0]),
            .B1(b0[1]),
            .S0(s0[0]),
            .S1(s0[1]),
            .Cin(Cin[0]),
            .Cout(Cin[1])
    );
    
    addr_2bit u2(
            .A0(a1[0]),
            .A1(a1[1]),
            .B0(b1[0]),
            .B1(b1[1]),
            .S0(s1[0]),
            .S1(s1[1]),
            .Cin(Cin[1]),
            .Cout(Cin[2])
    );
    
    assign Ci = Cin[0];
    assign Co = Cin[2];
    
    endmodule
    

    RTL电路结构:
    在这里插入图片描述
    仿真结果:
    在这里插入图片描述
    5. 两级形成四位全加器的资源利用和延迟情况对比
    在这里插入图片描述
    在这里插入图片描述
    可以看到和之前采用LUT3设计的四位加法器相比,资源利用变少了,关键路径延迟也变小了。

    但需要说明一点的是:
    如果再不采用原语进行设计的情况下,直接编写加法器Verilog代码,综合工具会根据自己的算法给出一个比较合理的电路,可能会比我们采用后一种方法设计的要更好,这需要依赖EDA综合工具。
    但是通过了解CLB的不同的基本配置方式以及内部资源分布,对于更好理解软件综合过程和设计具有更好的指导意义,如果能再关键的位置手动配置硬件资源,可能会改善局部性能,这对于高性能计算硬件有重要意义,尤其是底层的硬件加法等部件。

    展开全文
  • 计组实验四位加法器设计

    千次阅读 2019-10-02 23:34:59
    QUARTUS2四位加法器 要求Verilog HDL语言设计一位全加器电路,调用一位全加器符号模块,顶层采用原理图方式设计四位加法器。 一位全加器的符号:包括3个输入端和2个输入端 链接:...

    QUARTUS2四位加法器

    要求Verilog HDL语言设计一位全加器电路,调用一位全加器符号模块,顶层采用原理图方式设计四位加法器。

    一位全加器的符号:包括3个输入端和2个输入端
    在这里插入图片描述
    链接:https://pan.baidu.com/s/1GwJ2FukNtzbH6KJ8Xm5QSA
    提取码:hw4w
    四位全加器原理图:
    在这里插入图片描述
    一位全加器代码:
    module jizushiyan1(a, b, cin, cout, sum);
    input a, b, cin;
    output cout, sum;
    assign {cout, sum}=a+b+cin;
    endmodule

    展开全文
  • 用verilog编写的四位加法器,编程环境是xilinx ise10.1
  • 大学EDA实验,四位二进制加法器和八位二进制加法器
  • 计算机组成原理实验内容:用VHDL实现四位加法器
  • 利用四位加法器实现8421BCD运算补正

    千次阅读 2018-10-23 18:26:59
    利用四位加法器实现8421BCD运算补正 实验原理 判别标准: ​ 两位8421BDC码相加,如果 ​ 产生进位 (设由此产生的进位为C_Flag_1) ​ Or ​ 出现A-F (设由此产生的进位为C_Flag_2) ​ 则CF=1 解决方法: ​ 加...
  • Verilog实现四位加法器

    千次阅读 2019-11-07 17:44:05
    实现一个4-bit加法器,要求如下: 用9个拨动开关分别表示两个4-bit的加数和被加数,以及进位输入; 用5个LED表示4-bit的和(Sum),以及1-bit的进位输出; 用1个七段数码管显示和(Sum)的值。 仿真文件: testbench...
  • Proteus 01 四位加法器

    2020-03-09 02:12:22
  • 哈哈,VHDL实现四位串行加法器,自己模拟吧.经测试很好用。恩,还不够20个字么
  • module add4(add,a,b,clk); //4位加法器 output[4:0] add; input[3:0] a,b; input clk; reg[4:0] add; always @(posedge clk) begin add = a + b; end endmodule ...
  • endmodule 采用先行进位方式的四位全加器 采用串行进位的四位全加器 module myCLA(cin,G0,P0,G1,P1,G2,P2,G3,P3,C0,C1,C2,C3); input cin,P0,P1,P2,P3,G0,G1,G2,G3; output C0,C1,C2,C3; //input [3:0]P,G; //错误...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 441
精华内容 176
关键字:

四位加法器