首页 > 其他分享 >HDLBits(5) 9.1

HDLBits(5) 9.1

时间:2022-09-01 16:24:27浏览次数:50  
标签:15 cout HDLBits sum 16 9.1 add16 31

2 Verilog语言

2.2 向量

2.3.6 加法器1

实例化一个由两个16位加法器组合成的32位加法器

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
	wire cout,cout1;
    add16 u1_add16(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(1'b0),
        .sum(sum[15:0]),
        .cout(cout)
    );
    add16 u2_add16(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(cout),
        .sum(sum[31:16]),
        .cout(cout1)
    );
endmodule

2.3.6 加法器2(波纹进位加法器Ripple Carry Adder)

module top_module (
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
    wire cout1,cout2;
    add16 u1_add16(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(1'b0),
        .sum(sum[15:0]),
        .cout(cout1)
    );
    add16 u2_add16(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(cout1),
        .sum(sum[31:16]),
        .cout(cout2)
    );
endmodule
module add1 ( input a, input b, input cin,   output sum, output cout );
	assign {cout,sum} = a+b+cin;
endmodule

2.3.8 进位选择加法器(Carry-select Adder)

2.3.7中的加法器计算进位输出的延迟很高,必须在前一级加法器计算完成之后,后一级加法器才能够开始计算

在选择加法器中,第一级加法器保持不变,第二级加法器有两个,一个假设进位为0,另一个假设进位为1。然后使用第一级结果和2选一选择器来选择哪一个结果是正确的。

module top_module(
    input [31:0] a,
    input [31:0] b,
    output [31:0] sum
);
	wire cout1,cout2,cout3;
    wire [15:0] sum0;
    wire [15:0] sum1;
    add16 u1_add16(
        .a(a[15:0]),
        .b(b[15:0]),
        .cin(1'b0),
        .sum(sum[15:0]),
        .cout(cout1)
    );
    add16 u2_add16(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(1'b0),
        .sum(sum0[15:0]),
        .cout(cout2)
    );
    add16 u3_add16(
        .a(a[31:16]),
        .b(b[31:16]),
        .cin(1'b1),
        .sum(sum1[15:0]),
        .cout(cout3)
    );
    assign sum[31:16]=cout1 ? sum1 : sum0;
endmodule

2.3.9 加法器-减法器

加法器-减法器可以通过选择性地取反一个输入来从加法器构建,这相当于将输入反相然后加 1。最终结果是一个可以执行两种操作的电路:a + b + 0 和  a + ~b + 1(即a - b)

module top_module(
    input [31:0] a,
    input [31:0] b,
    input sub,
    output [31:0] sum
);
    wire[31:0]	b_sub;
    wire        cout;
    assign b_sub = {32{sub}} ^ b;//b有32位,sub只有1位,故要重复32次
    //assign b_sub = sub ?~b:b;
    add16 u1_add16(
        .a(a[15:0]),
        .b(b_sub[15:0]),
        .cin(sub),
        .sum(sum[15:0]),
        .cout(cout)
    );
    add16 u2_add16(
        .a(a[31:16]),
        .b(b_sub[31:16]),
        .cin(cout),
        .sum(sum[31:16]),
        .cout()
    );
endmodule

 

标签:15,cout,HDLBits,sum,16,9.1,add16,31
From: https://www.cnblogs.com/LhTian/p/16646906.html

相关文章

  • jssip3.9.1的demo,webphone网页电话
    用的目前最新的3.9.1版本,全版本在这里:https://jssip.net/download/releases/https://github.com/versatica/JsSIP 代码:<!DOCTYPEhtml><htmllang="en"><head......
  • HDLBits答案——Circuits
    1CombinationalLogic1.1BasicGates1.1.1Exams/m2014q4hmoduletop_module(inputin,outputout); assignout=in;endmodule1.1.2Exams/m2014q......
  • HDLBits(二) 8.22
    2.Verilog语言2.1基础2.1.7声明导线创建一个中间信号,用于简化整个电路模块的逻辑表达语法:wirefoo;#foo为定义的wirename#wirew1,w2;  as......
  • HDLBits(一)(边刷边学)
    1开始1.1输出逻辑1直接assignone=1'b1,给outputone赋值1'b1,表示1bit数值,b=二进制,o=八进制,d=十进制,h=十六进制1.2输出逻辑0 可以直接提交,因为在Quartus中,输出端......
  • HDLBits答案——Verilog Language
    VerilogLanguage1Basics1.1Wiremoduletop_module(inputin,outputout);assignout=in;endmodule1.2Wire4moduletop_module(inputa,b,......
  • HDLBits答案——Getting started
    Gettingstarted1Steponemoduletop_module(outputone);//Insertyourcodehereassignone=1'b1;endmodule2Zeromoduletop_module(outputze......