FPGA实现1位全加器和4位全加器

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

1、目的

1、基于Quartus件完成一个1位全加器的设计,分别采用:1)原理图输入 以及 2)Verilog编程 这两种设计方法。

2、在此基础上,用原理图以及Verilog 编程两种方式,完成4位全加器的设计,对比二者生成的 RTL差别;使用modelsim验证逻辑设计的正确性。

2、了解全加器:

1 1位全加器的真值表:

num1和num2是加数,cin是低位进位,cout是高位进位(我将其理解为溢出),sum是本位和

num1 num2 cin cout sum
0 0 0 0 0
0 0 1 0 1
0 1 0 0 1
0 1 1 1 0
1 0 0 0 1
1 0 1 1 0
1 1 0 1 0
1 1 1 1 1

2 输出公式:

sum=num1⊕num2⊕cin
cout=(num1⊕num2)* cin+num1* num2=(num1&num2)∣(num1&cin)∣(num2&cin)

3 原理图:

FPGA实现1位全加器和4位全加器,fpga开发

3、输入原理图实现1位全加器

1 创建工程项目

FPGA实现1位全加器和4位全加器,fpga开发

然后在出现的界面下先Next,填写工程的路径和名称,我这里创建的项目名称为full_add_1bit;然后接着Next,直到出现下面界面并进行相应操作。接着一路Next,直到Finish,完成工程的创建。
FPGA实现1位全加器和4位全加器,fpga开发

2 全加器原理图输入

点击File->New之后会显示如下界面,然后选择被方框框住的选项
FPGA实现1位全加器和4位全加器,fpga开发
然后就会进入到编辑界面,然后按照下面的步骤进行操作。input/output组件也是这样获得的
FPGA实现1位全加器和4位全加器,fpga开发

双击器件可以修改器件名称,为了之后的试验,将两个input分别修改为num1和num2,and2的输出为cout,xor的输出为sum。绘制出来的原理图如下图所示
FPGA实现1位全加器和4位全加器,fpga开发
保存文件(ctrl+s),并编译
FPGA实现1位全加器和4位全加器,fpga开发
等待编译完成之后就可以通过Tool->Netlist Viewers->RTL Viewer,来查看电路图
FPGA实现1位全加器和4位全加器,fpga开发

3 仿真实现

创建一个向量波形文件,File->New,然后选择“University Program VWF”
FPGA实现1位全加器和4位全加器,fpga开发
之后会进入到这个界面,然后按照图片中的步骤进入到信号添加界面
FPGA实现1位全加器和4位全加器,fpga开发
然后先选择Node Finder这个选项,然后再点击List,之后点击’>>',然后点击两次OK,就可以回到上面的那个界面,并且,此时信号也添加成功了。
FPGA实现1位全加器和4位全加器,fpga开发
添加成功之后的界面:
FPGA实现1位全加器和4位全加器,fpga开发
编辑信号:
FPGA实现1位全加器和4位全加器,fpga开发
编辑好之后先保存这个文件,然后点击功能仿真按钮(左边),结果:
FPGA实现1位全加器和4位全加器,fpga开发
时序仿真:
FPGA实现1位全加器和4位全加器,fpga开发
如果出现了错误,返回quartus界面,选择tool->launch simulation library complier进行配置。
FPGA实现1位全加器和4位全加器,fpga开发

4、Verilog实现加法器

1 创建并编写verilog文件

先创建一个verilog文件:
FPGA实现1位全加器和4位全加器,fpga开发

将代码复制到新建的verilog文件中,代码:

module full_add_1bit(   // 模块名和文件名相同,文件名和项目名相同
    num1, 
    num2,
    cin,
    cout, 
    sum,
);

input   num1;  // 加数
input   num2;  // 被加数
input   cin;  // 低位进位
output  cout;  // 向高位进位
output  sum;  // 结果

reg     sum;  
reg     cout;
always @(num1 or num2 or cin) begin
    sum = (num1 ^ num2) ^ cin;
    cout = (num1 & num2) | (num2 & cin) | (num1 & cin);
end
endmodule

2 查看生成的电路图

先将之前创建的电路图文件从项目中删除,也就是.bdf文件删除,否则会有报错。记得要把新建的verilog文件设置为顶层文件
然后进行编译,当编译完成之后就可以进行电路图的查看了。通过tool->Netlist Viewers->RTL Viewer进行查看。FPGA实现1位全加器和4位全加器,fpga开发

3 仿真实现

创建一个vwf文件,然后接下来的操作和之前的相同,就不再过多赘述。这里就直接给出仿真结果
功能仿真结果:
FPGA实现1位全加器和4位全加器,fpga开发

时序仿真结果:
FPGA实现1位全加器和4位全加器,fpga开发

5、拓展:4位全加器

1 4位全加器原理图

这里面使用的组件是封装的,如何封装可以参考:参考博客
FPGA实现1位全加器和4位全加器,fpga开发

2 仿真实现

