基于fpga的简单运算器-课程设计(共29页).doc
精选优质文档-倾情为你奉上洛 阳 理 工 学 院课 程 设 计 报 告 课程名称 脉冲与数字电路 设计题目 简单运算器 专 业 通信工程 班 级 B 学 号 B 姓 名 LLL 完成日期 2012年6月7日 课 程 设 计 任 务 书设计题目: 基于FPGA的简单运算器 _设计内容与要求:设计能够进行基本的+、-、/、*运算的简单运算器,并且下载验证成功 指导教师: XXX 2012 年 6月 7日课 程 设 计 评 语 成绩: 指导教师:_ 年 月 日专心-专注-专业摘要本设计是一个运算器,由按键输入模块、控制信号产生模块、修正结果模块和显示模块四个模块外加逻辑运算部分总成。能够对数据进行各种运算,包括两个数的加减、与和异或。该运算器用Quartus II仿真软件设计,并测试功能正常,下载验证成功。关键词:运算器 按键输入模块 控制信号模块 修正结果模块 显示模块 运算器模块目录前言世界上第一片FPGA由美国Xilinx公司于1985年率先推出。进入21世纪之后,以FPGA为核心的单片系统(SOC)和可编程系统(SOPC)有了显著的发展,单片FPGA的集成规模已达到几百万门,其工作速度已超过300MHz。FPGA在结构上已经实现了复杂系统所需要的主要功能,并将多种功能集成在一片FPGA器件中,如嵌入式存储器、嵌入式乘法器、嵌入式处理器、高速I/O缓冲器、外置存储器接口和实现数字信号处理的DSP等功能。随着FPGA性能的不断完善,FPGA器件的种类日益丰富,受到世界范围内电子设计人员的普遍欢迎,并占据了较大的市场,其生产厂家也由原来的Xilinx公司一家增加到Altera、Actel、lattice等十几家公司。Altera公司的主要产品有:属于FPGA的FLEX、ACEX、APEX、Mercury、Excalibur、Stratix和Cyclone等系列;属于CPLD的MAX和Classic系列。开发工具有,被普遍认为是最优秀PLD 开发平台之一的MAX+Plus II和支持APEX、Mercury、Excalibur、Stratix和Cyclone系列器件的Quartus II开发软件。Cyclone系列器件是Altera公司推出的低价位FPGA产品,是Stratix系列的简化版,分为Cyclone I和Cyclone II两个系列。Cyclone I系列产品为基于1.5V、采用0.13um全铜SRAM工艺的低成本FPGA。Cyclone II 系列产品基于1.2V,采用0.09um全铜CMOS工艺,SRAM编程技术,其成本更低、容量更高、速度更快。它和高性能的Stratix II系列的FPGA是目前Altera公司主流产品。我的运算器主要是用VHDL语言编写,以Cyclone器件为依托,并下载到Altera仿真工具箱Cyclone-EP2C5T144C8验证功能成功,能够初步完成运算器的雏形。随着大规模集成电路技术和计算机技术的高速发展,在涉及通信、国防、工业自动化、计算机设计与应用、仪器仪表等领域的电子系统设计工作中,FPGA技术的含量正以惊人的速度提升。电子类的新技术项目的开发也更多地依赖于FPGA技术的应用,特别是随着HDL等硬件描述语言综合功能和性能的提高,计算机中许多重要的元件(包括CPU)都用硬件描述语言来设计和表达,许多微机CPU、硬核嵌入式系统(如ARM、MIPS)、软核嵌入式系统(如NiosII)、大型CPU,乃至整个计算机系统都用FPGA来实现,即所谓的单片系统SOC或SOPC(System On a Chip、System On a Programmerable Chip)。计算机和CPU的设计技术及其实现途径进入了一个全新的时代!不但如此,传统的CPU结构模式,如冯诺依曼结构和哈佛结构正在接受巨大的挑战。例如美国Wincom Systems 公司推出一款令人惊叹的服务器,其核心部分是由FPGA完成的超强功能CPU。该系统工作能力超过50台DELL或IBM计算机,或SUN Microsystems 公司的服务器。该服务器的处理速度要比传统服务器快50到300倍。我们知道,传统的PC机及服务器通常采用诸如Intel公司的奔腾处理器或SUN公司的SPARC芯片作为中央处理单元,而Wincom Systems的这款产品却没有采用微处理器,而是由FPGA芯片驱动。FPGA芯片的运行速度虽比奔腾处理器慢,但可并行处理多项任务,而微处理器一次仅能处理一项任务。因此,Wincom Systems的服务器只需配置几个价格仅为2000多美元的FPGA芯片,便可击败SUN公司的服务器或采用Intel处理器的计算机。50多年前,匈牙利数学家冯诺依曼提出了计算机的设计构想:通过中央处理器从储存器中存取数据,并逐一处理各项任务。然而现在,却采用FPGA取代传统微处理器获得了更高的性能,致使美国Xilinx公司的首席执行官Willem Roelandts 认为:“由冯诺依曼提出的电脑架构已经走到尽头”,“可编程芯片将掀起下一轮应用高潮”。FPGA芯片操作灵活,可以重复擦写无限次,而微处理器均采用固定电路,只能进行一次性设计。设计人员可通过改变FPGA中晶体管的开关状态对电路进行重写,即重配置,从而尽管FPGA芯片的时钟频率要低于奔腾处理器,但是由于FPGA芯片可并行处理各种不同的运算,所以可以完成许多复杂的任务。正如Willem Roelandts所说的,“我们认为下一代超级电脑将基于可编程逻辑器件”,他声称,这种机器的功能比目前最大的超级电脑还要强大许多倍。EDA专家William Carter认为,只要EDA开发工具的功能允许,将有无数的证据证明FPGA 具有这种神奇的能力,进而实现基于FPGA的超级电脑的开发。此外,美国加州大学伯克利分校和杨百翰大学的研究人员也正在设计基于FPGA的电脑,这些电脑可在运行中实现动态重配置。这对定位危险目标等军事应用和面容识别之类的计算密集型安全应用十分有用。由此看来,在计算机应用领域和计算机系统设计领域中,EDA技术和FPGA的应用方兴未艾!硬件描述语言HDL(Hardware Description Language)是EDA技术的另一重要组成部分,常见的HDL有:VHDL、Verilog HDL、System Verilog和SystemC。其中VHDL、Verilog在现在EDA设计中使用最多,也得到几乎所有的主流EDA工具的支持。而后两种HDL 语言尚处于完善过程中。VHDL语言具有很强的电路描述和建模能力,能从多个层次对数字系统进行建模和描述,从而大大简化了硬件设计任务,提高了设计效率和可靠性。VHDL具有与具体硬件电路无关和与设计平台无关的特性,并且具有良好的电路行为描述和系统描述能力,在语言易读性和层次化结构设计方面表现了强大的生命力和应用潜力。因此,VHDL支持各种模式的设计方法:自顶向下与自底向上或混合方法,在面对当今许多电子产品生命周期缩短,需要多次重新设计以融入最新技术、改变工艺等方面, VHDL都表现了良好的适应性。第一章 系统原理1.1编码原理本电路使用EP2C5T144C8设计,外加一个8按键电路和一个32位LCD显示器。能完成-7到7之内的加减乘除运算,并显示到LCD显示器上。其中8个按键从左到右依次是×,÷,+,UP,DN,C,=。限于只有8个按键,输入数字只能用两个按键(UP,DN),其中up表示增,dn表示减。在按运算符号之前,up和dn都是对第一个数操作的,按过运算符号之后up和dn都是对第二个数操作的。按等号之后运算结果显示在LCD显示器上。本电路并且有结果修正电路,对于超过8、-8的数字进行修正,可以方便的读出运算结果。顶层电路图 图1-1 顶层电路图第二章 系统工作过程2.1 按键输入模块2.1.1工作原理VHDL实现LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY KEY ISPORT( EN:OUT STD_LOGIC; YSF:OUT STD_LOGIC_VECTOR(1 DOWNTO 0); RSTN,CLK:IN STD_LOGIC; KEYA,KEYB:IN STD_LOGIC;KADD,KSUB,KAND,KXOR,KEQU:IN STD_LOGIC; A,B,C,D:OUT STD_LOGIC_VECTOR(3 DOWNTO 0); XSYSF:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); XA,XB:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END KEY;ARCHITECTURE ARCH OF KEY ISSIGNAL TKADD,TKSUB,TKAND,TKXOR,TKEQU :STD_LOGIC;SIGNAL TA,TB :STD_LOGIC_VECTOR(3 DOWNTO 0);BEGIN PROCESS(KEYA,RSTN)BEGINIF RSTN='0' THEN TA<="0000" ELSIF(KEYA'EVENT AND KEYA='1')THEN TA<=TA+1; END IF; END PROCESS;PROCESS(KEYB,RSTN)BEGINIF RSTN='0' THEN TB<="0000" ELSIF(KEYB'EVENT AND KEYB='1')THEN TB<=TB+1; END IF; END PROCESS;PROCESS(RSTN,KADD)BEGINIF RSTN='0' THEN TKADD<='0'ELSIF (KADD'EVENT AND KADD='1')THEN TKADD<='1'END IF;END PROCESS;PROCESS(RSTN,KSUB)BEGINIF RSTN='0' THEN TKSUB<='0' ELSIF (KSUB'EVENT AND KSUB='1')THEN TKSUB<='1'END IF;END PROCESS;PROCESS(RSTN,KAND)BEGINIF RSTN='0' THEN TKAND<='0' ELSIF(KAND'EVENT AND KAND='1')THEN TKAND<='1'END IF; END PROCESS;PROCESS(RSTN,KXOR)BEGINIF RSTN='0' THEN TKXOR<='0' ELSIF (KXOR'EVENT AND KXOR='1')THEN TKXOR<='1'END IF;END PROCESS;PROCESS(RSTN,KEQU)BEGINIF RSTN='0' THEN TKEQU<='0' ELSIF (KEQU'EVENT AND KEQU='1')THEN TKEQU<='1'END IF;END PROCESS;PROCESS(RSTN,CLK,TKADD,TKSUB,TKAND,TKXOR,TKEQU,TA,TB)BEGINIF RSTN='0' THEN YSF<="00"EN<='0'XSYSF<=""ELSIF(CLK'EVENT AND CLK='1')THEN IF TKADD='1' THEN YSF<="00"XSYSF<=""A<=TA;B<=TB;END IF; IF TKSUB='1' THEN YSF<="01"XSYSF<=""A<=TA;B<=TB;END IF; IF TKAND='1' THEN YSF<="10"XSYSF<=""A<=TA;C<=TB;END IF; IF TKXOR='1' THEN YSF<="11"XSYSF<=""A<=TA;D<=TB;END IF; IF TKEQU='1' THEN EN<='1'END IF;END IF;END PROCESS;PROCESS(TA,TB,CLK)BEGINIF(CLK'EVENT AND CLK='1')THEN CASE TA IS WHEN"0000"=>XA<="" WHEN"0001"=>XA<="" WHEN"0010"=>XA<="" WHEN"0100"=>XA<="" WHEN"0101"=>XA<="" WHEN"0110"=>XA<="" WHEN"0111"=>XA<="" WHEN"1000"=>XA<="" WHEN"1001"=>XA<="" WHEN"1010"=>XA<="" WHEN"1011"=>XA<="" WHEN"1100"=>XA<="" WHEN"1101"=>XA<="" WHEN"1110"=>XA<="" WHEN"1111"=>XA<="" WHEN OTHERS=>NULL;END CASE;CASE TB IS WHEN"0000"=>XB<="" WHEN"0001"=>XB<="" WHEN"0010"=>XB<="" WHEN"0011"=>XB<="" WHEN"0100"=>XB<="" WHEN"0101"=>XB<="" WHEN"0110"=>XB<="" WHEN"0111"=>XB<="" WHEN"1000"=>XB<="" WHEN"1001"=>XB<="" WHEN"1010"=>XB<="" WHEN"1011"=>XB<="" WHEN"1100"=>XB<="" WHEN"1101"=>XB<="" WHEN"1110"=>XB<="" WHEN"1111"=>XB<="" WHEN OTHERS=>NULL;END CASE;END IF;END PROCESS;END ARCH;2.1.2仿真分析 图2-1 仿真分析波形图2.2 控制信号产生模块2.2.1工作原理VHDL实现LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY CP3 IS PORT( RSTN,CLK:IN STD_LOGIC; CP,CPT,CPMUX:BUFFER STD_LOGIC; SADD,SSUB,SAND,SXOR:OUT STD_LOGIC_VECTOR(1 DOWNTO 0);END CP3;ARCHITECTURE BEHAVIORAL OF CP3 ISTYPE STATE1 IS(S0,S1,S2,S3,S4,S5,S6,S7,S8,S9,S10,S11);SIGNAL PRES1,NXS1:STATE1;TYPE STATE2 IS(SS0,SS1,SS2,SS3);SIGNAL PRES2,NXS2:STATE2;BEGINPROCESS(CLK,RSTN)BEGINIF(RSTN='0')THEN PRES1<=S0; ELSIF(CLK'EVENT AND CLK='1')THEN PRES1<=NXS1;END IF;END PROCESS;PROCESS(PRES1)BEGINCASE PRES1 ISWHEN S0=> CP<='1'CPMUX<='0'CPT<='0'NXS1<=S1;WHEN S1=> CP<='0'CPMUX<='0'CPT<='0'NXS1<=S2;WHEN S2=> CP<='0'CPMUX<='0'CPT<='0'NXS1<=S3;WHEN S3=> CP<='1'CPMUX<='1'CPT<='0'NXS1<=S4;WHEN S4=> CP<='1'CPMUX<='1'CPT<='0'NXS1<=S5;WHEN S5=> CP<='0'CPMUX<='0'CPT<='0'NXS1<=S6;WHEN S6=> CP<='0'CPMUX<='0'CPT<='0'NXS1<=S7;WHEN S7=> CP<='1'CPMUX<='1'CPT<='0'NXS1<=S8;WHEN S8=> CP<='1'CPMUX<='1'CPT<='0'NXS1<=S9;WHEN S9=> CP<='0'CPMUX<='1'CPT<='1'NXS1<=S10;WHEN S10=> CP<='0'CPMUX<='1'CPT<='1'NXS1<=S11;WHEN S11=> CP<='1'CPMUX<='1'CPT<='1'NXS1<=S11;END CASE;END PROCESS;PROCESS(CP,RSTN)BEGINIF(RSTN='0')THEN PRES2<=SS0; ELSIF(CP'EVENT AND CP='0')THEN PRES2<=NXS2;END IF;END PROCESS; PROCESS (PRES2)BEGINCASE PRES2 IS WHEN SS0=> SADD<="00"SSUB<="00"SAND<="00"SXOR<="00" NXS2<=SS1; WHEN SS1=> SADD<="01"SSUB<="00"SAND<="00"SXOR<="00" NXS2<=SS2; WHEN SS2=> SADD<="00"SSUB<="01"SAND<="10"SXOR<="11" NXS2<=SS3; WHEN SS3=> SADD<="00"SSUB<="01"SAND<="10"SXOR<="11" NXS2<=SS3;END CASE;END PROCESS;END BEHAVIORAL;2.2.2仿真分析 图2-2 仿真分析波形图2.3修正结果模块2.3.1工作原理VHDL实现LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XZJG IS PORT (RSTN:IN STD_LOGIC; S:IN STD_LOGIC_VECTOR(1 DOWNTO 0); CLK,OVER,COUT: IN STD_LOGIC; T:IN STD_LOGIC_VECTOR(3 DOWNTO 0); FH:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); SH,SL: OUT STD_LOGIC_VECTOR(3 DOWNTO 0);END XZJG;ARCHITECTURE BEHAVIORAL OF XZJG ISSIGNAL OC:STD_LOGIC_VECTOR(1 DOWNTO 0);SIGNAL TH,TL:STD_LOGIC_VECTOR(3 DOWNTO 0);BEGINPROCESS(RSTN,CLK,OVER,COUT)BEGINIF (CLK'EVENT AND CLK='1')THENOC<=OVER&COUT;END IF;END PROCESS;PROCESS(OC,CLK)BEGINIF(RSTN='0')THENTH<="0000"TL <="0000"ELSIF(CLK'EVENT AND CLK='1')THEN CASE OC IS WHEN "00"=>TH<="0000" CASE T IS WHEN "0000"=>TH <="0000"FH<="" WHEN "0001"=>TH <="0001"FH<="" WHEN "0010"=>TH <="0010"FH<="" WHEN "0011"=>TH <="0011"FH<="" WHEN "0100"=>TH <="0100"FH<="" WHEN "0101"=>TH <="0101"FH<="" WHEN "0110"=>TH <="0110"FH<="" WHEN "0111"=>TH <="0111"FH<="" WHEN "1000"=>TH <="1000"FH<="" WHEN "1001"=>TH <="0111"FH<="" WHEN "1010"=>TH <="0110"FH<="" WHEN "1011"=>TH <="0101"FH<="" WHEN "1100"=>TH <="0100"FH<="" WHEN "1101"=>TH <="0011"FH<="" WHEN "1110"=>TH <="0010"FH<="" WHEN "1111"=>TH <="0001"FH<="" WHEN OTHERS=>NULL;END CASE; WHEN "01"=>TH<="0000" CASE T IS WHEN "0000"=>TH <="0000"FH<="" WHEN "0001"=>TH <="0001"FH<="" WHEN "0010"=>TH <="0010"FH<="" WHEN "0011"=>TH <="0011"FH<="" WHEN "0100"=>TH <="0100"FH<="" WHEN "0101"=>TH <="0101"FH<="" WHEN "0110"=>TH <="0110"FH<="" WHEN "0111"=>TH <="0111"FH<="" WHEN "1000"=>TH <="1000"FH<="" WHEN "1001"=>TH <="0111"FH<="" WHEN "1010"=>TH <="0110"FH<="" WHEN "1011"=>TH <="0101"FH<="" WHEN "1100"=>TH <="0100"FH<="" WHEN "1101"=>TH <="0011"FH<="" WHEN "1110"=>TH <="0010"FH<="" WHEN "1111"=>TH <="0001"FH<="" WHEN OTHERS=>NULL;END CASE;WHEN"10"=>FH<="" CASE T IS WHEN "1000"=>TH<="0000"TL <="1000" WHEN "1001"=>TH<="0000"TL <="1001" WHEN "1010"=>TH<="0001"TL <="0000" WHEN "1011"=>TH<="0001"TL <="0001" WHEN "1100"=>TH<="0001"TL <="0010" WHEN "1101"=>TH<="0001"TL <="0011" WHEN "1110"=>TH<="0001"TL <="0100" WHEN OTHERS=>NULL;END CASE;WHEN"11"=>FH<="" CASE T IS WHEN "0000"=>TH<="0001"TL <="0110" WHEN "0001"=>TH<="0001"TL <="0101" WHEN "0010"=>TH<="0001"TL <="0100" WHEN "0011"=>TH<="0001"TL <="0011" WHEN "0100"=>TH<="0001"TL <="0010" WHEN "0101"=>TH<="0001"TL <="0001" WHEN "0110"=>TH<="0001"TL <="0011" WHEN "0111"=>TH<="0000"TL <="1001" WHEN OTHERS=>NULL; END CASE;END CASE;END IF;END PROCESS;PROCESS(RSTN,S,TH,TL,CLK)BEGINIF (RSTN='0')THEN SH<="0000"SL<="0000"ELSIF(CLK'EVENT AND CLK='0')THEN CASE S IS WHEN "00"=>SH<=TH;SL<=TL; WHEN "01"=>SH<=TH;SL<=TL; WHEN "10"=>SH<="0000"SL<=T; WHEN "11"=>SH<="0000"SL<=T; END CASE;END IF;END PROCESS;END BEHAVIORAL;2.3.2仿真分析表2-3 SOver cout 溢出情况00、010 0不溢出00、010 1不溢出00、011 0正溢出00、011 1负溢出10、11不修正 正溢出波形 图2-3-1 正溢出波形图负溢出波形 图2-3-2 负溢出波形图2.4 显示模块2.4.1工作原理VHDL实现LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_ARITH.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY XIANSHI IS PORT(CLK:IN STD_LOGIC; R0:IN STD_LOGIC_VECTOR(7 DOWNTO 0); R1,R2:IN STD_LOGIC_VECTOR(3 DOWNTO 0); R3,R4,R5:IN STD_LOGIC_VECTOR(7 DOWNTO 0); RS:BUFFER STD_LOGIC; RW:OUT STD_LOGIC; EN:OUT STD_LOGIC; CLK_OUT:BUFFER STD_LOGIC; D:BUFFER STD_LOGIC_VECTOR(7 DOWNTO 0);END XIANSHI;ARCHITECTURE BEHAVIORAL OF XIANSHI IS TYPE XIANSHI IS ARRAY(0 TO 31)OF STD_LOGIC_VECTOR(7 DOWNTO 0);SIGNAL QX :XIANSHI:=(OTHERS=>"");TYPE STATE IS (CLEAR,IDS,DLNF,DCB,DDRAM1,OUTDATA1,DDRAM2,OUTDATA2);SIGNAL COUNT :STD_LOGIC_VECTOR(15 DOWNTO 0);SIGNAL LCLK_OUT:STD_LOGIC;SIGNAL COUNTS :INTEGER RANGE 0 TO :=0;SIGNAL CURRENT_STATE:STATE;SIGNAL TEMPA:STD_LOGIC_VECTOR(4 DOWNTO 0):="00000"BEGINPROCESS(CLK_OUT,CLK)BEGIN IF(RISING_EDGE(CLK)THEN COUNTS<=COUNTS+1; IF(COUNTS=)THEN CLK_OUT<=NOT CLK_OUT; END IF; END IF;END PROCESS;QX(2)<=R3;QX(3)<=R4;QX(4)<=R5;QX(5)<=""QX(6)<=R0;QX(7)<="0011"&R1;QX(8)<="0011"&R2;PROCESS(CLK,LCLK_OUT)BEGIN IF(RISING_EDGE(CLK)THEN COUNT<=COUNT+1; IF(COUNT=0)THEN LCLK_OUT<=NOT LCLK_OUT; END IF; END IF;END PROCESS;EN<=LCLK_OUT;PROCESS(LCLK_OUT,CURRENT_STATE) BEGIN IF RISING_EDGE(LCLK_OUT)THEN RS<='0' RW<='0' CASE CURRENT_STATE IS WHEN CLEAR=>D<="" CURRENT_STATE<=DLNF; WHEN DLNF=>D<="" CURRENT_STATE<=IDS; WHEN IDS=>D<="" CURRENT_STATE<=DCB; WHEN DCB=>D<="" C