Verilog 加法器/减法器

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

目录

1位加法器

8位加法器

8位补码加减法器 

32位补码加减法器 


1位加法器

Verilog 加法器/减法器Verilog 加法器/减法器

 

 

//
//创建日期:2022/09/21 19:05:50
//设计名称:一位加法器
//课程名称:adder_1
//说明:输入operand1,operand2和进位信号cin
//      输出当前位result和进位cout
//依赖项:
//      
//版次:
//版本0.01-文件已创建
//其他注释:
//
//


module adder_1(operand1,operand2,cin,result,cout);
    input operand1;     // 加数1
    input operand2;     // 加数2
    input cin;          // 进位输入
    output result;      // 当前位输出
    output cout;        // 进位
    wire c[3:0];        // 接线
    // 当前位为三个输入的异或,三个输入为1的个数为奇数时,当前位为1
    xor x1(c[0],operand1,operand2),
        x2(result,c[0],cin);
    //  进位信号为 与非(与非(输入1,输入2),与非(异或(输入1,输入2),进位))
    nand na1(c[1],cin,c[0]),
         na2(c[2],operand1,operand2),
         na3(cout,c[1],c[2]);
endmodule

8位加法器

//
//创建日期:2022/09/21 19:05:50
//设计名称:8位加法器
//课程名称:adder_8
//说明:输入8位operand1,8位operand2和进位信号cin
//      输出8位result和进位cout
//依赖项:
//      adder_1.v
//版次:
//版本0.01-文件已创建
//其他注释:
//
//




module adder_8(operand1,operand2,cin,result,cout);
    input [7:0]operand1;    // 加数1
    input [7:0]operand2;    // 加数2
    input cin;              // 进位输入
    output [7:0]result;     // 当前位输出
    output cout;            // 进位
    wire [6:0] c;           // 第 i 位的进位输入
    adder_1 a0(operand1[0],operand2[0],cin,result[0],c[0]);
    adder_1 a1(operand1[1],operand2[1],c[0],result[1],c[1]);
    adder_1 a2(operand1[2],operand2[2],c[1],result[2],c[2]);
    adder_1 a3(operand1[3],operand2[3],c[2],result[3],c[3]);
    adder_1 a4(operand1[4],operand2[4],c[3],result[4],c[4]);
    adder_1 a5(operand1[5],operand2[5],c[4],result[5],c[5]);
    adder_1 a6(operand1[6],operand2[6],c[5],result[6],c[6]);
    adder_1 a7(operand1[7],operand2[7],c[6],result[7],cout);
endmodule

8位补码加减法器 

Verilog 加法器/减法器

 

//
//创建日期:2022/09/21 19:05:50
//设计名称:8位补码加减法器
//课程名称:adder_subtract_8
//说明:输入8位operand1,8位operand2和加减信号add_or_sub(0+,1-)
//      输出8位result和溢出提示overflow
//依赖项:
//      adder_1.v
//版次:
//版本0.01-文件已创建
//其他注释:
//
//


module adder_subtract_8(operand1,operand2,add_or_sub,result,overflow);
    input [7:0]operand1;    // 操作数1
    input [7:0]operand2;    // 操作数2
    input add_or_sub;       // 加减信号(0+,1-)
    output [7:0]result;     // 当前位输出
    output overflow;        // 溢出提示
    wire [7:0] c;           // 第 i 位的进位输入
    wire [7:0] op2;           // 操作数2的负数补码
    // 由add_or_sub控制输入的是正数还是负数
    xor x0(op2[0],add_or_sub,operand2[0]),
        x1(op2[1],add_or_sub,operand2[1]),
        x2(op2[2],add_or_sub,operand2[2]),
        x3(op2[3],add_or_sub,operand2[3]),
        x4(op2[4],add_or_sub,operand2[4]),
        x5(op2[5],add_or_sub,operand2[5]),
        x6(op2[6],add_or_sub,operand2[6]),
        x7(op2[7],add_or_sub,operand2[7]);
    // 加法器
    adder_1 a0(operand1[0],op2[0],add_or_sub,result[0],c[0]);
    adder_1 a1(operand1[1],op2[1],c[0],result[1],c[1]);
    adder_1 a2(operand1[2],op2[2],c[1],result[2],c[2]);
    adder_1 a3(operand1[3],op2[3],c[2],result[3],c[3]);
    adder_1 a4(operand1[4],op2[4],c[3],result[4],c[4]);
    adder_1 a5(operand1[5],op2[5],c[4],result[5],c[5]);
    adder_1 a6(operand1[6],op2[6],c[5],result[6],c[6]);
    adder_1 a7(operand1[7],op2[7],c[6],result[7],c[7]);
    xor x8(overflow,c[6],c[7]);