先创建一个向量波形文件,然后将信号添加进去。这里的操作和前面几乎相同。我们直接看仿真结果:
FPGA实现1位全加器和4位全加器,fpga开发

6、Verilog实现4位全加器

思路

实际上四位全加器和一位全加器的差别并不是很大。我们以一个例子来解释,比如说:这里有两个数,分别是num1=0011,num2=1110。我们算的时候是从最后一位开始一直向前加:
num1的最后一位是1,num2的最后一位是0,两个相加得到01,所以sum的最后一位是1,没有进位;
num1的倒数第二位是1,num2的倒数第二位是1,没有低位进位,相加得10,所以sum的倒数第二位是0,向前进位为1;
num1的第二位是0,num2的第二位是1,低位进位为1,所以相加得10,sum的第二位为0,向前进位为1;
num1的第一位是0,num2的第一位是1,低位进位为1,所以相加得10,sum的第一位为0,向前进位为1;
所以,通过上面的步骤,我们可以得到sum=0001,向前进位cout=1。

1 创建文件,编写代码

先创建一个verilog文件,并将下面代码复制到文件中

module four (
    num1,
    num2,
    cin,
    cout,
    sum
);

input   [3:0]   num1;
input   [3:0]   num2;
input           cin;
output          cout;
output  [3:0]   sum;


reg             cout;
reg     [3:0]   sum;
reg             add;

always @(num1 or num2 or cin)
begin
    // 第一位
    sum[0] = (num1[0] ^ num2[0]) ^ cin;
    cout = (num1[0] & num2[0]) | (num2[0] & cin) | (num1[0] & cin);
    add = cout;
    // 第二位
    sum[1] = (num1[1] ^ num2[1]) ^ add;
    cout = (num1[1] & num2[1]) | (num2[1] & add) | (num1[1] & add);
    add = cout;
    // 第三位
    sum[2] = (num1[2] ^ num2[2]) ^ add;
    cout = (num1[2] & num2[2]) | (num2[2] & add) | (num1[2] & add);
    add = cout;
    // 第四位
    sum[3] = (num1[3] ^ num2[3]) ^ add;
    cout = (num1[3] & num2[3]) | (num2[3] & add) | (num1[3] & add);
    add = cout;
end
endmodule

2 查看电路

记得将verilog文件设置为顶层文件之后再进行操作
FPGA实现1位全加器和4位全加器,fpga开发

3 仿真实现

FPGA实现1位全加器和4位全加器,fpga开发

7、ModelSim验证4位全加器

1 创建源文件和testbench文件

源文件,four.v

module four (
    num1,
    num2,
    cin,
    cout,
    sum
);

input   [3:0]   num1;
input   [3:0]   num2;
input           cin;
output          cout;
output  [3:0]   sum;


reg             cout;
reg     [3:0]   sum;
reg             add;
reg     [1:0]   cnt;
always @(num1 or num2 or cin)
begin
    // 第一位
    sum[0] = (num1[0] ^ num2[0]) ^ cin;
    cout = (num1[0] & num2[0]) | (num2[0] & cin) | (num1[0] & cin);
    add = cout;
    // 第二位
    sum[1] = (num1[1] ^ num2[1]) ^ add;
    cout = (num1[1] & num2[1]) | (num2[1] & add) | (num1[1] & add);
    add = cout;
    // 第三位
    sum[2] = (num1[2] ^ num2[2]) ^ add;
    cout = (num1[2] & num2[2]) | (num2[2] & add) | (num1[2] & add);
    add = cout;
    // 第四位
    sum[3] = (num1[3] ^ num2[3]) ^ add;
    cout = (num1[3] & num2[3]) | (num2[3] & add) | (num1[3] & add);
    add = cout;
end
endmodule

testbench文件,four_tb.v

module four_tb ();
    reg     [3:0]     num1;
    reg     [3:0]     num2;
    reg               cin;
    wire              cout;
    wire    [3:0]     sum;

    four uut(
        .num1(num1),
        .num2(num2),
        .cin (cin),
        .cout(cout),
        .sum (sum)
    );
    initial
    begin
            num1 <= 4'b0000; num2 <= 4'b0000; cin <= 0;
        #10 num1 <= 4'b0000; num2 <= 4'b0000; cin <= 1;
        #10 num1 <= 4'b0101; num2 <= 4'b0001; cin <= 0;
        #10 num1 <= 4'b1000; num2 <= 4'b0100; cin <= 0;
        #10 num1 <= 4'b1111; num2 <= 4'b1111; cin <= 0;
        #10 num1 <= 4'b1100; num2 <= 4'b0100; cin <= 1;
        #10 num1 <= 4'b0011; num2 <= 4'b0000; cin <= 1;
        #10 num1 <= 4'b1111; num2 <= 4'b1111; cin <= 1;
    end
endmodule

2 创建ModelSim项目

打开ModelSim之后创建一个项目,将刚才创建的两个文件加入到项目当中。然后将文件进行编译,成功之后就可以进行进行验证了。

3 验证结果

