简易计算器EDA技术课程设计报告书_第1页
简易计算器EDA技术课程设计报告书_第2页
简易计算器EDA技术课程设计报告书_第3页
简易计算器EDA技术课程设计报告书_第4页
简易计算器EDA技术课程设计报告书_第5页
已阅读5页,还剩30页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

.PAGE....EDA技术课程设计题目简易计算器设计系<部>信息工程系班级姓名学号指导教师2013年7月8日至7月12日共1周..EDA技术课程设计任务书一、设计题目、内容及要求设计题目:简易计算器设计内容及要求:〔1基本设计内容1:设计简易通用型计算器,完成对数据通路的架构,控制模块和运算器模块的设计,可进行加减乘除的基本运算。〔2基本设计内容2:加入按键消除抖动的模块,并在试验箱或开发板上通过数码管显示计算器的输入数值与输出结果,实现一个完整的计算器。〔3进阶设计内容:通过矩阵键盘实现数据的输入。〔4进阶设计内容:实现有符号数的计算。〔5进阶设计内容:实现浮点数的计算。设计要求:〔1根据任务要求确定电路各功能模块;〔2写出设计程序;〔3分析时序仿真结果;〔4提交设计总结。二、设计原始资料QuartusⅡ软件;EDA实验箱;计算机一台;三、要求的设计成果〔课程设计说明书、设计实物、图纸等课程设计说明书1份,不少于2000字,应包含设计原理分析、相关软件介绍、仿真波形分析,实验箱下载验证等。四、进程安排周1-周3:查阅资料,上机编写并调试设计程序;周4:整理、撰写说明书;周5:课程设计答辩并提交设计说明书。五、主要参考资料[1].VokneiA.Pedroni.《VHDL数字电路设计教程》.电子工业出版社,2008.5[2].潘松,黄继业.《EDA技术实用教程》〔第二版.科学出版社,2005.2[3].焦素敏.《EDA应用技术》.清华大学出版社,2002.4指导教师〔签名:教研室主任〔签名:课程设计成绩评定表出勤情况出勤天数缺勤天数成绩评定出勤情况及设计过程表现〔20分课设答辩〔20分设计成果〔60分总成绩〔100分提问〔答辩问题情况综合评定指导教师签名:年月日.PAGE.目录1绪论12软件介绍22.1QuartusII介绍22.2ModelSim介绍33设计原理54模块化设计分析64.1键盘矩阵模块64.2去抖模块设计64.3ALU模块设计74.4FSM模块设计74.5OP1模块设计84.6OP2模块设计94.7BIN模块设计94.8BCD模块设计105总结11参考文献12附录13.PAGE....1绪论硬件描述语言<hardwaredescriptionlanguage,HDL>是电子系统硬件行为描述,结构描述,数据流描述的语言。目前,利用硬件描述语言可以进行数字电子系统的设计。随着研究的深入,利用硬件描述语言进行模拟电子系统设计或混合电子系统设计也正在探索中。国外硬件描述语言种类很多,有的从Pascal发展而来,也有一些从C语言发展而来。有些HDL成为IEEE标准,但大部分是企业标准。VHDL来源于美国军方,其他的硬件描述语言则多来源于民间公司。可谓百家争鸣,百花齐放。这些不同的语言传播到国内,同样也引起了不同的影响。在我国比较有影响的有两种硬件描述语言:VHDL语言和VerilogHDL语言。这两种语言已成为IEEE标准语言。

