基于FPGA的查表式运算器的设计与仿真

这篇具有很好参考价值的文章主要介绍了基于FPGA的查表式运算器的设计与仿真。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

摘 要

随着我国的经济的发展,人们要求计算的方法更好简单和方便,尤其是在计算这个方面,所以对于运算器的设计是非常的重要的,所以为了更好的设计该设计采用了现场可编程逻辑器件FPGA设计,并基于硬件描述语言VHDL在Altera公司的Quartus Ⅱ软件上实现仿真。系统由计算部分、存储部分、显示部分和输入部分四个部分组成,计算部分为加法器、减法器、乘法器和除法器,存储部分需要3个存储器来实现:内部累加器(acc)、输入寄存器(reg)以及结果暂存器(ans)。显示部分由四个七段译码管组成,分别来显示输入数字,输入部分采用外接键盘,由0—9十个数字按键,加减乘除四个运算符按键,一个等号按键和一个清零按键组成的。通过外部的按键可以完成四位数之内的 ‘加’、‘减’、‘乘’、‘除’四种功能运算,其结构简单,易于实现。

关键词:FPGA;VHDL;计算器

Abstract

  This article describes the design of a simple calculator, the design uses Field Programmable Gate Array FPGA based on VHDL hardware description language to design and Altera's Quartus Ⅱ in software for emulation. This system is componentted by the calculation section, storage section, display and input section of the four parts, the computing part include adder, subtractor, multiplier and divider,Storage part needs three memory to help achieved: internal accumulator (acc), input register (reg) as well as the results of registers (ans). Display part is made up three decoder of 7 sections, respectively to show the number of input. Input part has ten number keys, from 0 – 9, also has addition and subtraction and multiplication and division arithmetic operator keys, a button and of equal sign and the clear key. Buttons can be done through external within the four-digit 'add', 'subtract', 'multiple', 'divede' the four kinds of functional operations, its structure is simple and easy to implement.

Key words:FPGA;VHDL;calclute

目 录

第一章 引言 1
1.1 课题研究的目的与意义 1
1.2 国内外发展现状 1
1.3课题的主要技术路线 2
第二章 FPGA技术及硬件描述语言 3
2.1 FPGA技术的发展现状及与CPLD的比较 3
2.2 FPGA设计方法 5
2.3 利用硬件描述语言(HDL)的硬件电路设计方法 6
2.4 VHDL语言的特点 7
2.5 Quartus Ⅱ概述及其设计流程 7
第三章 系统总体设计 10
3.1 计算器的计算部分 10
3.2 计算器的存储部分 10
3.3 计算器的显示部分 11
3.4 计算器的输入部分 12
第四章 计算器的VHDL设计 14
4.1加法器的设计与仿真 14
4.2减法器的设计与仿真 15
4.3乘法器的设计与仿真 16
4.4 除法器的设计与仿真 18
第五章 结束语 20
参考文献 21
附 录 22

第一章 引言

1.1 课题研究的目的与意义
在人类学会买卖的时分,计算也随之爆发,而算盘成为计算最适用的工具存在了几千年。算盘也叫珠算,是中国人民发明的一种计算用具,古代时有“中国的计算机”的称号。算盘产生在我国汉代的前期,是由古代的“筹算”演化变成的,珠算这个词语,最早出现在汉末的三国演义时代的徐岳撰的《数术记遗》里,有一句叙述“珠算,控带四时,经纬三才”是出自出本里的。《乘除通变算宝》是南宋数学家杨辉的,里面有“九归”的口诀,刘因是元代人,也作了一首算盘的诗句,吴敬是明代人,他的的《九章详注比类算法大全》里写有珠算的大部分有关算法。在明清的时候,人们对算盘的运用就非常多,而对于算盘的制作大小,明万历年间的柯尚迁写的《数学通轨》里记载了13档算盘的图片,上有2珠,下有5珠,样似长方形,四周都是木框,里面有一个轴心,人们都叫作“档”,档的中间是用一根横木来分隔开来,运算的时候在确定位置后拨动珠字来进行计算。起初出世的每一种规格的算盘,全部在这个基础上发展起来。算盘的结构铸造十分简单,不仅便于掌握,而且使用的时候也很便利,它变成了计算和理财不能缺少的其中一种工具。算盘的传入是从明代开始,它来自朝鲜和日本等一些国家。清代的时候算盘根据经济和文化的交流被传进东南亚每个国家,在第二次世界大战结束后,美国在日本引入了一些算盘,看得出来算盘在现代人的生活里拥有非常重要的作用,无论是大商人或者是小商人都会通过运用小算盘来计算。不过根据人类文明的发展与现代科学技术的一直进步。算盘慢慢变成越来越不能满足一部分高强度和高难度与高速度的非常复杂的一种计算。就在这时,一种新型的电子类产品出世了,我们都叫它电子计算器。电子计算器是一种跨越了一个时代的伟大发明,比其算盘来,它的计算速度要快几百甚至几千倍,电子计算器的计算的结果也要比算盘更具精确度,它操作得非常方便,容易学会,它的计算的范围非常广泛,而且很灵巧,便于携带出门。电子计算器已经变成现代人生活中不可减少的计算用器,它给我们的生活带来了很大的便利。并且根据计算机的流行,更多的人在运用计算机,更多的工作都和计算机密不可分,也就是说计算机慢慢变成现代社会中不可缺少的计算用具,并且电子计算器拥有的功能也通过软件的形式使用到计算机里的软件世界里,它不仅给人们带来了很大的便利,还为现代人提供了更迅捷的计算速度,缩短了计算时间,和具有非常强大的运算功能。
1.2 国内外发展现状
(1)国外情况
如今在国外,集成电路出世后,电子计算器只用仅仅几年功夫就达成了一种技术发展,通过猛烈的市场竞争,如今的计算器技术就非常成熟。计算器已渐渐地脱离原本的“辅佐计算工具”的功用定位,正往着多功能化和可编程化的目的发展,在各个范围都得到了普遍的使用。计算器不但能够完成各种各样复杂的数学计算还能够来编制和运行程序,方程组也可以用来解决,图形计算器也能用图形解决。计算器的一些内置软件也容许用户使用一些类似于对计算机的文件与目录管理等操纵,同意用户自行定制图形界面,此时每一种新的技术也被使用到计算器里让计算器功能更加强大。也就是说,电子计算器也能被称为“微微型”的计算机。
(2)国内情况
在国内,有厂商也使用计算器芯片来发明新的产品,不过针对计算器技术的钻研和计算器的芯片的设计现在还是起步的阶段。“计算”是计算机的最主要公用,我们可以把它叫做“低档计算器”。就算是关于这种计算器,大部分厂家和商人也仅仅工作在组装计算器和销售的业务。一部分IC设计公司和芯片的供应商人也开始慢慢钻研和学习计算器技术。
1.3课题的主要技术路线
这次实验是做基于现场可编程逻辑器件FPGA来进行设计,不仅是运用了硬件描述语言VHDL,还编程,并且在Altera公司的Quartus Ⅱ软件上完成了仿真。我们还必须实现进行计算器的一部分常用到的运算功能,经过外接键盘输入、LED数码显示来达到和完成运算目标。

第二章 FPGA技术及硬件描述语言