FPGA实现1位全加器和4位全加器,fpga开发
如果要把每一种情况都进行测试的话肯定是不可能的,所以这里只测试几条数据,以验证程序逻辑的正确性。根据验算,这里的结果是没有问题的。

8、总结

总的来说,这次的试验还是比较简单的。相当于是熟悉一下这些软件和代码的编写。为之后的学习打下一定的基础。

9、参考

https://blog.csdn.net/qq_43279579/article/details/115480406
https://blog.csdn.net/m0_46653805/article/details/118736483文章来源地址https://www.toymoban.com/news/detail-753041.html

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

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

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

相关文章

  • FPGA编程入门——实现一位全加器

    FPGA编程入门——实现一位全加器

    然后通过4个1位全加器的串行级联,完成一个4位全加器的原理图设计;再改用 Verilog编程(3种模式:门电路、数据流和行为级描述),完成这个4位全加器设计,并观察Verilog代码编译综合后生成的 RTL电路,与之前电路图设计的4位全加器电路进行对比 。 如果仿真波形的逻辑功

    2024年02月04日
    浏览(10)
  • 【无标题】FPGA编程入门——实现一位全加器

    【无标题】FPGA编程入门——实现一位全加器

    1、首先基于Quartus 软件采用原理图输入方法完成一个1位全加器的设计。然后通过4个1位全加器的串行级联,完成一个4位全加器的原理图设计;再改用 Verilog编程(3种模式:门电路、数据流和行为级描述),完成这个4位全加器设计,并观察Verilog代码编译综合后生成的 RTL电路,

    2024年02月03日
    浏览(7)
  • 一位全加器及四位全加器————FPGA

    一位全加器及四位全加器————FPGA

    环境: 1、Quartus18.0 2、vscode 3、基于Intel DE2-115的开发板 全加器简介: 全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。

    2024年02月03日
    浏览(16)
  • FPGA基础——全加器

    FPGA基础——全加器

    全加器英语名称为full-adder,是用门电路实现两个二进制数相加并求出和的组合线路,称为一位全加器。一位全加器可以处理低位进位,并输出本位加法进位。多个一位全加器进行级联可以得到多位全加器。 一位全加器为例 Ain表示被加数,Bin表示加数,Cin表示低位进位,Cou

    2024年02月09日
    浏览(16)
  • FPGA面试题【Verilog实现一个2位带进位全加器,画出门级电路】

    FPGA面试题【Verilog实现一个2位带进位全加器,画出门级电路】

    目录 题目 核心思路 答案 FPGA全貌 Verilog实现一个2位带进位全加器,画出门级电路 思路见代码注释   第1节 什么是 FPGA FPGA 的全称为 Field-Programmable Gate Array,即现场可编程门阵列。 FPGA 是在 PAL、 GAL、 CPLD 等可编程器件的基础上进一步发展的产物, 是作为专用集成电路( ASI

    2024年02月08日
    浏览(19)
  • 【FPGA】如何理解全加器

    【FPGA】如何理解全加器

    半加器 比较容易理解,它的电路指对两个输入数据位(a、b)相加,输出一个结果位(sum)和进位(cout),但没有计算进位输入的加法器电路。 输出表达式 相比半加器, 全加器 是将低位进位输入也代入计算的加法电路,同样输出一个结果位和进位。1位全加器就是计算带进

    2024年02月05日
    浏览(10)
  • FPGA—基于Quartus软件设计全加器

    FPGA—基于Quartus软件设计全加器

    本篇博客主要是基于Quartus软件件完成一个1位全加器的设计,分别采用:1)原理图输入 以及 2)Verilog编程 这两种设计方法。开发板基于Intel DE2-115。 1、半加器 1、定义: 半加器是能够对两个一位的二进制数进行相加得到半加和以及半加进位的组合电路。 2、真值表: A,B表示

    2024年02月06日
    浏览(14)
  • FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?

    FPGA:什么是半加器?什么是全加器?多比特数据相加怎么求?如何用面积换速度?

    在FPGA中计算两个数据相加和C语言中的加法不太一样,在FPGA中是二进制相加,要考虑数据的进位、数据时单比特还是多比特,数据若位宽过大引起的时延该怎么解决,本文就对以上问题进行梳理 另外我想挖个新坑,把HDLBits中的内容整理一下,就从加法器进行入手,等写好了

    2024年02月03日
    浏览(13)
  • FPGA编程入门——基于Quartus件完成一个1位全加器的设计

    FPGA编程入门——基于Quartus件完成一个1位全加器的设计

    基于Quartus件完成一个1位全加器的设计,分别采用:1)原理图输入 以及 2)Verilog编程 这两种设计方法。开发板基于Intel DE2-115。 在此基础上,用原理图以及Verilog 编程两种方式,完成4位全加器的设计,对比二者生成的 RTL差别;使用modelsim验证逻辑设计的正确性,并在DE2-115开

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

    【FPGA】Verilog:模块化组合逻辑电路设计 | 半加器 | 全加器 | 串行加法器 | 子模块 | 主模块

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

    2024年02月15日
    浏览(12)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包