endmodule

32位补码加减法器 

//
//创建日期:2022/09/26 13:24:05
//设计名称:32位补码加减法器
//课程名称:adder_subtract_32
//说明:输入32位operand1,32位operand2和加减信号add_or_sub(0+,1-)
//      输出32位result和溢出提示overflow
//依赖项:
//      adder_1.v
//版次:
//版本0.01-文件已创建
//其他注释:
//
//



module adder_subtract_32(operand1,operand2,add_or_sub,result,overflow);
    input [31:0]operand1;    // 操作数1
    input [31:0]operand2;    // 操作数2
    input add_or_sub;       // 加减信号(0+,1-)
    output [31:0]result;     // 当前位输出
    output overflow;        // 溢出提示
    wire [31:0] c;           // 第 i 位的进位输入
    wire [31:0] op2;           // 操作数2的负数补码
    // 由add_or_sub控制输入的是正数还是负数
    xor x0(op2[0],add_or_sub,operand2[0]),
        x1(op2[1],add_or_sub,operand2[1]),
        x2(op2[2],add_or_sub,operand2[2]),
        x3(op2[3],add_or_sub,operand2[3]),
        x4(op2[4],add_or_sub,operand2[4]),
        x5(op2[5],add_or_sub,operand2[5]),
        x6(op2[6],add_or_sub,operand2[6]),
        x7(op2[7],add_or_sub,operand2[7]),
        x8(op2[8],add_or_sub,operand2[8]),
        x9(op2[9],add_or_sub,operand2[9]),
        x10(op2[10],add_or_sub,operand2[10]),
        x11(op2[11],add_or_sub,operand2[11]),
        x12(op2[12],add_or_sub,operand2[12]),
        x13(op2[13],add_or_sub,operand2[13]),
        x14(op2[14],add_or_sub,operand2[14]),
        x15(op2[15],add_or_sub,operand2[15]),
        x16(op2[16],add_or_sub,operand2[16]),
        x17(op2[17],add_or_sub,operand2[17]),
        x18(op2[18],add_or_sub,operand2[18]),
        x19(op2[19],add_or_sub,operand2[19]),
        x20(op2[20],add_or_sub,operand2[20]),
        x21(op2[21],add_or_sub,operand2[21]),
        x22(op2[22],add_or_sub,operand2[22]),
        x23(op2[23],add_or_sub,operand2[23]),
        x24(op2[24],add_or_sub,operand2[24]),
        x25(op2[25],add_or_sub,operand2[25]),
        x26(op2[26],add_or_sub,operand2[26]),
        x27(op2[27],add_or_sub,operand2[27]),
        x28(op2[28],add_or_sub,operand2[28]),
        x29(op2[29],add_or_sub,operand2[29]),
        x30(op2[30],add_or_sub,operand2[30]),
        x31(op2[31],add_or_sub,operand2[31]);
    // 加法器
    adder_1 a0(operand1[0],op2[0],add_or_sub,result[0],c[0]);
    adder_1 a1(operand1[1],op2[1],c[0],result[1],c[1]);
    adder_1 a2(operand1[2],op2[2],c[1],result[2],c[2]);
    adder_1 a3(operand1[3],op2[3],c[2],result[3],c[3]);
    adder_1 a4(operand1[4],op2[4],c[3],result[4],c[4]);
    adder_1 a5(operand1[5],op2[5],c[4],result[5],c[5]);
    adder_1 a6(operand1[6],op2[6],c[5],result[6],c[6]);
    adder_1 a7(operand1[7],op2[7],c[6],result[7],c[7]);
    adder_1 a8(operand1[8],op2[8],c[7],result[8],c[8]);
    adder_1 a9(operand1[9],op2[9],c[8],result[9],c[9]);
    adder_1 a10(operand1[10],op2[10],c[9],result[10],c[10]);
    adder_1 a11(operand1[11],op2[11],c[10],result[11],c[11]);
    adder_1 a12(operand1[12],op2[12],c[11],result[12],c[12]);
    adder_1 a13(operand1[13],op2[13],c[12],result[13],c[13]);
    adder_1 a14(operand1[14],op2[14],c[13],result[14],c[14]);
    adder_1 a15(operand1[15],op2[15],c[14],result[15],c[15]);
    adder_1 a16(operand1[16],op2[16],c[15],result[16],c[16]);
    adder_1 a17(operand1[17],op2[17],c[16],result[17],c[17]);
    adder_1 a18(operand1[18],op2[18],c[17],result[18],c[18]);
    adder_1 a19(operand1[19],op2[19],c[18],result[19],c[19]);
    adder_1 a20(operand1[20],op2[20],c[19],result[20],c[20]);
    adder_1 a21(operand1[21],op2[21],c[20],result[21],c[21]);
    adder_1 a22(operand1[22],op2[22],c[21],result[22],c[22]);
    adder_1 a23(operand1[23],op2[23],c[22],result[23],c[23]);
    adder_1 a24(operand1[24],op2[24],c[23],result[24],c[24]);
    adder_1 a25(operand1[25],op2[25],c[24],result[25],c[25]);
    adder_1 a26(operand1[26],op2[26],c[25],result[26],c[26]);
    adder_1 a27(operand1[27],op2[27],c[26],result[27],c[27]);
    adder_1 a28(operand1[28],op2[28],c[27],result[28],c[28]);
    adder_1 a29(operand1[29],op2[29],c[28],result[29],c[29]);
    adder_1 a30(operand1[30],op2[30],c[29],result[30],c[30]);
    adder_1 a31(operand1[31],op2[31],c[30],result[31],c[31]);
    xor x32(overflow,c[31],c[30]);