2.1 FPGA技术的发展现状及与CPLD的比较
(1)FPGA技术的发展现状
FPGA是把英文Field Programmable Gate Array的缩写,也就是现场可编程门阵列,它是在CPLD和GAL与PAL等可编程器件的根本上更深入发展的产物。FPGA是作为专用集成电路(ASIC)领域中出现的的一种半定制电路,不但处理了定制电路的缺乏,还克服了原本存在的可编程器件门电路数有限的几个缺点。
FPGA使用了逻辑单元阵列LCA(Logic Cell Array)这个概念,它还包含可配置逻辑模块CLB(Configurable Logic Block),输入输出模块IOB(Input Output Block)和内部连线(Interconnect)三个内部局部。FPGA的基本特点主要有:
ⅰ.采纳FPGA设计ASIC电路,用户不需要投片消费,就能获得合用的芯片。
ⅱ.FPGA能做其它全定制或者半定制ASIC电路的测试样片。
ⅲ.FPGA内部有丰富的触发器和I/O引脚。
ⅳ.FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。
ⅴ.FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。
RAM中的程序是用来设置FPGA工作状态的,它存放在片内RAM的程序里,因而,工作时就得对片内的RAM进行编程。用户也能随着不同的配置方式,使用不同的编程方法。加电时,片内编程RAM被FPGA芯片读入一些EPROM中的一些数据,在配置完成后,FPGA就进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因而,FPGA能使用很多次。FPGA的编程不需要专用的FPGA编程器,只要通用的EPROM、PROM编程器就可以。当必要改正FPGA性能的时候,只要换一片EPROM就可以了。同一片FPGA,不同的编程数据,能够发生差别的电路性能。因而,FPGA的运用十分灵便。
FPGA和DSP处理器还相对应,尽管DSP处理器速度非常快,还对许多DSP运用来说很有用,不过还有一些应用要求功能需要再一步提高,而且FPGA还提供了更高的功能。FPGA能够生成一个定制硬件设计,控制逻辑可以实现在硬件中,不用再使用精确的时钟周期来实现控制功用。另外,经过缩小硬件的框架,FPGA还能够供应额定的功能。假如,速度是最关键的设计思考原因,这样一来我们能够在FPGA中设计一个齐全并行的算法解决方法。如今,诸多系统都包含了一个FPGA,用于胶合逻辑和协议转换或者一些其它系统功用。假如,那FPGA没有被全部运用,那可以把DSP功能加入里面,能够为系统节省一部分成本。并且假如标准产生了一些变化,FPGA的运用就不会有一切风险。FPGA的配置文件可以升级,就像一个软件一样,虽然它们必需被存储在系统的非易失性存储器中。
目前,FPGA设计的设计方法,通常使用的是Top-down(自顶向下)。系统被分成各个功能子模块,在系统级层次上使用行为描述,再对这些子模块进一步使用行为描述。
(2)FPGA与CPLD的比较
FPGA简要称呼叫现场可编程逻辑门阵列,它是电子设计的一个里程碑。CPLD的简要称呼叫复杂可编程逻辑器件。虽然FPGA和CPLD一起都是可编程ASIC器件,有很多共同特性,但由于CPLD和FPGA构造上的差异,具备各自的特性:
1…CPLD更合适实现各种算法和组合逻辑,FPGA更合适在完成时序逻辑。换个说法, FPGA更合适在触发器丰富的构造,而CPLD更合适在触发器有限且乘积项很丰富的构造。
2.这种形式的集成度是非常的高的,并且它内部的结构和逻辑性也是非常的好的,受了广大的电子器件儿人们的喜欢。
3.运行的速度比现在业界上最快的DSP芯片还要快,是非常的快的。
4.在这种形式的使用方面,他也是非常的好的,她没有外部的存储芯片,使用着操作起来也非常的简单。
5.这种芯片它的运行的速度也是非常的快的。能在很多的时间真之内运行出来很多的程序使用度非常的高。
6.在编程方面可编程度是非常的好的,通过这些 程序员可以把自己的程序写错时他可以随意的进行改正的,并且这种部件儿在运行的过程中中如果在断电的时候里边存储的信息也不会丢失他能更好地去保存出来功能是非常的强大的
2.2 FPGA设计方法
在这个软件进行设计是中号,他有很多的规则,如果成员更好地掌握了这些规则,他能够使用起来非常的方便,他并且是功能非常的强大的更好的去运行程序。
我们知道应下系统对于一个系统来说是非常的重要的,它可以根据重新进行实现功能,它通常是欲望算法来实现的。又要能够让每个各部件都能更好地实现出什么工程?
2从系统方面分析它可以加上哥哥模块儿进行组合起来,让哥哥摸罐进行时间他索要要求的工程,并且它对要求高频率会红,夜宵的模块儿更加的实用。但是对于功能比较强大的模块儿它也能更好地使用,有利于程序进行设计和实现。
3这个系统运行的速度是非常快的,他每秒钟能时间3000万。非常的方便与实用它的体积是非常小的,能融合到各个单片机中旭能配合好,单片机更好的去工作。他的工作效率也是非常的高的不能和任何程序,静静充足,他的准确性高,受到了广大程序员的喜欢。由于它的芯片是非常的小的可以更好的切入到单片机中,去辅助单片机更好的进行工作。
4同步说句在这方面也是非常的重要的他能跟工程同步到这个程序运行起来,这个功能也发挥着巨大的作用,它同步的效果是非常的高的。有趣的是,在师宗方便它的经文确定也是非常的准的。老婆更好的去采集数据,这样把台积出来的,输液更好的分析出来,得到结果然后配合系统去执行相关的木命令把几个模块儿更好的整合出来。
2.3 利用硬件描述语言(HDL)的硬件电路设计方法
硬件儿的编程的语言是非常的重要的,可以通过这一个语言让硬件儿和硬件进行交流,明白这个硬件发出了是什么命令,并且配合区执行其他相关的命令,好比也是,人和人之间的说话,它能更好的去沟通了解人所能表达出来的意思应该是家的语言,他也是这样的,这个软件所采用的语言是VACdAC于二这种雨呀功能是非常的强大的收到了国代变成舍得,喜欢接下来我介绍这桌描述语言的几个特点,他们是怎么更好地辅助电路去工作的。
1他的方向二是自上向下的,这样有利于编程语言的能够一步一步的进行,实现功能是非常的方便的。
2由于我国制作芯片的厂家是非常的多的,他们所使用的软件都可以支持这种H直接一次语言,所以这种语言在适应很多种软件,硬件的设计人员也非常喜欢这种语言,因为他是用都非常的大,并且体积小,更容易切入到单片机中去,能够更好的企业设计,并且更加的合理。店家收到了很大的设计人员的喜欢。
3这种软件还能够更好的进行仿真,通过仿真能知道这些程序实现的是什么功能,并且对每个功能进行详细的分析。更好地找到错误,并且。开发出来的功能,大大的提高了工作的效率。也降低的硬线使用的频率。难度使广大的硬件设计人员喜欢她也大大的提高了工作的效率这种啊,软件是非常的好的。
5他的设计文件是用这种语言编写的源程序通过这种现象可以看出这种。语言要挂房子是用在哥哥方面。通过用这种程序编程出来,然后发站出来电路图,通过这些电路图可以更好的找到解决的方法,知道什么地方是错误的,并且能在很多的时间进行改正出来,收到了过完那的营销人员咋喜欢这种方式也更加方便。硬件设计人员去阅读它,去了解它。一眼就能看的出来,这个程序编程有什么问题,有什么优点可以方便去改正。
2.4 VHDL语言的特点
VHDl与安生非常的厉害的,受到了广大硬件人员的喜欢它的结构非常的严谨,操作起来也非常的简单,所以受到了硬件人员的喜欢,接下来我解详细的介绍它的急个特点,他是怎么更好地辅助硬件系统进行工作的,她不要和其他的硬件语言一样。他大范围也是非常大的功能也是非常的大的,超过了其他软件的编程语言,他比Java更佳的简单,比C语言更加的强大,所以很多的硬件设计人员喜欢用它。在这个编程的语言中,他还可以创造出来很大的系统,有些事在变成函数的时候我们都知道变成函数是非常复杂的,但是用这种语言进行编程式分享的,简单的他能够很准,在很短的时间进行月行把自己想要表达的函数进行表达出来。不用写这种语言能够随时的调用其他模块儿的内容,他的衔接,都是非常的好的,能与哥哥麽会进行交通和沟流,就向人和人进行语言交流一样,当一个软件的我被发射出命令的时候,另一个软件模块进行接收,他能更好地读懂它,是什么的意思,能够去执行这项任务。所以说他的工程师非常早,强大的受到了很多硬件人员咋喜欢他们,非常喜欢用这种程序语言去进行编程。这种编程语言是相互独立的,他能更好的和其他的语言进行区分。不会受到任何变成语言的。干扰能够更好地掌握编程的准确性。这种语言的生命周期是非常的长的,她不会随时对软件的更新而改变错误,他从开发到现在已经有了80年的历史,在这个历史的演变的过程中,经过不断的开发和演变,他慢慢的成长起来,受到了广大程序人员的喜欢。。
2.5 Quartus Ⅱ概述及其设计流程
这种软件是非常高智能的,它能够对图形以及视频进行方进行演示,并且把所有的程序。进行仿真出来很好的发现出什么地方出现问题,并且它出它运行的速度是非常的快的使用的街面也是非常的简单的适用于初学者的使用。
这种软件是由德国科学家西门子洛夫斯基研发出来的,他刚开始研发这款软件的时候,就是为了解决编程的问题,在他不断的努力进行研发的过程中,终于研发出来了,这款软件这种国产软件的工厂是非常的强大的,受到了广大人们的喜爱。并且这种软件的设计逻辑已设计环境都是非常简单的,并且工程非常的强大,能够使使用者一眼就能看的出来他具有什么作用,能够让使用者更好地进行操作。并加他运行的环境可以支持多种环境,避免了单一的环境给程序员带来的烦恼。他的编程的能力也是非常的大的,通过编程,它可以运行出来程序所要显示的功能大大的提高了调试的能力,并且支持很多的插件儿直接插垫是用来干什么的,这些插件儿主要的增加了软件的功能,比如画图仿真或者是语言或者是视频这种功能都是非常的气。非常的强大的,受到了硬件儿变成语言的喜欢,所以这种软件是越来越流行的。
2接下来我就想起咋去设计这款软件怎么进行设计的流程,怎么去运营它,首先要在这个软件上建立新的工程,你把这个工程建立好了就跟把自己要建立的项目进行合理的去命运了,给自己的项目起一个名字,这个名字命名的时候一定要以英文字母去开头,因为这款软件是y。是外国人进行设计的,一定要遵循这种命名的方法,等我们建立了这个。工程之后就应该选择自己所需要的模块儿,在这个软件中他的魔罐是非常的多的,咱们使用起来也非常的简单和方便。根据子,我们的需要进行选择模块儿,并且知道每个模块儿之家。有什么作用的充分的利用他们的作用进行变成这样,能够更好的去分析和发现变成中出现的错误能够更好地改正出来,当我们运行的过程中就进行编译,编译出是不是他们有错误,是不是能够正常的进行编程,编程也是非常的重要的,通过编程我们能知道我们所。说做创的程序是不是能够正常的演示出来,如果能演示出来,我们就能够发现我们做出来的程序所要表达的功能是不是和我们所要表达的功能是不是一样及时的发现问题并能更好的及时的去解决问题,这样是非常的好的。仿真的时候一定要知道网络是不是正常的连接,如果网络不能正常的了。了解就需要及时的改正仿真,所以说是非常的重要的,一定要记住自己文件的扩展名要合理的运用这种扩展并如果扩展名错误了这种仿真也不能够更好的防震出来,他们会出现很多的错误。如果仿真的时候出现了错误,这个软件会出现很多的代码,他说他能够告诉你。是什么地方出现错误,他能方便的,告诉你什么地方出现了错误之后你能更好地发现问题更好的去解决问题。

