[FPGA]用Verilog写一个简单三位二进制加法器和减法器

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

一、介绍

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

本报告的目的是使用Verilog语言编写一个位加法器(bit_add)和一个位减法器(bit_sub),并将它们组合成一个三位加法器(bit3_add)和一个三位减法器(bit3_sub)。本报告将介绍这些模块的设计和实现,以及它们的原理和功能。本报告还将分析这些模块的输入和输出,以及它们的优缺点。

二、设计和实现

1.位加法器(bit_add)

位加法器的原理是利用异或运算和与非运算来实现加法逻辑。异或运算可以判断两个输入是否相同,如果相同则输出0,如果不同则输出1。与非运算可以判断两个输入是否都为1,如果都为1则输出0,如果有一个为0则输出1。

位加法器的功能如下表所示:

3位全加器verilog,fpga开发

位加法器(bit_add)是一个可以对两个一位二进制数和一个进位输入进行加法运算的模块,它有五个端口,分别是operand1、operand2、cin、result和cout。operand1和operand2是加数,cin是进位输入,result是当前位输出,cout是进位输出。

位加法器的代码如下:

module  bit_add(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

 

RTL分析图如下:

3位全加器verilog,fpga开发

2.位减法器(bit_sub)

位减法器的原理是利用异或运算和与非运算来实现减法逻辑。异或运算可以判断两个输入是否相同,如果相同则输出0,如果不同则输出1。与非运算可以判断两个输入是否都为1,如果都为1则输出0,如果有一个为0则输出1。

位减法器的功能如下表所示:

3位全加器verilog,fpga开发

位减法器(bit_sub)是一个可以对两个一位二进制数和一个借位输入进行减法运算的模块,它有五个端口,分别是operand1、operand2、cin、result和cout。operand1是被减数,operand2是减数,cin是借位输入,result是当前位输出,cout是借位输出。

位减法器的代码如下:

module bit_sub(operand1,operand2,cin,result,cout);

    input operand1;     // 被减数

    input operand2;     // 减数

    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),借位))

    not n1(c[1],operand2);

    nand na1(c[2],cin,c[0]),

         na2(c[3],operand1,c[1]),

         na3(cout,c[2],c[3]);

endmodule

RTL分析图如下:

3位全加器verilog,fpga开发

3.三位加法器(bit3_add)

三位加法器的原理是利用位加法器(bit_add)来实现三位加法逻辑。三位加法器将两个三位二进制数的每一位和对应的进位输入分别送入位加法器,得到每一位的和和进位输出。三位加法器的最高位的进位输出就是整个三位加法器的进位输出。

串行进位加法器示意图如图:

3位全加器verilog,fpga开发

 三位加法器(bit3_add)是一个可以对两个三位二进制数和一个进位输入进行加法运算的模块, 它有九个端口,分别是operand1、operand2、cin、result和cout。operand1和operand2是加数,cin是进位输入,result是三位和,cout是进位输出。

三位加法器的代码如下:

module bit3_add(operand1,operand2,cin,result,cout,DIG,seg);

    input [2:0]operand1;    // 加数1

    input [2:0]operand2;    // 加数2

    input cin;              // 进位输入

    output [2:0]result;     // 当前位输出,修改为四位

    output cout;            // 进位

    wire [1:0] c;           // 第 i 位的进位输入

    wire c1; // 中间变量

    bit_add a0(operand1[0],operand2[0],cin,result[0],c[0]);

    bit_add a1(operand1[1],operand2[1],c[0],result[1],c1); // 将cout输出赋给c1

    bit_add a2(operand1[2],operand2[2],c1,result[2],cout); // 将c1作为cin输入

    output [5:0]DIG;

    output reg [7:0]seg;

    assign DIG[5] =1;   

    assign DIG[4] =1;  

    assign DIG[3] =1;  

    assign DIG[2] =1;

    assign DIG[1] =1;

    assign DIG[0] =0;    

    reg [2:0]N;  

    initial N =3'b0;

   always @(operand1 or operand2) // operand1或operand2变化时触发

   if(operand1 >= operand2)    N = operand1;

   else    N = operand2;       

   reg [2:0]M;   

   initial M =3'b0;

    always @(operand1 or operand2)

    if(operand1 >= operand2)    M = operand1;

   else    M = operand2;

  always@(seg,result,result[2],result[1],result[0])

  begin      case({cout,result})     

     4'd0:seg=8'b11111100;    

     4'd1:seg=8'b01100000;   

     4'd2:seg=8'b11011010;

     4'd3:seg=8'b11110010;    

     4'd4:seg=8'b01100110;     

     4'd5:seg=8'b10110110;   

     4'd6:seg=8'b10111110;    

      4'd7:seg=8'b11100000;   

     4'd8:seg=8'b11111110;   

     4'd9:seg=8'b11110110;  

     4'd10:seg=8'b11111101;    

     4'd11:seg=8'b01100001;   

     4'd12:seg=8'b11011011;

     4'd13:seg=8'b11110011;

    4'd14:seg=8'b01100111;  

    4'd15:seg=8'b00000000;  

    default:seg=8'b11111111;    

  endcase

           end

     endmodule

 

