分享
分享赚钱 收藏 举报 版权申诉 / 26

类型基于FPGA的计算器设计.doc

  • 上传人:精品资料
  • 文档编号:10690935
  • 上传时间:2019-12-28
  • 格式:DOC
  • 页数:26
  • 大小:1.12MB
  • 配套讲稿:

    如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。

    特殊限制:

    部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。

    关 键  词:
    基于FPGA的计算器设计.doc
    资源描述:

    1、研 究 生 课 程 论 文课 程 名 称 FPGA 及片上系统 SOPC 应用授 课 学 期 学年第 一 学期学 院 X 专 业 C 学 号 C1 姓 名 C 任 课 教 师 C 论 文 题 目 基于 FPGA 的计算器设计交 稿 日 期 2014 年 01 月 09 日 成 绩 XI基于 FPGA 的计算器设计研究生:XX 指导老师:XX摘要本文介绍了一个简单计算器的设计,基于硬件描述语言 VHDL 采用了现场可编程逻辑器件 FPGA 进行设计,并在 Altera 公司的 Quartus 软件上实现仿真。系统由键控模块、运算、存储模块和译码显示模块四个部分组成,计算部分为加法器、减法器、乘法

    2、器和除法器,存储部分需要 3 个存储器来实现:内部累加器(acc) 、输入寄存器(reg)以及结果暂存器(ans) 。显示部分由四个七段译码管组成,分别来显示输入数字,输入部分采用外接键盘,外部的 8 个按键他们能以单键和组合键的形式完成 09999 之内的 加 、 减 、 乘 、 除 、符号变换 、 存储数据和读取数据等七种功能运算其结构简单,易于实现。 关键词:FPGA;VHDL;计算器;设计The design of calculator based on FPGAGraduate Student: Dongdong Fan Supervisor: Shuxiang SongAbstra

    3、ctThis 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 Alteras Quartus in software for emulation. This system is componented by the key control module, computing, storage and decoding di

    4、splay module 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 four decoder of 7 sections, respe

    5、ctively to show the number of input. The 8 keys they can by single combined key forms to be completed addition, multiplication, division arithmetic operator and symbol transform,stored data and read seven function of operation within 0 to 9999 numbers.its structure is simple and easy to implement.Ke

    6、y words:FPGA; VHDL; calclute ; designII目录摘要 I目录 .II第 1 章 引言 .11.1 课程设计的目的与意义 11.2 国内外发展现状 1第 2 章 FPGA 技术及硬件描述语言 .22.1 EDA 技术及其发展 22.2 FPGA 技术 22.3 硬件描述语言 VHDL 3第 3 章 系统总体设计 .43.1 计算器的计算部分 43.2 计算器的存储部分 43.3 计算器的显示部分 53.4 计算器的输入部分 6第 4 章 计算器的 VHDL 设计 .74.1 加法器的设计与仿真 .74.2 减法器的设计与仿真 .84.3 乘法器的设计与仿真 .9

    7、4.4 除法器的设计与仿真 .10第 5 章 结束语 11参考文献: 11基于 FPGA 的计算器设计0第 1 章 引言1.1 课程设计的目的与意义在人类学会交易的时候,计算也随之产生,而算盘作为计算最实用的工具存在了几千年。算盘亦称珠算,是中国人民创造的一种计算工具,素有“中国计算机”之称。算盘产生于汉代之前,是由古代的“筹算”演变而来的,珠算一词,最早见于汉末三国时代徐岳撰数术记遗 ,书中有“珠算,控带四时,经纬三才”的记述。明清时期,算盘的应用已很广泛,关于算盘制造规格,后来出现的各种规格的算盘,都是在此基础上发展起来的。算盘构造简单,便于掌握,使用方便,成为计算理财不可缺少的工具。可是

    8、随着人类文明的进步和科学技术的不断发展。算盘已经越来越不能满足一些高强度、高难度、高速度的复杂计算。这时,一种新的电子产品问世了,它就是电子计算器。电子计算器的发明是跨时代的,它比算盘计算的速度要快几百几千倍,计算的结果要比算盘更精确,操作的方法要更方便,更简单易学,计算的范围更广,并且小巧、轻便。它已经成为人们日常生活中不可缺少的一种计算工具,为我们的生活提供了很大的方便。而随着计算机的普及,越来越多人在使用计算机,越来越多的工作离不开计算机,可以说计算机已经成为现代社会中不可或缺的工具,而电子计算器功能也以软件的形式进入计算机的软件世界,这不仅给人们带来了更大的便利,更为人们引入了更快的计

    9、算速度和更强大的运算功能。1.2 国内外发展现状(1)国外情况在国外,电子计算器在集成电路发明后,只用短短几年时间就完成了技术飞跃,经过激烈的市场竞争,现在的计算器技术己经相当成熟。计算器已慢慢地脱离原来的“辅助计算工具”的功能定位,正向着多功能化、可编程化方向发展,在各个领域都得到了广泛的应用。用计算器不仅可以实现各种各样复杂的数学计算还可以用来编制、运行程序,甚至解方程组,图形计算器还可以进行图形处理。计算器内置的软件允许用户进行类似于对计算机的文件和目录管理等操作,允许用户对图形界面进行定制,同时各种新技术也被应用到计算器1里使计算器功能越来越强大。可以说,计算器就是一个“微微型”的计算

    10、机。(2)国内情况国内也有厂商利用计算器芯片开发新的产品,但对计算器技术的研究、计算器芯片的设计还处于起步阶段。计算器的主要功能还是在于“计算”,不妨称之为“低档计算器”。即便是对这种计算器,很多厂商也只从事计算器的组装、销售业务。一些 IC 设计公司、芯片提供商也开始研究计算器技术。第 2 章 FPGA 技术及硬件描述语言2.1 EDA 技术及其发展1.使电子设计成果以自主知识产权的方式得以明确表达和确认成为可能;2.在仿真和设计两方面支持标准硬件描述语言的功能强大的 EDA 软件不断推出;3.电子技术全方位纳入 EDA 领域;4.EDA 使得电子领域各学科的界限更加模糊,更加互为包容;5.

    11、Soc 高效低成本设计技术的成熟。2.2 FPGA 技术(1)FPGA 技术的发展现状FPGA 是英文 Field Programmable Gate Array 的缩写,即现场可编程门阵列,它是在 PAL、GAL、CPLD 等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA 芯片叫板微处理器,如果没有微处理器,电脑会怎样?答案令人惊讶- 它的处理速度比常规电脑更快,而且快出很多倍 !尽管 FPGA 芯片的时钟频率要低于奔腾处理器,但是由于 FPGA 芯片可并行处理各种

    12、不同的运算,所以可完成许多复杂的任务。例如网页显示,全球天气建摸及基因组合核对等,而且处理速度比奔腾处理器或数字信号处理器快得多。在通用计算方面,FPGA 仍然不敌 Intel 的处理器。对于那些只需要进行重复单任务操作的机器而言,使用FPGA 芯片显然是大材小用。2与 FPGA 对应的还有 DSP 处理器,DSP 处理器速度虽然很快,并对许多 DSP应用来说很有用,但仍有一些应用要求性能再进一步提升,而 FPGA 提供了更高的性能。FPGA 可以生成一个定制硬件设计,从而控制逻辑能够在硬件中实现,不必再利用精确的时钟周期来实现控制功能。目前的 FPGA 设计一般采用 Top-down(自顶向

    13、下)的设计方法。先将系统划分为各个功能子模块,在系统级层次上进行行为描述,再对这些子模块进一步进行行为描述。图 2.1 应用 FPGA 开发流程2.3 硬件描述语言 VHDL硬件描述语言是 EDA 技术的重要组成部分,VHDL 是作为电子设计主流硬件的描述语言。VHDL 语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。 自顶向下的设计流程: 1 设 计 说 明 书2 建 立 VHDL行 为 模 型3 VHDL行 为 仿 真4 VHDL-RT级 建 模 5 前 端 功 能 仿 真6 逻 辑 综 合7 测 试 向 量 生

    14、成8 功 能 仿 真 9 结 构 综 合10 门 级 时 序 仿 真1 硬 件 测 试12 设 计 完 成3图 2.2 基于 VHDL 的自顶向下设计方法第 3 章 系统总体设计系统总体设计框图如图 1.3 所示。此设计由计算部分、存储部分、显示部分和输入部分组成。 输 入 部 分 存 储 部 分计 算 部 分显 示 部 分 FPGA图 3.1 计算器的系统组成框图3.1 计算器的计算部分完成 09999 之内的数,9999 的二进制表示为 10011100001111,在这一部分中,可以将每一个数均表示成 16 位二进制数统一进行运算,各个计算数之间的计算可以直接使用 VHDL 语言中的运算

    15、符来实现。但在显示时,必须将个位、十位、百位,千位分开显示,设计时使用比较的方法来实现计算器的功能要求。3.2 计算器的存储部分存储部分需要 3 个存储器来实现:内部累加器(acc) 、输入寄存器(reg)以及结果暂存器(ans) 。在存放数字时,将数字放入 acc 或者 reg 里面,当第一次按下数字键时,表示该数字是个位。当第二次按下数字键时,表示这次输入的是个位,是十位,上一次输入的所以要把第一次输入的数字乘以 10,再加上第二次输入的数字,来得到最终输入的数字。当第三次按下数字键时,要将第一次输入的数字乘以 100,再加上第二次输入的数字乘以 10,再加上第二次输入的数字,来得到最终输

    16、入的数字。当第四次按下数字键时,要将第一次输4入的数字乘以 1000,再加上第二次输入的数字乘以 100,再加上第三次输入的数字乘以 10,再加上第四次输入的数字,来得到最终输入的数字。当进行第一次计算时,第一个数字存放在 acc 里面。按下运算符以后,第二个数字放在 reg 里面。当再按下运算符号或者等号时,第一次计算的结果将存放在 ans 里面,同时 reg 清零,等待下一个数字的输入。进行第二次运算时,将 ans 里面的结果与 reg 里面新输入的数字进行运算,再将运算结果存放在ans 里面,直到最后按下等号按键的时候,显示最终的运算结果。3.3 计算器的显示部分显示部分是系统的输出部分

    17、,用于显示按键值及计算结果,由于数字系统的数据运算都是二进制的,而输出表达式都是 BCD 码,为了满足 BCD 码的译码显示,最方便的方法就是利用译码程序在 FPGA 中实现。本文采用的是共阴极七段数码管,显示数字时需要将对应管脚置为高电平,输出时,从左到右,按从高到低位的顺序依次接 g、f、e、d、c、b、a。七段译码器的基本结构如图3.2 所示。abcdef g图 3.2 七段译码器的结构其 VHDL 语言描述如下所示。在这段程序中,indata 是输入 4 位二进制数的端口,outdata 是输出 7 位译码的端口,用 WITH 语句来实现译码。WITH indata SELECTout

    18、dataoutnumoutnumoutnumoutnumoutnumoutnumoutnumoutnumoutnumoutnumoutnumain,b=bin,co=d,so=e);u2:h_adder PORT MAP(a=e,b=cin,co=f,so=sumf);u3:or2a PORT MAP(a=d,b=f,c=coutf);END ARCHITECTURE fd1;2 . 16 位位减法器的源程序 suber.vhd 如下:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.S

    19、TD_LOGIC_UNSIGNED.ALL;ENTITY suber IS -减法器PORT (a,b:IN STD_LOGIC_VECTOR(15 DOWNTO 0);ci:IN STD_LOGIC;s:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);co:OUT STD_LOGIC);END ENTITY suber;ARCHITECTURE fd3 OF suber ISCOMPONENT f_adder IS -调用一位全加器(在工程中已经添加)PORT (ain,bin,cin:IN STD_LOGIC;sumf,coutf:OUT STD_LOGIC);END

    20、COMPONENT;SIGNAL btem:STD_LOGIC_VECTOR(15 DOWNTO 0);SIGNAL ctem:STD_LOGIC_VECTOR(16 DOWNTO 0);SIGNAL stem:STD_LOGIC_VECTOR(15 DOWNTO 0);BEGINbtem(15 DOWNTO 0)=tempb THENtemp_a:=temp_a-temp_b+1;END IF;END LOOP;IF d=1 THEN-商为负数时用补码表示temp_a(15 DOWNTO 0):=(NOT temp_a(15 DOWNTO 0)+1;END IF;IF sign=1 THEN

    21、-余数为负数时用补码表示temp_a(31 DOWNTO 16):=(NOT temp_b(31 DOWNTO 16)+1;END IF;Soutnumoutnumoutnumoutnumoutnumoutnumoutnumoutnumoutnumoutnumoutnumktemp -产生千位数字IF ktemp=“0010001100101000“THENview1=“0001111101000000“THENview1=“0001101101011000“THENview1=“0001011101110000“THENview1=“0001001110001000“THENview1=“0

    22、000111110100000“THENview1=“0000101110111000“THENview1=“0000011111010000“THENview1=“0000001111101000“THENview1IF ktemp=“0000001110000100“THENview2=“0000001100100000“THENview2=“0000001010111100“THENview2=“0000001001011000“THENview2=“0000000111110100“THENview2=“0000000110010000“THENview2=“0000000000011

    23、110“THENview2=“11001000“THEN 17view2=“0000000001100100“THEN view2 -产生十位数字IF ktemp=“0000000001011010“THENview1=“0000000001010000“THENview1=“0000000001000110“THENview1=“0000000000111100“THENview1=“0000000000110010“THENview1=“0000000000101000“THENview1=“0000000000011110“THENview1=“0000000000010100“THEN

    24、view1=“0000101000000000“THENview1 -产生个位数字view4NULL;END CASE;END IF;END PROCESS ctrview;计算器的 VHDL 语言 cal.vhd: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_

    25、LOGIC; -加法按键subt: IN STD_LOGIC; -减法按键mult: IN STD_LOGIC; -乘法按键mdiv: IN STD_LOGIC; -除法按键equal: IN STD_LOGIC; -等号键c: IN STD_LOGIC; -清零键onum1,onum2,onum3,onum4: OUT STD_LOGIC_VECTOR(0 TO 6)-4 个 7 段译码显示管); END cal;ARCHITECTURE behave OF cal IS18TYPE state IS (takenum,thousand,hundred,ten,one);SIGNAL vie

    26、wstep: state;SIGNAL ktemp: STD_LOGIC_VECTOR(15 DOWNTO 0); -分为显示的暂存器SIGNAL flag: STD_LOGIC; -是否是第一次输入数字的标志符SIGNAL f1: STD_LOGIC; -是否开始输入第二个数字的标志SIGNAL acc: STD_LOGIC_VECTOR(15 DOWNTO 0); -存放第一个数字的累加器SIGNAL reg: STD_LOGIC_VECTOR(1 DOWNTO 0); -存放第二个以及以后数字的寄存器SIGNAL keep: STD_LOGIC_VECTOR(15 DOWNTO 0);

    27、-存放显示数字的寄存器SIGNAL ans: STD_LOGIC_VECTOR(15 DOWNTO 0); -存放各步计算结果的寄存器SIGNAL dans: STD_LOGIC_VECTOR(15 DOWNTO 0); -存放除法结果的寄存器SIGNAL numbuff: STD_LOGIC_VECTOR(15 DOWNTO 0); -输入数字缓冲SIGNAL vf: STD_LOGIC; -表示是否最后结果SIGNAL strdiv: STD_LOGIC; -除法计算开始的信号SIGNAL numclk: STD_LOGIC; -将数字从缓存放入累加器或寄存器SIGNAL clear: S

    28、TD_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,view1: STD_LOGIC_VECTOR(3 DOWNTO 0); -分位显示寄存器SIGNAL cou: STD_LOGIC_VECTOR(1 DOWNTO 0); -用力记忆是

    29、第几次计算的信号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(7 DOWNTO 0);outnum: BUFFER STD_LOGIC_VECTOR(3 DOWNTO 0);outflag: OUT STD_LOGIC );END COMPONENT;C

    30、OMPONENT 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,b:IN STD_LOGIC_VECTOR(15 DOWNTO 0);youwu:IN STD_LOGIC;s,y:OUT STD_LOGIC_VECTOR(15 DOWNTO 0);END COMPONENT;BEGIN inum1: numdecoder port map(c,c

    31、lk,num,numbuff,numclk);clock: PROCESS(inclk,c) -进程 clock 用于产生分频的时钟,使得 12 位向量 clk_gg 不断加1,然后输出 12 位中的某一位BEGIN IF c=1 THEN clk_gg(11 DOWNTO 0)ktemp -产生千位数字IF ktemp=“0010001100101000“THENview1=“0001111101000000“THENview1=“0001101101011000“THENview1=“0001011101110000“THENview1=“0001001110001000“THENview

    32、1=“0000111110100000“THENview1=“0000101110111000“THENview1=“0000011111010000“THENview1=“0000001111101000“THENview1;IF ktemp=“0000001110000100“THENview2=“0000001100100000“THEN22view2=“0000001010111100“THENview2=“0000001001011000“THENview2=“0000000111110100“THENview2=“0000000110010000“THENview2=“000000

    33、0000011110“THENview2=“11001000“THEN view2=“0000000001100100“THEN view2 -产生十位数字IF ktemp=“0000000001011010“THENview1=“0000000001010000“THENview1=“0000000001000110“THENview1=“0000000000111100“THENview1=“0000000000110010“THENview1=“0000000000101000“THENview1=“0000000000011110“THENview1=“0000000000010100“THENview1=“0000101000000000“THENview1 -产生个位数字view4NULL;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 段译码显示十位v4:vdecode PORT MAP (view4,onum4); -7 段译码显示个位END behave;

    展开阅读全文
    提示  道客多多所有资源均是用户自行上传分享,仅供网友学习交流,未经上传用户书面授权,请勿作他用。
    关于本文
    本文标题:基于FPGA的计算器设计.doc
    链接地址:https://www.docduoduo.com/p-10690935.html
    关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

    道客多多用户QQ群:832276834  微博官方号:道客多多官方   知乎号:道客多多

    Copyright© 2025 道客多多 docduoduo.com 网站版权所有世界地图

    经营许可证编号:粤ICP备2021046453号    营业执照商标

    1.png 2.png 3.png 4.png 5.png 6.png 7.png 8.png 9.png 10.png



    收起
    展开