第三章 系统总体设计

系统总体设计框图如图3.1所示。此设计由计算部分、存储部分、显示部分和输入部分组成。
基于FPGA的查表式运算器的设计与仿真,java,java

图3.1 计算器的系统组成框图
3.1 计算器的计算部分
接下来我们就分些这个计算机也得计算的不稳,他是怎么通过计算的方式进行计算的,他是一般是通过八杯或者四杯的20斤是进行计算的我们都很熟悉这种语言,并且用这种VHDl语言进行把这种程序更二的解决出来更好的预算装出来具体的算法,我们上面都跟网的。据介绍了,他不能进。进行人也数的除法,但是他能够更好的进行任意数的加法,减法,这都是没有任何问题的,他能更好地进行继续计算,所以工程是非常的强大的。
3.2 计算器的存储部分
我们都知道计算器的存储不分是非常的重要的,他主要有三个存储蓄业去实现它计算的工程。在做Java的时候,他使用的是内部累加器侄儿个累加器能够更好的进行加法的运算,输出寄存器也是能够更好地去存储相关的叙述句,将这些数据进行更好的及存储能够更好的进行运算。结果在实际也是非常的重要的可以把结果暂存器进行合理的运用起来,让上面相加的结果进行存著,然后再进行的加减乘除,这样都是非常的好的,非常的快的。
3.3 计算器的显示部分
我们都知道计算出来的结果,一定要显示在屏幕上,我们用的屏幕是Fede的屏幕,这种屏幕功能是非常的强大的,能够非常更好的显示图形以及声音的制作他需要的是BCD码,这种BCD吗?是非常的好的,能够把自己的编译的程序在这儿款软件中更好的实践,他是通过高低电平去控制数码管儿的阴阳两极。能够更好的分析数字进行加减乘除方便,运算编程的程序,也是非常的高的,所以受到了广大程序人员的喜欢。七段译码器的基本结构如图3.2所示。

基于FPGA的查表式运算器的设计与仿真,java,java