电子设计自动化<electronicdesignautomation,EDA>技术的理论基础,设计工具,设计器件应是这样的关系:设计师用硬件描述语言HDL描绘出硬件的结构或硬件的行为,再用设计工具将这些描述综合映射成与半导体工艺有关的硬件配置文件,半导体器件FPGA则是这些硬件配置文件的载体。当这些FPGA器件加载,配置上不同的文件时,这个器件便具有了相应的功能。在这一系列的设计,综合,仿真,验证,配置的过程中,现代电子设计理论和现代电子设计方法贯穿于其中。以HDL语言表达设计意图,以FPGA作为硬件实现载体,以计算机为设计开发工具,以EDA软件为开发环境的现代电子设计方法日趋成熟。VHDL语言的英文全名是VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage,即超高速集成电路硬件描述语言。HDL发展的技术源头是:在HDL形成发展之前,已有了许多程序设计语言,如汇编,C,Pascal,Fortran,Prolog等。这些语言运行在不同硬件平台和不同的操作环境中,它们适合于描述过程和算法,不适合作硬件描述。CAD的出现,使人们可以利用计算机进行建筑,服装等行业的辅助设计,电子辅助设计也同步发展起来。在从CAD工具到EDA工具的进化过程中,电子设计工具的人机界面能力越来越高。在利用EDA工具进行电子设计时,逻辑图,分立电子原件作为整个越来越复杂的电子系统的设计已不适应。任何一种EDA工具,都需要一种硬件描述语言来作为EDA工具的工作语言。这些众多的EDA工具软件开发者,各自推出了自己的HDL语言。2软件介绍2.1QuartusII介绍QuartusII是Alter公司的综合性PLD/FPGA开发软件,支持原理图、VHDL、VerilogHDL以及AHDL〔AlteraHardwareDescriptionLanguage等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。QuartusII提供了完全集成且于电路结构无关的开发环境,具有数字逻辑设计的全部特性,包括:可利用原理图、结构框图、VerilogHDL、AHDL和VHDL完成电路描述,并将其保存为设计实体文件;芯片〔电路平面布局连线编辑;LogicLock增量设计方法,用户可建立并优化系统,然后添加对原始系统的性能影响较小或无影响的后续模块;功能强大的逻辑综合工具;完备的电路功能仿真与时序逻辑仿真工具;定时/时序分析与关键路径延时分析;可使用SignalTapII逻辑分析工具进行嵌入式的逻辑分析;支持软件源文件的添加和创建,并将它们链接起来生成编程文件;使用组合编译方式可一次完成整体设计流程;自动定位编译错误;高效的期间编程与验证工具;可读入标准的EDIF网表文件、VHDL网表文件盒Verilog网表文件;能生成第三方EDA软件使用的VHDL网表和Verilog网表文件。Max+plusII作为Altera的上一代PLD设计软件,由于其出色的易用性而得到了广泛的应用。目前Altera已经停止了对Max+plusII的更新支持。QuartusII是Altera公司继Max+plusII之后开发的一种针对其公司生产的系列CPLD/PGFA器件的综合性开发软件,它的版本不断升级,从4.0版到10.0版,这里介绍的是QuartusII8.0版,该软件有如下几个显著的特点:1、QuartusII的优点该软件界面友好,使用便捷,功能强大,是一个完全集成化的可编程逻辑设计环境,是先进的EDA工具软件。该软件具有开放性、与结构无关、多平台、完全集成化、丰富的设计库、模块化工具等特点,支持原理图、VHDL、VerilogHDL以及AHDL〔AlteraHardwareDescriptionLanguage等多种设计输入形式,内嵌自有的综合器以及仿真器,可以完成从设计输入到硬件配置的完整PLD设计流程。QuartusII可以在XP、Linux以及Unix上使用,除了可以使用Tcl脚本完成设计流程外,提供了完善的用户图形界面设计方式。具有运行速度快,界面统一,功能集中,易学易用等特点。2、QuartusII对器件的支持QuartusII支持Altera公司的MAX3000A系列、MAX7000系列、MAX9000系列、ACEX1K系列、APEX20K系列、APEXII系列、FLEX6000系列、FLEX10K系列,支持MAX7000/MAX3000等乘积项器件。支持MAXIICPLD系列、Cyclone系列、CycloneII、StratixII系列、StratixGX系列等。支持IP核,包含了LPM/MegaFunction宏功能模块库,用户可以充分利用成熟的模块,简化了设计的复杂性、加快了设计速度。此外,QuartusII通过和DSPBuilder工具与Matlab/Simulink相结合,可以方便地实现各种DSP应用系统;支持Altera的片上可编程系统〔SOPC开发,集系统级设计、嵌入式软件开发、可编程逻辑设计于一体,是一种综合性的开发平台。3、QuartusII对第三方EDA工具的支持对第三方EDA工具的良好支持也使用户可以在设计流程的各个阶段使用熟悉的第三放EDA工具。Altera的QuartusII可编程逻辑软件属于第四代PLD开发平台。该平台支持一个工作组环境下的设计要求,其中包括支持基于Internet的协作设计。Quartus平台与Cadence、ExemplarLogic、MentorGraphics、Synopsys和Synplicity等EDA供应商的开发工具相兼容。改进了软件的LogicLock模块设计功能,增添了FastFit编译选项,推进了网络编辑性能,而且提升了调试能力。2.2ModelSim介绍Mentor公司的ModelSim是业界最优秀的HDl语言仿真软件,它能提供友好的仿真环境,是业界唯一的但内核支持VHDL和Verilog混合仿真的仿真器。它采用直接优化的编译技术、Tcl/Tk技术、和单一内核仿真技术,编译仿真速度快,编译的代码与平台无关,便于保护IP核,个性化的图形界面和用户接口,为用户加快调错提供强有力的手段,是FPGA/ASIC设计的首选仿真软件。ModelSim主要特点:RTL和门级优化,本地编译结构,编译仿真速度快,跨平台跨版本仿真;单内核VHDL和Verilog混合仿真;源代码末班和助手,项目管理;集成了性能分析、波形比较、代码覆盖、数据流ChaseX、SignalSpay、虚拟对象VirualObject、Memory窗口、Assertion窗口、源码窗口显示信号值、信号条件断点等众多调试功能;C和Tcl/Tk接口、C调试;对SystemC的直接支持,和HDL任意混合;支持SystemVerilog的设计功能;对系统级描述语言的最全面支持,SystemVerilog、SystemC、PSL;可以单独或同事进行行为、RTL级、和门级的代码。ModelSim分几种不同的版本:SE、PE、LE和OEM,其中SE是最高级的版本,而集成在Actel、Atmel、Altera、Xilinx以及Lattice等FPGA厂商设计工具中的均是其OEM版本。SE版和OEM版在功能和性能方面有较大差别,比如对于大家都关心的仿真速度问题,以Xilinx公司提供的OEM版本ModelSimXE为例,对于代码少于40000行的设计,ModelSimSE比ModelSimXE要快10倍;对于代码超过40000行的设计,ModelSimSE要比ModelSimXE快近40倍。ModelSimSE支持PC、UNIX和LINUX混合平台;MentorGraphics公司提供业界最好的技术支持与服务。3设计原理本设计主要利用状态机进行整体设计,分部完成,便于大家分组进行合作,此设计要求完成对数据通路的架构,控制模块和运算器模块的设计,可进行加减乘除的基本运算。应用上周所学知识,利用状态机进行简易计算器的编写。简易计算器由键盘输入模块、键盘去抖动模块、状态机、计算模块、OP1、OP2模块、显示模块组成,结构清晰,易于编写。简易计算器采用自顶向下的设计原则,检测按键次数时,以scancode从非空到空的跳变使计数器加一,第一运算数则在press_count=1时,将scancode装配到bcd码最低位bcd[3:0],在press_count=2时,装配到bcd[7:4],……FSM在检测到+-×/键时,将bcd赋予bcd2,同时启动alu的操作alu_op。FSM根据scancode进度,输出对应的outsel,选择显示不同的bcd数据。计算器模块化设计原理图如图3-1所示。检测按键次数检测按键次数press_count第1运算数bcdFSM第2运算数bcdbcd2<+-*/>loadALUbcdbcd2alu_opresdisplayoutselopkeyscancode图图3-1简易计算器模块化设计原理图4模块化设计分析4.1键盘矩阵模块计算器输入数字和其他功能按键要用到很多按键,如果采用独立按键的方式,在这种情况下,编程会很简单,但是会占用大量的I/O口资源,因此在很多情况下都不采用这种方式,而是采用矩阵键盘的方案。矩阵键盘采用四条线作为行线,四条线作为列线组成键盘,在行线和列线的每个交叉点上设置一个按键。这样键盘上按键的个数就为4×4个。键盘模块采用4×4矩阵键盘,4位行线接上上拉电阻后接到高电平上,列线接上上拉电阻后依次给予低电平来判断哪个节点为低电平时即这个节点被按下,从而被读入到下一单元。矩阵键盘模块原理图如图4-1所示,矩阵键盘仿真波形如图4-2所示。图4-1矩阵键盘模块原理图图4-2矩阵键盘仿真波形4.2去抖模块设计作为机械开关的键盘,在开关开启或关闭的瞬间会出现电压抖动,消除抖动的方法一般有硬件和恶、软件的方法,一般进行软件处理,这样实现简单、设计灵活、节约成本。程序设计原理:按键去抖动关键在于提取稳定的电平状态,滤除抖动毛刺,对于一个按键信号,可以用一次脉冲对其进行取样,如果连续三次取样为低电平,则为低电平,如果不满足三次取样都为低,则认为按键稳定状态结束。去抖模块原理图如图4-3所示,仿真波形如图4-4所示。图4-3去抖模块原理图图4-4去抖模块仿真波形4.3ALU模块设计ALU模块主要实现数据的加减乘除运算,用VHDL代码描述逻辑单元、算数单元、选择器单元,要求输入两组二进制数据,利用元件例化语句将设计的三个单元进行组合,建立一个包含所有元件的包集。ALU模块原理图如图4-5所示,仿真波形图如图4-6所示。图4-5ALU模块原理图图4-6ALU模块仿真波形4.4FSM模块设计状态机由六个状态组成,主要是判断键盘输入的是数据还是运算符,从而来进行不同的运算,首先判断第一个输入的数据是否为数字,若不是数据则等待,若是数据则进入下一个状态等键盘弹起后判断下一个数据为数字还是运算符,若是数据则将数据存入OP1,若是运算符,则将数据存入OP1和OP2,并等待下一个数据的到来,状态机中值得注意的是在进行数据运算时,将运算的数据要存入OP1和OP2中。FSM模块原理图如图4-7所示,FSM仿真波形图如图4-8所示。图4-7FSM模块原理图图4-8FSM模块仿真波形图4.5OP1模块设计OP1模块的主要功能是实现数据的输入及存储,主要用来做被加数、被除数等,在第一次输入数据时,数据存入OP1等进行操作后,数据会被装载到OP1和OP2模块中,待数据被输入时更新OP1中的数据。OP1模块原理图如图4-9所示,仿真波形图如图4-10所示。图4-9OP1模块原理图图4-10OP1模块仿真波形4.6OP2模块设计OP2模块的主要功能是用来存储运算完成的数据,使计算器有连续计算的能力。当进行完一次运算后,此时OP2_LOAD为1,此时将运算完的数据装载到OP2模块中。OP2模块原理图如图4-11所示,仿真波形图如图4-12所示。图4-11OP2模块设计原理图图4-12OP2模块仿真波形图4.7BIN模块设计二进制模块的功能是将二进制数字转化成BCD码。BIN模块原理图如图4-13,仿真波形图如图4-14。图4-13BIN模块原理图图4-14BIN模块仿真波形4.8BCD模块设计BCD模块是将BCD码转化成二进制数字。BCD模块原理图如图4-14,仿真波形图如图4-15。图4-14BCD模块原理图图4-15BCD模块仿真波形5总结这次的设计,给我的印象很深,通过这次课程设计,我对EDA这门课程有了很好很深的理解。通过做计算器,我对QuartusII和ModelSim应用更加熟悉了。本次课程设计,要求做一个简易计算器,第一周首先由北京至芯科技公司的老师来为我们讲解相关的知识,讲解做计算器的方法。通过老师的讲解我对本课题有了一定的了解。但是,在对该课题有一定的了解的前提下,也发现了很多问题。认识到理论与实践之间的差距,联系实际的应用去理解只是比一大堆理论来的直接与清晰明了。本简易计算器的设计,是用QuartusII软件进行代码编写、原理图设计,用ModelSim软件来实现仿真。通过对简易计算器设计,熟悉了QuartusII的运行环境,初步掌握了VHDL语言基本库函数的调用和编写基本程序等应用;明白了原理图和代码之间的关系;学会了做一个工程的一般步骤,以及分模块化设计的好处。最后,我要在这里对给我这次课程设计提供帮助的魏老师和王老师,还有同学们说声诚挚的感谢。正是由于你们的帮助和支持,我才能克服一个一个的困难和疑惑,直至本次课程设计圆满完成。在这个过程中我学到了很多知识,不仅巩固了已有知识,而且强化了一些关于数学MATLAB软件应用方面的知识,非常感谢你们的帮助。参考文献[1]乔庐峰,王志功.数字电路设计教程[M].北京电子工业出版社,2010[2]潘松,黄继业.EDA技术实用教程〔第二版[M].科学出版社,2005[3]焦素敏,EDA应用技术[M].北京清华大学出版社,2002[4]谭会生,张昌凡.EDA技术及应用[M].XXXX电子科技大学出版社,2008[5]曾繁泰,陈美金.VHDL程序设计[M].北京清华大学出版社,2007附录键盘矩阵模块程序LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;ENTITYkeysIS PORT < clk:INSTD_LOGIC; rst:INSTD_LOGIC; row:INSTD_LOGIC_VECTOR<3downto0>; col:OUTSTD_LOGIC_VECTOR<3downto0>; scancode:OUTSTD_LOGIC_VECTOR<15downto0> >;ENDkeys;ARCHITECTUREkeys_architectureOFkeysIS signalcurrent_state,next_state:std_logic_vector<1downto0>; signalenable:std_logic;BEGIN process<clk,rst,enable> begin ifrst='1'thencurrent_state<="00"; elsifclk'eventandclk='1'andenable='0' then current_state<=next_state; endif; endprocess; process<rst,current_state,row> begin ifrst='1'thencol<="1111"; else casecurrent_stateis when"00"=> col<="1110"; next_state<="01"; when"01"=> col<="1101"; next_state<="10"; when"10"=> col<="1011"; next_state<="11"; when"11"=> col<="0111"; next_state<="00"; whenothers=>col<="1111";next_state<="00"; endcase; endif; endprocess; process<current_state,row> begin ifrst='1'thenscancode<=X"0000";enable<='0'; elsif current_state="00"then caserowis when"1110"=>scancode<=X"0001";enable<='1'; when"1101"=>scancode<=X"0002";enable<='1'; when"1011"=>scancode<=X"0004";enable<='1'; when"0111"=>scancode<=X"0008";enable<='1'; whenothers=>scancode<=X"0000";enable<='0'; endcase; elsifcurrent_state="01"then caserowis when"1110"=>scancode<=X"0010";enable<='1'; when"1101"=>scancode<=X"0020";enable<='1'; when"1011"=>scancode<=X"0040";enable<='1'; when"0111"=>scancode<=X"0080";enable<='1'; whenothers=>scancode<=X"0000";enable<='0'; endcase; elsifcurrent_state="01"then caserowis when"1110"=>scancode<=X"0100";enable<='1'; when"1101"=>scancode<=X"0200";enable<='1'; when"1011"=>scancode<=X"0400";enable<='1'; when"0111"=>scancode<=X"0800";enable<='1'; whenothers=>scancode<=X"0000";enable<='0'; endcase; else caserowis when"1110"=>scancode<=X"1000";enable<='1'; when"1101"=>scancode<=X"2000";enable<='1'; when"1011"=>scancode<=X"4000";enable<='1'; when"0111"=>scancode<=X"8000";enable<='1'; whenothers=>scancode<=X"0000";enable<='0'; endcase; endif; endprocess;ENDkeys_architecture;去抖模块程序LIBRARYieee;USEieee.std_logic_1164.all;ENTITYfilterIS PORT < clk:INSTD_LOGIC; rst:INSTD_LOGIC; scancode:INSTD_LOGIC_VECTOR<15downto0>; sc:OUTSTD_LOGIC_VECTOR<15downto0> >;ENDfilter;ARCHITECTUREfilter_architectureOFfilterIS signalcount:integerrange0to100001; signaltemp:STD_LOGIC_VECTOR<15downto0>; constantG1:integer:=100;BEGIN process<clk,rst,scancode> begin ifrst='1'thencount<=0; elsifclk'eventandclk='1'then ifscancode=X"0000"thencount<=0; elsifcount<G1thencount<=count+1; endif; endif; endprocess; process<rst,count,scancode> begin ifrst='1'thensc<=X"0000";temp<=X"0000"; else casecountis when0=> temp<=scancode; whenG1=> iftemp=scancodethen sc<=temp; elsesc<=X"0000"; endif; whenothers=>sc<=X"0000"; endcase; endif; endprocess;ENDfilter_architecture;ALU模块程序LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_unsigned.all;USEieee.std_logic_arith.all;ENTITYAULIS PORT < op1_in:INSTD_LOGIC_VECTOR<27downto0>; op2_in:INSTD_LOGIC_VECTOR<27downto0>; oprand:INSTD_LOGIC_VECTOR<2downto0>; AUL_OUT:OUTSTD_LOGIC_VECTOR<27downto0> >;ENDAUL;ARCHITECTUREAUL_architectureOFAULISBEGIN process<oprand,op1_in,op2_in> variabletemp,temp1,temp2:STD_LOGIC_VECTOR<27downto0>; variablet1,t2:integerrange0to268435455; variablet3:integerrange0to268435455; begin caseoprandis when"000"=>AUL_OUT<=op1_in; when"001"=> temp1:=op1_in; temp2:=op2_in; temp:=temp1+temp2; AUL_OUT<=temp; when"010"=> t1:=conv_integer<op1_in>; t2:=conv_integer<op2_in>; ift2>=t1then t3:=t2-t1; AUL_OUT<=conv_STD_LOGIC_VECTOR<t3,28>; elseAUL_OUT<=X"8888888"; endif; when"011"=>t1:=conv_integer<op1_in>; t2:=conv_integer<op2_in>; t3:=t1*t2; ift3<=99999999thenAUL_OUT<=conv_STD_LOGIC_VECTOR<t3,28>; elseAUL_OUT<=X"8888888"; endif; when"100"=> t1:=conv_integer<op1_in>; t2:=conv_integer<op2_in>; ift2=0thenAUL_OUT<=X"8888888"; elset3:=t2/t1;AUL_OUT<=conv_STD_LOGIC_VECTOR<t3,28>; endif; whenothers=>AUL_OUT<=op1_in; endcase; endprocess; ENDAUL_architecture;FSM模块程序LIBRARYieee;USEieee.std_logic_1164.all;ENTITYFSMIS PORT < clk:INSTD_LOGIC; rst:INSTD_LOGIC; sc:INSTD_LOGIC_VECTOR<15downto0>; op1_add:OUTSTD_LOGIC; op1_clear:OUTSTD_LOGIC; op1_load:OUTSTD_LOGIC; op2_load:OUTSTD_LOGIC; oprand:OUTSTD_LOGIC_VECTOR<2downto0> >;ENDFSM;ARCHITECTUREFSM_architectureOFFSMIS signalcurrent_state,next_state:STD_LOGIC_VECTOR<2downto0>:="000"; signalkey,number:STD_LOGIC; signaloperate:STD_LOGIC:='0'; signaltemp0,temp1:STD_LOGIC_VECTOR<2downto0>:="000";BEGIN process<sc> begin casescis whenX"0000"=>key<='0';number<='0'; whenX"0001"=>key<='1';number<='0';--"/" whenX"0002"=>key<='1';number<='0';--"X" whenX"0004"=>key<='1';number<='0';--"-" whenX"0008"=>key<='1';number<='0';--"+" whenX"0010"=>key<='1';number<='0';--"clear" whenX"0020"=>key<='1';number<='1';--"9" whenX"0040"=>key<='1';number<='1';--"6" whenX"0080"=>key<='1';number<='1';--"3" whenX"0100"=>key<='1';number<='1';--"0" whenX"0200"=>key<='1';number<='1';--"8" whenX"0400"=>key<='1';number<='1';--"5" whenX"0800"=>key<='1';number<='1';--"2" whenX"1000"=>key<='1';number<='0';--"=" whenX"2000"=>key<='1';number<='1';--"7" whenX"4000"=>key<='1';number<='1';--"4" whenX"8000"=>key<='1';number<='1';--"1" whenothers=>key<='0';number<='0'; endcase; endprocess; process<clk,rst> begin if<rst='1'>then current_state<="000"; elsif<clk'eventandclk='1'>then current_state<=next_state; endif; endprocess; process<current_state,rst,sc,key,number> begin ifrst='1'then op1_add<='0'; op1_clear<='0'; op1_load<='0'; op2_load<='0'; oprand<="000"; else casecurrent_stateis when"000"=> ifkey='1'then ifnumber='1'then next_state<="001"; else operate<=notoperate; next_state<="010"; endif; elsenext_state<="000"; op1_clear<='0'; oprand<="000"; op1_load<='0'; op2_load<='0'; endif; when"001"=> --shuzicaozuo ifnumber='1'then op1_add<='1';next_state<="001"; elseop1_add<='0';next_state<="000"; endif; when"010"=> ifoperate='0'then oprand<=temp0; casescis whenX"0001"=>temp1<="100";--"/" op2_load<='1'; op1_load<='1'; ifkey='1'then next_state<="010"; else next_state<="000"; endif; whenX"0002"=>temp1<="011";--"X" ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="010"; else op2_load<='0'; next_state<="000"; endif; whenX"0004"=>temp1<="010";--"-" ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="010"; else next_state<="000"; endif; whenX"0008"=>temp1<="001";--"+" ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="010"; else next_state<="000"; endif; whenX"0010"=>op1_clear<='1'; temp0<="000"; temp1<="000"; ifkey='1'then next_state<="010"; elsenext_state<="000"; endif; whenX"1000"=>temp1<="000"; ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="010"; else next_state<="000"; endif; whenothers=>next_state<="000"; endcase; elsenext_state<="100"; endif; when"100"=> oprand<=temp1; op1_load<='1'; casescis whenX"0001"=>temp0<="100"; ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="100"; else next_state<="000"; endif; whenX"0002"=>temp0<="011"; ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="100"; else next_state<="000"; endif; whenX"0004"=>temp0<="010"; ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="100"; else next_state<="000"; endif; whenX"0008"=>temp0<="001"; ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="100"; else next_state<="000"; endif; whenX"0010"=>op1_clear<='1';temp0<="000";temp1<="000"; ifkey='1'then next_state<="100"; elsenext_state<="000"; endif; whenX"1000"=>temp0<="000"; ifkey='1'then op2_load<='1'; op1_load<='1'; next_state<="100"; else next_state<="000"; endif; whenothers=>next_state<="000"; endcase; whenothers=>next_state<="000"; endcase; endif; endprocess; ENDFSM_architecture;OP1模块设计LIBRARYieee;USEieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;ENTITYop1IS PORT < sc:INSTD_LOGIC_VECTOR<15downto0>; add_sc:INSTD_LOGIC; clear:INSTD_LOGIC; load:INSTD_LOGIC; res_bcd:INSTD_LOGIC_VECTOR<31downto0>; rst:INSTD_LOGIC; op1_bcd:bufferSTD_LOGIC_VECTOR<31downto0> >;ENDop1;ARCHITECTUREop1_architectureOFop1IS signalcurrent_state,next_state:STD_LOGIC_VECTOR<2downto0>; signaltemp:STD_LOGIC_VECTOR<3downto0>;BEGIN process<sc> begin casescis whenX"0020"=>temp<=conv_std_logic_vector<9,4>;--"9" whenX"0040"=>temp<=conv_std_logic_vector<6,4>;--"6" whenX"0080"=>temp<=conv_std_logic_vector<3,4>;--"3" whenX"0100"=>temp<=conv_std_logic_vector<0,4>;--"0" whenX"0200"=>temp<=conv_std_logic_vector<8,4>;--"8" whenX"0400"=>temp<=conv_std_logic_vector<5,4>;--"5" whenX"0800"=>temp<=conv_std_logic_vector<2,4>;--"2" whenX"2000"=>temp<=conv_std_logic_vector<7,4>;--"7" whenX"4000"=>temp<=conv_std_logic_vector<4,4>;--"4" whenX"8000"=>temp<=conv_std_logic_vector<1,4>;--"1" whenothers =>null; endcase; endprocess; process<rst,clear,load,add_sc> begin ifload='1' thencurrent_state<="000"; elsifrst='1' thencurrent_state<="000"; elsifclear='1'thencurrent_state<="000"; elsifadd_sc'eventandadd_sc='0'then current_state<=next_state; endif; endprocess; process<rst,current_state,clear,load,temp,add_sc,res_bcd> variableop1_temp:STD_LOGIC_VECTOR<31downto0>; begin ifload='1'thenop1_temp:=X"00000000";op1_temp:=res_bcd; elsifrst='1'thenop1_bcd<=X"00000000";op1_temp:=X"00000000"; elsifclear='1'thenop1_bcd<=X"00000000";op1_temp:=X"00000000"; else casecurrent_stateis when"000"=> ifadd_sc='1'then op1_temp:=X"00000000"; op1_temp<3downto0>:=temp; op1_bcd<=op1_temp; next_state<="001"; elsenext_state<="000"; op1_bcd<=op1_temp; endif; when"001"=> ifadd_sc='1'then op1_temp<7downto4>:=temp; op1_bcd<7downto0><=op1_temp<3downto0>&op1_temp<7downto4>; next_state<="010"; elsenext_state<="001";op1_bcd<=op1_bcd; endif; when"010"=> ifadd_sc='1'then op1_temp<11downto8>:=temp; op1_bcd<11downto0><=op1_temp<3downto0>&op1_temp<7downto4>&op1_temp<11downto8>; next_state<="011"; elsenext_state<="010"; op1_bcd<=op1_bcd; endif; when"011"=> ifadd_sc='1'then op1_temp<15downto12>:=temp; op1_bcd<15downto0><=op1_temp<3downto0>&op1_temp<7downto4>&op1_temp<11downto8>&op1_temp<15downto12>; next_state<="100"; elsenext_state<="011"; op1_bcd<=op1_bcd; endif; when"100"=> ifadd_sc='1'then op1_temp<19downto16>:=temp; op1_bcd<19downto0><=op1_temp<3downto0>&op1_temp<7downto4>&op1_temp<11downto8>&op1_temp<15downto12>&op1_temp<19downto16>; next_state<="101"; elsenext_state<="100"; endif; when"101"=> ifadd_sc='1'then op1_temp<23downto20>:=temp; op1_bcd<23downto0><=op1_temp<3downto0>&op1_temp<7downto4>&op1_temp<11downto8>&op1_temp<15downto12>&op1_temp<19downto16>&op1_temp<23downto20>; next_state<="110"; elsenext_state<="101"; op1_bcd<=op1_bcd; endif; when"110"=> ifadd_sc='1'then op1_temp<27downto24>:=temp; op1_bcd<27downto0><=op1_temp<3downto0>&op1_temp<7downto4>&op1_temp<11downto8>&op1_temp<15downto12>&op1_temp<19downto16>&op1_temp<23downto20>&op1_temp<27downto24>; next_state<="111"; elsenext_state<="110"; op1_bcd<=op1_bcd; endif; when"111"=> ifadd_sc='1'then op1_temp<31downto28>:=temp; op1_bcd<31downto0><=op1_temp<3downto0>&op1_temp<7downto4>&op1_temp<11downto8>&op1_temp<15downto12>&op1_temp<19downto16>&op1_temp<23downto20>&op1_temp<27

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论