RTL分析图如下

3位全加器verilog,fpga开发

IO口分配

3位全加器verilog,fpga开发

3位全加器verilog,fpga开发

由此可以实现通过用7个键位(operand1,operand2,cin)来控制输入,用LED灯的亮(1)暗(0)和十进制数码管来表示输出结果。

实例演示:

3位全加器verilog,fpga开发

3位全加器verilog,fpga开发 3位全加器verilog,fpga开发

 输入为111和111时,数码管显示.4(原因是只设计了一位数码管显示)

4.三位减法器(bit3_sub)

三位减法器的原理是利用位减法器(bit_sub)来实现三位减法逻辑。三位减法器将两个三位二进制数的每一位和对应的借位输入分别送入位减法器,得到每一位的差和借位输出。三位减法器的最高位的借位输出就是整个三位减法器的借位输出。

三位减法器(bit3_sub)是一个可以对两个三位二进制数和一个借位输入进行减法运算的模块,它有25个端口,分别是operand1、operand2、cin、result、cout、DIG和seg。operand1是被减数,operand2是减数,cin是借位输入,result是三位差,cout是借位输出,DIG和seg用于数码管显示。

三位减法器的代码如下:

module bit3_sub(operand1,operand2,cin,result,cout,DIG,seg);

    input [2:0]operand1;    // 被减数

    input [2:0]operand2;    // 减数

    input cin;              // 借位输入

    output [2:0]result;     // 当前位输出

    output cout;            // 借位

    wire [1:0] c;           // 第 i 位的借位输入

    wire c1; // 中间变量

    bit_sub a0(operand1[0],operand2[0],cin,result[0],c[0]);

    bit_sub a1(operand1[1],operand2[1],c[0],result[1],c1); // 将cout输出赋给c1

    bit_sub a2(operand1[2],operand2[2],c1,result[2],cout); // 将c1作为cin输入

    

    output [5:0]DIG;

    output reg [7:0]seg;

    assign DIG[5] =1;   

    assign DIG[4] =1;  

    assign DIG[3] =1;  

    assign DIG[2] =1;

    assign DIG[1] =1;

    assign DIG[0] =0;    

    reg [2:0]N;  

    initial N =3'b0;

    always @(operand1 or operand2) //operand1或operand2变化时触发

    if(operand1 >= operand2)    N = operand1;

   else    N = operand2;       

   reg [2:0]M;   

   initial M =3'b0;

    always @(operand1 or operand2)

if(operand1 >= operand2)    M = operand1;

   else    M = operand2;

  always@(seg,result,result[2],result[1],result[0])

  begin      case({cout,result})     

   4'd0:seg=8'b11111100;    

     4'd1:seg=8'b01100000;   

   4'd2:seg=8'b11011010;

     4'd3:seg=8'b11110010;    

     4'd4:seg=8'b01100110;     

     4'd5:seg=8'b10110110;   

     4'd6:seg=8'b10111110;    

      4'd7:seg=8'b11100000;   

     4'd8:seg=8'b11111110;   

     4'd9:seg=8'b11110110;  

    4'd10:seg=8'b11111101;    

       4'd11:seg=8'b01100001;   

    4'd12:seg=8'b11011011;

     4'd13:seg=8'b11110011;

    4'd14:seg=8'b01100111;  

    4'd15:seg=8'b00000000;  

    default:seg=8'b11111111;    

  endcase

           end

     endmodule

 RTL分析图如下:

3位全加器verilog,fpga开发

 

IO口分配:

3位全加器verilog,fpga开发

3位全加器verilog,fpga开发 

由此可以实现通过用7个键位(operand1,operand2,cin)来控制输入,用LED灯的亮(1)暗(0)和数码管显示十进制数来表示输出结果。

实例演示:

3位全加器verilog,fpga开发

输入为000和000时,数码管显示0

3位全加器verilog,fpga开发

输入为111和000,数码管显示7

3位全加器verilog,fpga开发

输入为000和111,数码管显示9

原因由于溢出,0000-0111=0000+1001=1001

三、分析

本报告使用Verilog语言编写了一个位加法器(bit_add)和一个位减法器(bit_sub),并将它们组合成一个三位加法器(bit3_add)和一个三位减法器(bit3_sub)。

这些模块的优点有:

1.可以用来实现更高位的加法器和减法器,只需将它们按照位数扩展即可。

2.可以用来实现更高级的运算,例如乘法、除法、移位等,只需将它们作为基本的运算单元即可。

3.可以用Verilog语言的特性,例如模块化、层次化、并发性、可综合性等,来进行设计和模拟,提高了开发的效率和灵活性。

这些模块的缺点有:

1.运算速度受到进位或借位的影响,每一位的运算都要等待前一位的进位或借位,导致了延迟和效率的降低。

2.运算精度受到位数的限制,如果运算的结果超过了位数的范围,就会产生溢出的错误,导致了结果的不准确和不可靠。

四、 结论