图3.2 七段译码器的结构
通过查阅大量的数据我们可以得出以下的代码,并且能够更好的去实现功能,WITH indata SELECT
outdata<=“0111111"WHEN"0000”, --0的显示;
“0000110"WHEN"0001”, --1的显示;
“1011011"WHEN"0010”, --2的显示;
“1001111"WHEN"0011”, --3的显示;
“1100110"WHEN"0100”, --4的显示;
“1101101"WHEN"0101”, --5的显示;
“1111101"WHEN"0110”, --6的显示;
“0000111"WHEN"0111”, --7的显示;
“1111111"WHEN"1000”, --8的显示;
“1101111"WHEN"1001”, --9的显示;
“0000000"WHEN OTHERS; --其它的输入按键均不显示。
计算器显示部分的设计和实现,实际上就是七段译码器的设计和实现,三个七段译码器分别显示的是个位、十位和百位。输入第一个数字后至再一次按下数字按键输入第二个数字前,三个七段译码器显示的都是第一个数字。当开始输入第二个数字的时候显示第二个数字,再次按下运算按键到输入第三个数字前,显示的是前两个数字的运算结果,以此类推,当最后按下等号键的时候,显示最终的运算结果。
3.4 计算器的输入部分
在我们很小的时候就已经接触了计算器了,我们都知道计算器上的数字的一般都是都是10个数字,通过这十个数字不断的阻隔进行累加或者累,除了都能可以计算如何我们想要的结果通过我们人为的思想去控制的,他应该怎么去进行计算,并延最终的。结果会显示到我们想要的屏幕上,具体的代码就是。
PROCESS(inclk,reset)
BEGIN
IF reset='1’THEN --异步复位信号为高电平的时候
outnum<=“0000”; --把“0000”赋值给数字的输出端口
ELSIF inclk’EVENT AND inclk='1’THEN
CASE innum IS
WHEN"0000000001”=>outnum<=“0000”;outflag<=‘1’;
–按下一个键表示输入为0
WHEN"0000000010"=>outnum<=“0001”;outflag<=‘1’;
–按下第二个键表示输入为1
WHEN"0000000100"=>outnum<=“0010”;outflag<=‘1’;
–按下第三个键表示输入为2
WHEN"0000001000"=>outnum<=“0011”;outflag<=‘1’;
–按下第四个键表示输入为3
WHEN"0000010000"=>outnum<=“0100”;outflag<=‘1’;
–按下第五个键表示输入为4
WHEN"0000100000"=>outnum<=“0101”;outflag<=‘1’;
–按下第六个键表示输入为5
WHEN"0001000000"=>outnum<=“0110”;outflag<=‘1’;
–按下第七个键表示输入为6
WHEN"0010000000"=>outnum<=“0111”;outflag<=‘1’;
–按下第八个键表示输入为7
WHEN"0100000000"=>outnum<=“1000”;outflag<=‘1’;
–按下第九个键表示输入为8
WHEN"1000000000"=>outnum<=“1001”;outflag<=‘1’;
–按下第十个键表示输入为9
WHEN OTHERS=>outnum<=outnum;outflag<=‘0’; --不按键时保持
END CASE;
END IF;
END PROCESS;
我们都知道,在这次设计中,程序是非常的重要的我们就只应该让他怎么去判断怎么输入我们想要的时候最一般都是零到九这几个数字,我们可以通过高低电平需要更好的去控制,并且怎么进行下降,成熟后也应该用高级电瓶骑更好的控制,这样才能更好的去实现这个电路这个程序的功能的实现,所以。这个任务是非常的艰巨的我们应该详细的去分析和了解。输入和输出之间的关系。

第四章 计算器的VHDL设计

4.1加法器的设计与仿真
我们都知道,同学已经设计好了,就应该还这样拖过好深的形式能够更好的分析如何,这个程序是什么地方发生了错误,并且能够及时的让程序员是及时的改正出来。本文设计的这个预算系行他就是能实现加法的运筹,并且能够让很多时候进行解相加,相加之后能够更多的显示在屏幕上,并且这个怨气的。运行的速度是非常的快的能够占有很多资源,本文所涉及的环节也是非常的少的非常的简单和职别嗯,能让很多的人能够看明白这件事情是怎么运行的。我通过了改革,还和改正啊,提高了运算速率的效率,并且占有的资源是非常的少的,能够更好的提高运输运算的速度能够很快的让程序运行起来。这个效果是非常的好的,所以这个设计是非常的成功的。接下来我就要详细地介绍这个家法机械的原理是什么原理,他就是加数和被加数啊,要相加,然后并且显示出来的结果,运算到我们所需要的屏幕上能够让使用过的客户更好地知道他的加法的结果是多少,只要更好的去分析了加法的运算的过程能够更好的让我们把基础。如果报道时加的应用过程中用去非常的好。加法器的原理框图如图4.1所示。
基于FPGA的查表式运算器的设计与仿真,java,java

图4.1 加法器的原理框图
接下来,让我详细的去分析这个程序运行的过程,他是加数和被加数进行相加,并且个位和十位,百位,千位都是相对应的他们进行相加之后嗯进行四舍五入的方法进行总结出来的结果,并且把结果。想知道我们所要需要看到的显示的屏幕上去,这样更加的直观而和现实的让我们了解加法的结果。详细的预算的程序假,我们论文的目录。巨体的法阵的效果如何?下图所示他能够更好的让我们分析十六进制和八进制的区别,他们是金怎么进行运算出来的,通过这种形式能够让我们通过仿真的方式进行分析和验证最重要,我们可以得出仿真的结果是正确的,我们终于成功的设计出了加法运算器非常的成功。

基于FPGA的查表式运算器的设计与仿真,java,java

图4.2 加法器仿真16+176=192
4.2减法器的设计与仿真
上文我们已经介绍了加法的运算器的运行的原理。接下来我们就介绍减法的运算器的原理,其实加法的运算器的原理和减法运算器的原理都是相通的,它们都是一样的,都是通过数字与数字进行相减个位和个位小姐十位和十位小姐,千位和千位相间,直接将运算的结构显示到我们想要。这是非常的简单的也是非常的靠谱的,具体的流程图,原理图,如下图所示。
基于FPGA的查表式运算器的设计与仿真,java,java

图4.3 四位全减器的原理框图

基于FPGA的查表式运算器的设计与仿真,java,java

图4.4 减法器仿真15-9=6
4.3乘法器的设计与仿真
乘法的运算器是非常的难以解决的他所需要的步骤也是非常的多的,他需要左移一位右移一位通过移位的方式去实现相关的单位的运算这种原理是非常高度,并而且在我我设计的时候出现而来很多的问题,在我设计的过程中遇到了很多的问题,并且进行对问题的总结,最终得出了乘法运算器的原理的框图如图所示。

基于FPGA的查表式运算器的设计与仿真,java,java

图4.5 乘法器的原理框图

图4.6 乘法器仿真 13*10=130
4.4 除法器的设计与仿真
除法的运算器是非常的难以解决的他所需要的步骤也是非常的多的,他需要左移一位右移一位通过移位的方式去实现相关的单位的运算这种原理是非常高度,并而且在我我设计的时候出现而来很多的问题,在我设计的过程中遇到了很多的问题,并且进行对问题的总结,最终得出了乘法运算器的原理的框图如图所示。
基于FPGA的查表式运算器的设计与仿真,java,java

图4.7 除法器的原理框图
通过我上我们上面知道了,除法运算器的工作原理,通过这样我们能够更好的去分析和验证,反正他们并且对我们验证的仿真结果进行了实力的验证,发现没有任何的问题,他是非常的正确的,所以这次的实验是非常的成功的。最低的,仿真的结果如下图所示。

基于FPGA的查表式运算器的设计与仿真,java,java

图4.8 除法器仿真 148÷13=11……5,22÷13=1……9

第五章结束语

通过这次论文的设计和研究,我从刚开始是不知道怎么去做,我刚开始做这个题目的时候头是晕晕的慢慢的通过我问同学问老师慢慢的有了一点的思路,知道自己应该怎么去做。首先我通过在网络搜索的过程中找到了我的论文设计的基本的框架,然后在一点一点的进行摸索,再通过在网络上查阅大量的资料,进行丰富框架里边的内容,有不懂得再进行通过问同学和老师的方式进行找到解决的方案,最终我成功的完成了我的论文的设计,当我真正的完成这个论文我真正感觉到了人生中什么是成功,我只能对我的老师和同学说一句话,真的很感谢你们,我也非常感谢我的导师是他在我的背后默默的支持,再给我打进鼓励我才能把这个论文设计做了出来。从做这个论文设计的过程中我经历了很多的困难。我真正的认识的基础知识是非常的重要的,我们必须应该把自己的理论融合到实践的过程中去,这样才能使实现和理论更好的去结合,才能更好的把自己的基础知识打牢。
通过我这一次能够顺利地完成论文,我非常要感谢的一个人,是我的导师。在这个论文的设计的过程中,是他耐心的为我讲解。在我不懂的时候也是他在为我讲解。他没有任何的反感对我非常细心的给我讲解,我应该怎么去做。与此同时,我还应该感谢我们学院的各位领导,是他们在我的大学四年对我的无微不至的关怀,我才能有今天的成就。非常的感谢他们,也是,他们给了我这一次难得的机会,让我真正的踏入了社会,真正的用自己所学的理论,根据自己大学四年所学的理论知识完成了一篇具有理论意义的学术论文。在其中的过程中,我也学会了很多的事情,面对困难,我不应该退缩,应该勇往直前,因为一旦退出,就注定失败,只有坚持不懈的去努力,才能够成功。