endmodule

8位加减法器仿真

`timescale 1ns / 1ps
//
//创建日期:2022/09/21 20:19:20
//设计名称:8位补码加减法器测试
//课程名称:testbench
//说明:输入8位operand1,8位operand2和加减信号add_or_sub(0+,1-)
//      输出8位result和溢出提示overflow
//依赖项:
//      adder_1.v
//      adder_subtract_8
//版次:
//版本0.01-文件已创建
//其他注释:
//
//
module testbench;
    reg [7:0] input_1;  // 加数 1
    reg [7:0] input_2;  // 加数 2
    reg add_or_sub;     // 加减信号(0+,1-)
    
    wire [7:0] output_1; // 输出
    wire overflow;     // 溢出提示
    
    //调用adder_subtract_8模块
   adder_subtract_8 uut(
        .operand1(input_1),   // 加数1
        .operand2(input_2),   // 加数2
        .add_or_sub(add_or_sub),     // 加减信号(0+,1-)
        .result(output_1),    // 当前位输出
        .overflow(overflow)  //溢出提示
    );
    //初始化仿真
    initial begin
        // Initialize Inputs
        input_1 = 0;
        input_2 = 0;
        add_or_sub = 0;
        // Wait 100 ns for global reset to finish
        #100;
        // Add stimulus here
    end
    always #10 input_1 = $random;  //$random为系统任务,产生一个随机的8位数
    always #10 input_2 = $random;  //#10 表示等待10个单位时间(10ns),即每过10ns,赋值一个随机的32位数
    always #10 add_or_sub = {$random} % 2; //加了拼接符,{$random}产生一个非负数,除2取余得到0或1
endmodule





结果示例,32位太多了,8位好算

Verilog 加法器/减法器文章来源地址https://www.toymoban.com/news/detail-514583.html

到了这里,关于Verilog 加法器/减法器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【FPGA】Verilog:BCD 加法器的实现 | BCD 运算 | Single-level 16 bit 超前进位加法器 | 2-level 16-bit 超前进位加法器

    0x00 BCD 运算 在 BCD 中,使用4位值作为操作数,但由于只表示 0 到 9 的数字,因此只使用 0000 到 1001 的二进制数,而不使用 1010 到 1111 的二进制数(don\\\'t care)。 因此,不能使用常规的 2\\\'complement 运算来计算,需要额外的处理:如果 4 位二进制数的运算结果在 1010 到 1111 的范围

    2024年02月05日
    浏览(48)
  • 【FPGA】Verilog:二进制并行加法器 | 超前进位 | 实现 4 位二进制并行加法器和减法器 | MSI/LSI 运算电路

    0x00 并行加法器和减法器 如果我们要对 4 位加法器和减法器进行关于二进制并行运算功能,可以通过将加法器和减法器以 N 个并行连接的方式,创建一个执行 N 位加法和减法运算的电路。 4 位二进制并行加法器 4 位二进制并行减法器

    2024年02月05日
    浏览(57)
  • 各种加法器的比对分析与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日
    浏览(54)
  • verilog全加器和四位加法器

    半加器: 保存为half_addr.bsf之后,可以在该项目中添加半加器 全加器: 通过RTL-Viewer查看半加器和全加器 添加全加器到项目 在process里面先后执行start fitter 和start time analyzer 生成testbench模板 修改testbench文件: 添加到项目 注意在联合modelsim时让generate functinal simulation netlist值为

    2024年02月07日
    浏览(46)
  • 各种加法器的比对分析与Verilog实现(1)

            接下来几篇博客,我将介绍常见的几种加法器设计,包括超前进位、Kogge-Stone、brent-kung、carry-skip、Conditional-Sum等加法器的原理及Verilog实现。        本文将介绍行波进位加法器、超前进位加法器的原理及Verilog实现。 1.1 原理        从下方原理图即可看出,

    2024年02月08日
    浏览(47)
  • verilog数组的定义、转换和加法器的实现

    看了别人的博客有的人也称reg [31:0] add0[0:12]这样的数组为二维数组,其实中二维数组不是真正意义上的数组,而是由多个寄存器组成的ROM或者RAM。我觉得这样理解好记一点:这个是一维数组,一共有0到12共13组数据,每组数据的宽度是0到31一共32个位宽。 优势:简单易于编程

    2024年02月11日
    浏览(44)
  • Verilog数字系统设计——带进位的8位加法器

    试分别使用门级原语和always 语句设计带进位的8位加法器,要求编制测试模块对实现的逻辑功能进行完整的测试; 使用门级原语设计时注意先在草稿上做出该加法器的门级设计; 如有余力可以进一步使用门级原语设计出带超前进位链的8位加法器(期末有加分); 实验提交

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

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

    2024年02月04日
    浏览(45)
  • Verilog设计4位CLA加法器电路,并仿真测试

    使用Quartus+modelsim完成本次设计 对于超前进位加法器 (CLA)加法器,它不同于普通加法器。如果对于两个1024位的数字进行相加,那么普通的串行加法器因为只有算出 C x C_{x} C x ​ 才能继续计算 C x + 1 C_{x+1} C x + 1 ​ ,这会导致整体的效率非常低。如果使用超前进位加法器,那

    2024年02月04日
    浏览(58)
  • Verilog快速入门(8)—— 4bit超前进位加法器电路

    (1) 四选一多路器 (2)异步复位的串联T触发器 (3)奇偶校验 (4)移位运算与乘法 (5)位拆分与运算 (6)使用子模块实现三输入数的大小比较 (7)4位数值比较器电路 (8)4bit超前进位加法器电路 (9)优先编码器电路① (10)用优先编码器①实现键盘编码电路 (11)8线-3线优先编码器 (12)使用8线-3线

    2024年02月04日
    浏览(47)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包