1.Verilog语言是一种适合用来描述和模拟数字电路的硬件描述语言,它有许多特性,例如模块化、层次化、并发性、可综合性等,使得它可以用来设计复杂的数字系统。

2.加法器和减法器是数字电路中的基本组件,它们可以对二进制数进行算术运算。本报告使用Verilog语言编写了一个位加法器(bit_add)和一个位减法器(bit_sub),并将它们组合成一个三位加法器(bit3_add)和一个三位减法器(bit3_sub)。

3.这些模块的优点是它们可以用来实现更高位的加法器和减法器,以及更高级的运算,而且可以利用Verilog语言的特性来进行设计和模拟,提高了开发的效率和灵活性。

4.这些模块的缺点是它们的运算速度受到进位或借位的影响,而且它们的运算精度受到位数的限制,如果运算的结果超过了位数的范围,就会产生溢出的错误。 

——本报告由电子科技大学 李发瑞同学撰写

多多点赞,多多支持,有不足之处请各位读者指出文章来源地址https://www.toymoban.com/news/detail-761556.html

到了这里,关于[FPGA]用Verilog写一个简单三位二进制加法器和减法器的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 【FPGA】Verilog:时序电路设计 | 二进制计数器 | 计数器 | 分频器 | 时序约束

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

    2024年02月02日
    浏览(62)
  • 【FPGA】Verilog:计数器 | 异步计数器 | 同步计数器 | 2位二进制计数器的实现 | 4位十进制计数器的实现

    目录 Ⅰ. 实践说明 0x00 计数器(Counter) 0x01 异步计数器(Asynchronous Counter)

    2024年02月05日
    浏览(57)
  • 用Verilog设计一个8位二进制加法计数器,带异步复位端口,进行综合和仿真。

    点此处编译 这里还需将rst置1才有效 可以在clk=0;后加rst=1; 或者在clk=0;后加rst=0; 并且在#DELY clk=~clk;后加#(DELY*20) rst=~rst; 仿真即可

    2024年02月04日
    浏览(45)
  • Verilog | 二进制与格雷码

    格雷码是一个叫弗兰克·格雷的人在 1953 年发明的,最初用于通信。格雷码是一种循环二进制码或者叫作反射二进制码。格雷码的特点是从一个数变为相邻的一个数时,只有一个数据位发生跳变,由于这种特点,就可以 避免二进制编码计数组合电路中出现的亚稳态 。格雷码常

    2023年04月14日
    浏览(39)
  • 【Verilog基础】二进制比较器

    1、1、一位数值比较器(是多位比较器的基础) 1、真值表: 2、由真值表推逻辑表达式: 3、逻辑电路:

    2024年02月05日
    浏览(50)
  • 【verilog】用七段数码管显示二进制编码的十进制数

    用七段数码管显示0~9,输入为四个信号,这四位二进制数表示十进制的0~9 图1 逻辑电路与七段显示器 图2 真值表 根据卡诺图,得出a~g的逻辑表达式: 硬件描述语言: 图4 代码编译成功 图5 电路图 图6 仿真波形 表1 端口管脚分配表 端口 使用模块信号 对应FPGA管脚 功能说明

    2023年04月25日
    浏览(58)
  • verilog实现二进制转BCD码-加3移位法

    BCD码用4位二进制数表示一个十进制数,最常用的BCD码是8421码,用4’b0000-4’b1001表示十进制数字0-9,接下来默认BCD码就是8421码。 在FPGA中使用数码管时,段选信号不好记,所以我们用BCD码表示一个数码管的数值,将BCD码转化为段选信号驱动数码管,数码管驱动可以这篇文章:

    2024年02月06日
    浏览(59)
  • FPGA实现二进制转BCD码

    bcd码:以4bit二进制码表示一个十进制码 例如,432(d) = 0100-0011-0010(bcd) 这里具体的判断方法为:(满5)加3法 二进制位宽为W,则BCD位宽只需要(W + (W - 4) / 3+1)位 FPGA Verilog实现二进制转BCD码 二进制数转换成BCD码的Verilog实现 modelsim仿真验证 至此,结束

    2024年02月13日
    浏览(59)
  • 【FPGA仿真】Matlab生成二进制、十六进制的txt数据以及Vivado读取二进制、十六进制数据并将结果以txt格式保存

    在使用Vivado软件进行Verilog程序仿真时可能需要对模块输入仿真的数据,因此我们需要一个产生数据的方法(二进制或者十六进制的数据),Matlab软件是一个很好的工具,当然你也可以使用VS等工具。 以下分别给出了使用Matlab模拟产生二进制和十六进制数据的例子,例子仅供参

    2024年02月01日
    浏览(60)
  • FPGA自学之路12(二进制转换8421bcd码)

    如图所示,先看原理。1110_1010对应的十进制是3位,所以bcd码有12位。先12位bcd全部取0,然后二进制码左移一位,从个位开始判断是否大于4,不大于4继续左移。大于4就加3(0011),然后再左移一位,然后再进行判断,直至所有二进制码全部左移完。 框图如下 这里输入的二进制码

    2024年02月11日
    浏览(53)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包