参考文献

[1]崔葛瑾,沈利芳,李伟民.基于FPGA的数字电路系统设计[M].西安:西安电子科技大学出版社,2008年.
[2]王彦.基于FPGA的工程设计与应用[M].西安:西安电子科技大学出版社,2007年.
[3]黄智伟.FPGA系统设计与实践[M].北京:电子工业出版社,2005年.
[3]江思敏.VHDL数字电路及系统设计[M].北京:机械工业出版社,2006年.
[5]卢毅,赖杰.VHDL与数字电路设计[M].北京:北京科学出版社,2001年.
[6]潘松,黄继业.EDA技术实用教程[M].第二版.北京:科学出版社,2005年.
[7]徐志军,徐光辉.CPLD/FPGA的开发与应用[M].北京:电子工业出版社,2002年.
[8]陈育人.8 位计算器的指令系统与硬件结构[J].微电子技术,2000年,第28卷第3期.
[9]王冬冬.基于FPGA的浮点运算器设计.万方数据,
HTTP://d.g.WANGFANGDATA.com.CN/Thesis_Y1548067.ASPX.
[10]王树国.科学计算器的大规模集成电路芯片设计.万方数据,
HTTP://d.g.WANGFANGDATA.com.CN/Thesis_Y722644.ASPX.

附 录
附录A:源程序
4位二进制并行进位加法器的源程序ADDER4B.VHD如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER4B IS
PORT(ci:IN STD_LOGIC;
a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
co:OUT STD_LOGIC
);
END ADDER4B;
ARCHITECTURE behave OF ADDER4B IS
SIGNAL SINT:STD_LOGIC_VECTOR(4 DOWNTO 0); --类似于在芯片
–部定义的一个数据
SIGNAL aa,bb:STD_LOGIC_VECTOR(4 DOWNTO 0);
BEGIN
aa<=‘0’ & a; --拓展位数,使其成为最高位
bb<=‘0’ & b;
SINT<=aa+bb+ci; --相加
s<=SINT(3 DOWNTO 0);
co<=SINT(4); --最高位为输出进位位
END behave;

顶层模块:8位二进制并行进位加法器的部分程序ADDER4B.VHD如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY ADDER8B IS
PORT(ci:IN STD_LOGIC;
a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
b:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
s:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);
co:OUT STD_LOGIC
);
END ADDER8B;
ARCHITECTURE a OF ADDER8B IS
COMPONENT ADDER4B --引用4位二进制并行进位加法器
PORT(ci:IN STD_LOGIC;
a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
co:OUT STD_LOGIC
);
END COMPONENT;
SIGNAL CARRY_OUT:STD_LOGIC;
BEGIN
U1:ADDER4B
PORT MAP(ci=>ci,a=>a(3 DOWNTO 0),b=>b(3 DOWNTO 0),s=>s(3 DOWNTO 0),co=>CARRY_OUT);
U2:ADDER4B
PORT MAP(ci=>CARRY_OUT,a=>a(7 DOWNTO 4),b=>b(7 DOWNTO 4),s=>s(7 DOWNTO 4),co=>co);
END a;

4位二进制并行进位减法器的源程序suber.VHD如下:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY suber IS
PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
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 suber;
ARCHITECTURE behave OF suber IS
COMPONENT adder IS --引用加法器的模块
PORT(a:IN STD_LOGIC;
b:IN STD_LOGIC;
ci:IN STD_LOGIC;
s:OUT STD_LOGIC;
co:OUT STD_LOGIC
);
END COMPONENT;
SIGNAL btem:STD_LOGIC_VECTOR(3 DOWNTO 0); --减数寄存
SIGNAL ctem:STD_LOGIC_VECTOR(4 DOWNTO 0); --进位寄存
SIGNAL stem:STD_LOGIC_VECTOR(3 DOWNTO 0); --结果寄存
BEGIN
btem(3 DOWNTO 0)<=NOT b (3 DOWNTO 0); --先把减数求反
ctem(0)<=NOT ci; --输出进位也求反,从而对减数求补码
g1:FOR i IN 0 TO 3 GENERATE --连用4位全加器
add:adder PORT MAP (a(i),btem(i),ctem(i),stem(i),ctem(i+1));
END GENERATE;
s(3 downto 0)<=stem(3 downto 0); --结果输出
co<=NOT ctem(4); --求反输出进位
END behave;
8位二进制并行进位减法器的原理图:

乘法器的源程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY mul IS
PORT (
a,b : IN STD_LOGIC_VECTOR(3 DOWNTO 0);
y : OUT STD_LOGIC_VECTOR(7 DOWNTO 0)
);END mul;
ARCHITECTURE arch OF mul IS
BEGIN
y(7 DOWNTO 0) <= a(3 DOWNTO 0)*b(3 DOWNTO 0);
END arch;

除法器的源程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY diver IS
PORT(a:IN STD_LOGIC_VECTOR(7 DOWNTO 0);
b:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
clk:IN STD_LOGIC;
str:IN STD_LOGIC;
s:OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
y:OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END ;
ARCHITECTURE behave OF diver IS
COMPONENT suber IS --引用减法器
PORT(a:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
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 COMPONENT;
TYPE state_type IS (start,one,two,three,eror); --状态定义
SIGNAL state:state_type;
SIGNAL ain:STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL bin:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL atem:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL btem:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL stem:STD_LOGIC_VECTOR(3 DOWNTO 0);
SIGNAL citem:STD_LOGIC;
SIGNAL cotem:std_logic;
BEGIN
p2:PROCESS(clk)
VARIABLE n: INTEGER range 0 to 3; --移位次数计数值
BEGIN
IF clk’EVENT AND clk=‘1’ THEN
CASE state IS
WHEN start=> --开始状态
IF str=‘1’ THEN
state<=one;
atem(3 DOWNTO 0)<=a(7 DOWNTO 4); --把高4位放到减法器被减数端
btem(3 DOWNTO 0)<=b(3 DOWNTO 0); --把除数放到减法器减数端
ain(7 DOWNTO 0)<=a(7 DOWNTO 0); --寄存被除数
bin(3 DOWNTO 0)<=b(3 DOWNTO 0); --寄存除数
END IF;
WHEN one=> --第一次移位
IF cotem=‘0’ THEN
state<=eror;
ELSE
ain(3 downto 1)<=ain(2 downto 0); --被除数做移位
ain(0)<=not cotem; --在最低位接受该位商值
atem(3 downto 0)<=ain(6 downto 3); --除数寄存器高4位输到减法器,作为被减数
state<=two;
END IF;
WHEN two=> --第二次移位
IF n=2 THEN
state<=three;
n:=0;
ELSE
state<=two;
n:=n+1;
END IF;
IF cotem=‘0’ THEN
atem(3 DOWNTO 1)<=stem(2 DOWNTO 0);
ELSE
atem(3 DOWNTO 1)<=atem(2 DOWNTO 0);
END IF;
ain(3 DOWNTO 1)<=ain(2 DOWNTO 0);
ain(0)<=NOT cotem;
atem(0)<=ain(3);
WHEN three=> --第三次移位
s(3 DOWNTO 1)<=ain(2 DOWNTO 0);
s(0)<=NOT cotem;
IF cotem=‘0’ THEN
y(3 DOWNTO 0)<=atem(3 DOWNTO 0);
ELSE
y(3 DOWNTO 0)<=atem(3 DOWNTO 0);
END IF;
atem(3 DOWNTO 0)<=“0”;
btem(3 DOWNTO 0)<=“0”;
state<=start;
WHEN eror=> --溢出状态
state<=start; --回到开始状态
atem(3 DOWNTO 0)<=“0”;
btem(3 DOWNTO 0)<=“0”;
END CASE;
END IF;
END PROCESS p2;
citem<=‘0’;
U1:suber PORT MAP (atem,btem,citem,stem,cotem);
END behave;

数字按键译码电路VHDL语言描述:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY numdecoder IS
PORT(reset:IN STD_LOGIC;
inclk:IN STD_LOGIC;
innum:STD_LOGIC_VECTOR(9 DOWNTO 0);
outnum:BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
outflag:OUT STD_LOGIC);
END;
ARCHITECTURE behave OF numdecoder IS
BEGIN
PROCESS(inclk,reset)
BEGIN
IF reset='1’THEN
outnum<=“0000”;
ELSIF inclk’EVENT AND inclk='1’THEN
CASE innum IS
WHEN"0000000001"=>outnum<=“0000”;outflag<=‘1’; --按下第一个键表示输入0
WHEN"0000000010"=>outnum<=“0001”;outflag<=‘1’; --以下类似
WHEN"0000000100"=>outnum<=“0010”;outflag<=‘1’;
WHEN"0000001000"=>outnum<=“0011”;outflag<=‘1’;
WHEN"0000010000"=>outnum<=“0100”;outflag<=‘1’;
WHEN"0000100000"=>outnum<=“0101”;outflag<=‘1’;
WHEN"0001000000"=>outnum<=“0110”;outflag<=‘1’;
WHEN"0010000000"=>outnum<=“0111”;outflag<=‘1’;
WHEN"0100000000"=>outnum<=“1000”;outflag<=‘1’;
WHEN"1000000000"=>outnum<=“1001”;outflag<=‘1’;
WHEN OTHERS=>outnum<=outnum;outflag<=‘0’; --不按键时保持
END CASE;
END IF;
END PROCESS;
END behave;

7段译码器的VHDL语言描述:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY vdecode IS
PORT(indata:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
outdata:OUT STD_LOGIC_VECTOR(0 TO 6)
);
END;
ARCHITECTURE behave OF vdecode IS
BEGIN
WITH indata SELECT
outdata<=“1111110"WHEN"0000”, --0的显示,以下类似
“0110000"WHEN"0001”,
“1101101"WHEN"0010”,
“1111001"WHEN"0011”,
“0110011"WHEN"0100”,
“1011011"WHEN"0101”,
“1011111"WHEN"0110”,
“1110000"WHEN"0111”,
“1111111"WHEN"1000”,
"0000000"WHEN OTHERS;
END behave;

8位二进制数转换成个位、十位、百位的进程:
ctrview:PROCESS(c,clk)
BEGIN
IF c='1’THEN
view1<=“0000”; view2<=“0000”; view3<=“0000”;
viewstep<=takenum;
ELSIF clk’EVENT AND clk='1’THEN
CASE viewstep IS
WHEN takenum=>
ktemp<=keep;
viewstep<=hundred;
WHEN hundred=>
IF ktemp>="11001000"THEN --如果ktemp大于200
view1<=“0010”;ktemp<=ktemp-“11001000”; --百位为2,ktemp-200
ELSIF ktemp>="01100100"THEN --如果ktemp大于100
view1<=“0001”;ktemp<=ktemp-“01100100”; --百位为1,ktemp-100
ELSE view1<=“0000”; --百位为0
END IF;
viewstep<=ten;
WHEN ten=> --产生十位数字
IF ktemp>="01011010"THEN
view2<=“1001”;ktemp<=ktemp-“01011010”;
ELSIF ktemp>="01010000"THEN
view2<=“1000”;ktemp<=ktemp-“01010000”;
ELSIF ktemp>="01000110"THEN
view2<=“0111”;ktemp<=ktemp-“01000110”;
ELSIF ktemp>="00111100"THEN
view2<=“0110”;ktemp<=ktemp-“00111100”;
ELSIF ktemp>="00110010"THEN
view2<=“0101”;ktemp<=ktemp-“00110010”;
ELSIF ktemp>="00101000"THEN
view2<=“0100”;ktemp<=ktemp-“00101000”;
ELSIF ktemp>="00011110"THEN
view2<=“0011”;ktemp<=ktemp-“00011110”;
ELSIF ktemp>="00010100"THEN
view2<=“0010”;ktemp<=ktemp-“00010100”;
ELSIF ktemp>="00001010"THEN
view2<=“0001”;ktemp<=ktemp-“00001010”;
ELSE view2<=“0000”;
END IF;
viewstep<=one
WHEN one=> --产生个位数字
view3<=ktemp(3 DOWNTO 0);
viewstep<=takenum;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS ctrview;

计算器的VHDL语言:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
USE IEEE.STD_LOGIC_ARITH.ALL;
USE IEEE.STD_LOGIC_UNSIGNED.ALL;
ENTITY cal IS
PORT (inclk: IN STD_LOGIC;
num: IN STD_LOGIC_VECTOR(9 DOWNTO 0);
plus: IN STD_LOGIC; --加法按键
subt: IN STD_LOGIC; --减法按键
mult: IN STD_LOGIC; --乘法按键
mdiv: IN STD_LOGIC; --除法按键
equal: IN STD_LOGIC; --等号键
c: IN STD_LOGIC; --清零键
onum1,onum2,onum3: OUT STD_LOGIC_VECTOR(0 TO 6)
); --3个7段译码显示管
END cal;
ARCHITECTURE behave OF cal IS
TYPE state IS (takenum,hundred,ten,one);
SIGNAL viewstep: state;
SIGNAL ktemp: STD_LOGIC_VECTOR(7 DOWNTO 0); --分为显示的暂存器
SIGNAL flag: STD_LOGIC; --是否是第一次输入数字的标志符
SIGNAL f1: STD_LOGIC; --是否开始输入第二个数字的标志
SIGNAL acc: STD_LOGIC_VECTOR(7 DOWNTO 0); --存放第一个数字的累加器
SIGNAL reg: STD_LOGIC_VECTOR(7 DOWNTO 0); --存放第二个以及以后数字的寄存器
SIGNAL keep: STD_LOGIC_VECTOR(7 DOWNTO 0); --存放显示数字的寄存器
SIGNAL ans: STD_LOGIC_VECTOR(7 DOWNTO 0); --存放各步计算结果的寄存器
SIGNAL dans: STD_LOGIC_VECTOR(3 DOWNTO 0); --存放除法结果的寄存器
SIGNAL numbuff: STD_LOGIC_VECTOR(3 DOWNTO 0); --输入数字缓冲
SIGNAL vf: STD_LOGIC; --表示是否最后结果
SIGNAL strdiv: STD_LOGIC; --除法计算开始的信号
SIGNAL numclk: STD_LOGIC; --将数字从缓存放入累加器或寄存器
SIGNAL clear: STD_LOGIC; --清除累加器中的信号
SIGNAL inplus: STD_LOGIC; --同步加信号
SIGNAL insubt: STD_LOGIC; --同步减信号
SIGNAL inmult: STD_LOGIC; --同步乘信号
SIGNAL inmdiv: STD_LOGIC; --同步除信号
SIGNAL inequal: STD_LOGIC; --同步等于信号
SIGNAL view1,view2,view3: STD_LOGIC_VECTOR(3 DOWNTO 0); --分位的显示
——寄存器
SIGNAL cou: STD_LOGIC_VECTOR(1 DOWNTO 0); --用力记忆是第几次
--计算的信号
SIGNAL clk_gg: STD_LOGIC_VECTOR(11 DOWNTO 0); --用于产生分频时钟的信号
SIGNAL clk: STD_LOGIC; --分频后的时钟信号
COMPONENT numdecoder IS --引用数字按键的译码电路
PORT ( reset: IN STD_LOGIC;
inclk: IN STD_LOGIC;
innum: IN STD_LOGIC_VECTOR(9 DOWNTO 0);
outnum: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);
outflag: OUT STD_LOGIC );
END COMPONENT;
COMPONENT vdecode IS --引用7段译码器
PORT(indata:IN STD_LOGIC_VECTOR(3 DOWNTO 0);
outdata:OUT STD_LOGIC_VECTOR(0 TO 6));
END COMPONENT;
COMPONENT diver IS --引用除法器
PORT( a: IN STD_LOGIC_VECTOR(7 DOWNTO 0);
b: IN STD_LOGIC_VECTOR(3 DOWNTO 0);
clk: IN STD_LOGIC;
str: IN STD_LOGIC;
s: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);
y: OUT STD_LOGIC_VECTOR(3 DOWNTO 0)
);
END COMPONENT;
BEGIN
inum1: numdecoder port map(c,clk,num,numbuff,numclk);
clock: PROCESS(inclk,c) --进程clock用于产生分频的时钟,使得12位向
–量clk_gg不断加1,然后输出12位中的某一位
BEGIN
IF c=‘1’ THEN
clk_gg(11 DOWNTO 0)<=“0”;
ELSIF inclk’EVENT AND inclk=‘1’ then
clk_gg(11 DOWNTO 0)<=clk_gg(11 DOWNTO 0)+1;
END IF;
END PROCESS clock;
clk<=clk_gg(11);
pacecal: PROCESS(c,clk)
BEGIN
IF c=‘1’ then
inplus<=‘0’;insubt<=‘0’;inmult<=‘0’;inmdiv<=‘0’;
ELSIF clk’EVENT AND clk=‘1’ then
IF plus=‘1’ then
inplus<=‘1’; insubt<=‘0’;inmult<=‘0’;inmdiv<=‘0’;
ELSIF subt=‘1’ then
inplus<=‘0’;insubt<=‘1’;inmult<=‘0’;inmdiv<=‘0’;
ELSIF mult=‘1’ then
inplus<=‘0’;insubt<=‘0’;inmult<=‘1’;inmdiv<=‘0’;
ELSIF mdiv=‘1’ then
inplus<=‘0’;insubt<=‘0’;inmult<=‘0’;inmdiv<=‘1’;
END IF;
END IF;
END PROCESS pacecal;
ctrflag: PROCESS(c,clk) --用于产生flag信号
BEGIN
IF c=‘1’ then
flag<=‘0’;
ELSIF clk’EVENT AND clk=‘1’ then
IF inplus=‘1’ OR insubt=‘1’ OR inmult=‘1’ OR inmdiv=‘1’ THEN
flag<=‘1’;
ELSE flag<=‘0’;
END IF;
END IF;
END PROCESS ctrflag;
ctrfirstnum: PROCESS(c,numclk) --用于输入第一个运算数
BEGIN
IF c=‘1’ then
acc<=“00000000”;
ELSIF numclk’EVENT AND numclk=‘0’ then
IF flag=‘0’ then
acc<=acc*“1010”+numbuff;
END IF;
END IF;
END PROCESS ctrfirstnum;
ctrsecondnum:PROCESS(c,numclk) --用于输入第二个以后的运算数字
BEGIN
IF c='1’OR clear='1’THEN
reg<=“00000000”;f1<=‘0’;
ELSIF numclk’event AND numclk='0’THEN
IF flag='1’THEN
f1<=‘1’;
reg<=reg*“1010”+numbuff;
END IF;
END IF;
END PROCESS ctrsecondnum;
ctrclear: PROCESS(c,clk) --用于产生clear信号
BEGIN
IF c=‘1’ then
clear<=‘0’;
ELSIF clk’EVENT AND clk=‘1’ then
IF plus=‘1’ OR subt=‘1’ then
clear<=‘1’;
ELSE clear<=‘0’;
END IF;
END IF;
END PROCESS ctrclear;
ctrinequal:PROCESS(c,clk) --用于产生inqual信号
BEGIN
IF c=‘1’ then
inequal<=‘0’;
ELSIF clk’EVENT AND clk=‘1’ then
IF plus=‘1’ OR subt=‘1’ OR mult=‘1’ OR mdiv=‘1’ OR equal=‘1’ then
inequal<=‘1’;
ELSE inequal<=‘0’;
END IF;
END IF;
END PROCESS ctrinequal;
ctrcou: process (c,inequal) --用于产生cou信号
BEGIN
IF c=‘1’ then
cou<=“00”;
ELSIF inequal’EVENT and inequal='1’then
IF cou=“10” then
cou<=cou;
ELSE cou<=cou+1;
END IF;
END IF;
END PROCESS ctrcou;
ctrcal: PROCESS (c,inequal) --用于实现运算
BEGIN
IF c=‘1’ then
ans<=“00000000”;
strdiv<=‘0’;
ELSIF inequal’EVENT and inequal=‘1’ then
IF flag=‘1’ then
IF inplus=‘1’ then
IF cou=“10” then
ans<=ans+reg;
END IF;
ELSIF insubt='1’THEN
IF cou="10"THEN
ans<=ans-reg;
ELSE ans<=acc-reg;
END IF;
ELSIF inmult=‘1’ then
IF acc<=“00001111” AND reg<=“00001111” then
–将乘数和被乘数限制在4位二进制数范围内
ans<=acc(3 DOWNTO 0)* reg(3 downto 0);
ELSE ans<=“00000000”;
END IF;
ELSIF inmdiv='1’THEN
strdiv<=‘1’;
END IF;
else strdiv<=‘0’;
END IF;
END IF;
END PROCESS ctrcal;
d1:diver PORT MAP (acc,reg(3 DOWNTO 0),clk,strdiv,dans);
–将除法结果放在dans中
ctrvf: PROCESS(c,equal) --用来产生vf信号
BEGIN
IF c=‘1’ then
vf<=‘0’;
ELSIF equal’EVENT AND equal=‘1’ then
vf<=‘1’;
END IF;
END PROCESS ctrvf;
ctrkeep: process(c,clk) --用于控制keep寄存器
BEGIN
IF c=‘1’ then --keep寄存器清零
keep<=“00000000”;
ELSIF clk’EVENT AND clk=‘0’ then
IF flag=‘0’ then --输入第二个数以前keep中存放acc中的数
keep<=acc;
ELSIF flag=‘1’ AND f1=‘1’ AND vf=‘0’ then
–输入第二个数以前keep中存放reg中的数
keep<=reg;
ELSIF flag=‘1’ AND f1='0’AND vf='0’AND cou=“10” then
——keep中存放ans中的内容
keep<=ans;
ELSIF flag='1’and vf='1’then --最终的计算结果
IF inmdiv='0’THEN
keep<=ans;
ELSE
keep(3 DOWNTO 0)<=dans;
END IF;
END IF;
END IF;
END PROCESS ctrkeep;
ctrview:PROCESS(c,clk)
BEGIN
IF c='1’THEN
view1<=“0000”; view2<=“0000”; view3<=“0000”;
viewstep<=takenum;
ELSIF clk’EVENT AND clk='1’THEN
CASE viewstep IS
WHEN takenum=>
ktemp<=keep;
viewstep<=hundred;
WHEN hundred=>
IF ktemp>="11001000"THEN
view1<=“0010”;ktemp<=ktemp-“11001000”;
ELSIF ktemp>="01100100"THEN
view1<=“0001”;ktemp<=ktemp-“01100100”;
ELSE view1<=“0000”;
END IF;
viewstep<=ten;
WHEN ten=>
IF ktemp>="01011010"THEN
view2<=“1001”;ktemp<=ktemp-“01011010”;
ELSIF ktemp>="01010000"THEN
view2<=“1000”;ktemp<=ktemp-“01010000”;
ELSIF ktemp>="01000110"THEN
view2<=“0111”;ktemp<=ktemp-“01000110”;
ELSIF ktemp>="00111100"THEN
view2<=“0110”;ktemp<=ktemp-“00111100”;
ELSIF ktemp>="00110010"THEN
view2<=“0101”;ktemp<=ktemp-“00110010”;
ELSIF ktemp>="00101000"THEN
view2<=“0100”;ktemp<=ktemp-“00101000”;
ELSIF ktemp>="00011110"THEN
view2<=“0011”;ktemp<=ktemp-“00011110”;
ELSIF ktemp>="00010100"THEN
view2<=“0010”;ktemp<=ktemp-“00010100”;
ELSIF ktemp>="00001010"THEN
view2<=“0001”;ktemp<=ktemp-“00001010”;
ELSE view2<=“0000”;
END IF;
viewstep<=one;
WHEN one=>
view3<=ktemp(3 DOWNTO 0);
viewstep<=takenum;
WHEN OTHERS=>NULL;
END CASE;
END IF;
END PROCESS ctrview;
v1:vdecode PORT MAP (view1,onum1); --7段译码显示百位
v2:vdecode PORT MAP (view2,onum2); --7段译码显示十位
v3:vdecode PORT MAP (view3,onum3); --7段译码显示个位
END behave;

附录B:模块图
基于FPGA的查表式运算器的设计与仿真,java,java

加法器模块图

基于FPGA的查表式运算器的设计与仿真,java,java

减法器模块图

基于FPGA的查表式运算器的设计与仿真,java,java

乘法器模块图

基于FPGA的查表式运算器的设计与仿真,java,java

除法器模块图

基于FPGA的查表式运算器的设计与仿真,java,java

七段译码电路

基于FPGA的查表式运算器的设计与仿真,java,java

按键译码电路文章来源地址https://www.toymoban.com/news/detail-756784.html

到了这里,关于基于FPGA的查表式运算器的设计与仿真的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

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

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

相关文章

  • 计算机组成与结构综合大实验验优:16位运算器设计实验、存储器实验、控制器实验、16位CPU设计实验

    综合性比较强的大实验,先是在实验室完成前面三个小实验,最后再三个结合完成最后的16位CPU的设计,需要软硬件结合一起。 实验截图 黄色圈的地方是输入步骤显示 蓝色圈的地方是标志位和结果显示的LED灯 红色圈的地方是输入决定ALU功能的操作码的地方,以及输入计算的

    2023年04月08日
    浏览(48)
  • 2.6 浮点运算方法和浮点运算器

      以下是一些具体的学习目标: 理解浮点数的基本概念和表示方法,包括符号位、指数和尾数。 学习浮点数的运算规则和舍入规则,包括加、减、乘、除、开方等。 了解浮点数的常见问题和误差,例如舍入误差、溢出、下溢等,并学会如何处理这些问题。 理解浮点运算器的

    2024年02月01日
    浏览(50)
  • 运算器实验

    一、实验目的 掌握八位运算器的数据传输格式,验证运算功能发生器及进位控制的组合功能。 二、实验要求 完成算术、逻辑、移位运算实验,熟悉ALU运算控制位的运用。 三、实验原理 实验中所用的运算器数据通路如图1所示。ALU运算器由CPLD描述。运算器的输出FUN经过74LS2

    2024年01月19日
    浏览(34)
  • 西电计组实验二 运算器实验

    一.实验目的   1.了解简单运算器的数据传输通路。   2.验证运算功能发生器的组合功能。   3.掌握算术逻辑运算加、减、与的工作原理。   4.验证实验台运算的8位加、减、与、直通功能。   5.按给定数据,完成几种指定的算术和逻辑运算。 二.实验原理   算

    2024年02月06日
    浏览(43)
  • CPU运算器、控制器、寄存器

    CPU内部主要由运算器、控制器、寄存器三大部分组成。 运算器 负责算术运算(+ - * / 基本运算和附加运算)和逻辑运算(包括 移位、逻辑测试或比较两个值等)。 控制器 负责应对所有的信息情况,调度运算器把计算做好。 寄存器 它们可用来暂存指令、数据和地址。既要对

    2024年02月15日
    浏览(37)
  • 计算机组成原理实验——实验1 运算器实验

    (1)掌握算术逻辑运算单元的工作原理。 (2)熟悉简单运算器的电路组成。 (3)熟悉4位运算功能发生器(74LS181)的算术、逻辑运算功能。 (1)做好实验预习,看懂电路图,熟悉实验中所用芯片各引脚的功能和连接方法。 (2)按照实验内容与步骤的要求,认真仔细地完

    2024年02月12日
    浏览(41)
  • 计算机组成与结构实验一《运算器组成》

    一、实验目的与要求 一、实验目的 (1)熟悉TEC-8模型计算机的节拍脉冲T1T2T3 (2)熟悉TEC-8模型机双端口通用寄存器组的读写操作 (3)熟悉TEC-8模型机运算器的数据传送通路 (4)验证74181的加、减、与、或功能 (5)按给定的数据,完成几种指定的算术运算和逻辑运算 二、

    2024年02月04日
    浏览(45)
  • 数据结构实验之矩阵的运算器(二维数组)

    实验目的 掌握并学会运用数组及相关知识 掌握矩阵相关运算的代码实现 学会小组的分工与合作 体会封装的好处 实验任务及要求 要求实现矩阵的计算器,能供用户选择不同菜单,进而实现不同存储形式及调用相应计算的算法,并记录运算过程。 运算程序主要包括:①矩阵的

    2024年01月15日
    浏览(37)
  • 计算机组成与体系结构第一次试验:运算器实验

    为了帮助同学们完成痛苦的实验课程设计,本作者将其作出的实验结果及代码贴至CSDN中,供同学们学习参考。如有不足或描述不完善之处,敬请各位指出,欢迎各位的斧正! 掌握使用算术逻辑运算器 74LS181 进行算术运算、 逻辑运算的方法。 掌握基于“累加-移位”原理的串

    2024年02月04日
    浏览(52)
  • Python四则运算“计算器”——整数口算练习“小程序”

    设定练习题目数量、最大取值整数数,即时判定,答对鼓励答错打印正确结果。 【学习的细节是欢悦的历程】 Python 官网 :https://www.python.org/ Free :大咖免费“ 圣经 ”教程《 python 完全自学教程 》,不仅仅是基础那么简单…… 地址:https://lqpybook.readthedocs.io/   自学并不是

    2024年02月07日
    浏览(94)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包