毕业设计(论文)基于FPGA的函数发生器.doc
目录 摘要.1第一章 概述.1第二章 EDA技术.12.1 EDA的论述.12.2 EDA的开发流程.22.3 EDA的开发工具.4第三章 控制系统的硬件结构设计.43.1函数信号发生器系统的原理.53.2函数信号发生器的硬件结构5第四章 控制系统的软件设计74.1函数信号发生器软件设计.74.2函数信号发生器功能模块的设计.84.3函数信号发生器顶层设计17第五章 控制系统的调试与运行.185.1函数信号发生器的调试.18 5.2下载设计到目标器中运行.22第六章 结束语.24参考文献.24致谢24 摘要:应用EDA技术完成一个电子产品的设计, 以 FPGA芯片中集成一个在电子生产或检测中通常用到函数信号发生器。在QUARTUS软件开发平台,输入原理图或硬件描述语言HDL完成的设计文件,系统将自动地完成逻辑编译、综合、仿真、目标芯片的适配编译、下载等的工作。设计的工作是利用编程的方式来进行对系统的功能的描述,在EDA工具的帮助下,应用相应的可编程器件,实现设计的最终结果。使常用到的函数信号发生器微型化,设计简单化,使用简单化。关键词: FPGA芯片 EDA技术 QUARTUS第一章 概述概述 EDA(electronic design automation,电子设计自动化)技术是现代电子工程领域的一门新技术。它提供了基于计算机和信息技术的电路系统设计方法。EDA技术的发展和推广应用极大地推动了电子工业的发展,随着EDA技术的发展,硬件电子电路的设计几乎全部可以依靠计算机来完成。这样就大大缩短了硬件电子电路设计的周期从而使制造商可以快速开发出品种多批量小的产品,以满足市的众多需求。EDA技术的推广是当今世界的一个技术热点。EDA技术是现代电子工业中不可缺少的一项技术。1.本课题的方案的特点与优势本设计是基于FPGA的多种波形的函数信号发生器而展开的,一个由传统的方法要有不少电子原件组合才能实现的功能,现在用极少器件就可以实现,采用ALTERA公司生产的FPGA为函数信号发生器的处理器,再经过DAC的转换,得出相应的波形。结构简单,操作方便。2.本课题的价值与意义现在我们的活生需要是指向着微型化和智能化的方向发展.这给电子设计师带来了不小的压力,人们要体积小.轻但功能又齐全的生活、生产的工具。体积小组成的器件必然要少而且它们运算控制能力又要强。所以本设计正是应对人们生产生活的需要,用PFGA集成一个函数信号发生器.3.本课题的设计任务在术设计中以ALTERA生产的FPGA/SPLD为核心芯片,采用康草科技的产品作为核心板。使用ALTERA公司推出的QUARTUS5.1软件作为我们的设计平台。这两个是人机交流的桥梁。在做出最后的功能前有必要先熟悉下开发工具和开发的流程。所以在第二章将全面地介绍下EDA技术,从第三章开始控制系统的硬件结构设计;第四章节论述智能函数的软件设计;第五章节讲述控制系统的调试与运行。第二章 EDA技术2.1 EDA的论述EDA(Electronic design automation)即电子设计自动化,它是近几年来迅速发展起来的将计算机软件.硬件.微电子技术交叉运用的现代电子学科,是20世纪90年代从CAD.CAM.CAT和CAE的概念发展而来的.EDA技术就是以计算机为工作平台.以EDA软件工具为开发环境.以硬件描述语言为设计语言。以ASIC为实现载体的电子产品自动化设计过程.在EDA软件平台上,根据原理图或硬件描述语言HDL完成的设计文件,自动地完成逻辑编译.化简.分割.综合及优化.布局布线.仿真.目标芯片的适配编译.逻辑映射和编程下载等工作.设计者的工作只限于软件的方式来完成对就的硬件功能的描述了,要EDA工具的帮助下,就应用相应的FPGA器件就可以得到最后的设计结果.尽管目标系统是硬件,但整个设计和修改过程如同完成软件设计一样方便和高效.当然我们这说的是EDA是狭义的EDA,主要是指数字系统的自动化设计.在这设计中是基于QUARTUS5.1为EDA的开发工具,以ALTERA生产的FPGA为核心芯片,采用康草科技的产品作为核心板,用这两者作为我们的桥梁,满足开发的需求. 在一切工作开始之前先了解下我们的工具FPGA芯片和QUARTUS软件.目前我们的要求集成电路的集成度超来超高,由于需求的推使,经历了PLA.PAL.GAL至现在的FPGA。各种性能和集成度都不断改进,能实现的功能也不断地丰富,当然开发起来也变得容易和快速,相应的投资也越小.因为涉及到的面也非常广,在此只对用到的FPGA作简要的说明.FPGA器件在结构上,由逻辑功能块排列,它的结构可以分为三部分:可编程逻辑功能块;可编程I/O单元;可编程内部连线资源。可编程逻辑块是FPGA的主体,可以根据设计灵活改变其内部的连接,完成不同的逻辑功能;可编程I/O它们是芯片与外界电路的接口部分,完成不同电气特性下对I/O信号的驱动与匹配需求.可编程内部连线资源是连通FPGA内部所有单元,连线的长度和工艺决定着信号在连线上的驱动能力和传输速度。常见FPGA的可编程逻辑功能块结构主要有3种类型:查表结构、多路开关结构和多级与非门结构。查找表结构的FPGA用得相当的多,所以就以它的逻辑实现原理为例,如下图所示 图 2.1查找表结构原理图A,B,C,D由FPGA芯片的管脚输入后进入可编程连线,然后作为地址线连到查找表LUT,LUT中已经事先写入了所有可能的逻辑结果,通过地址查找到相应的数据然后输出,这样组合逻辑就实现了。 该电路中D触发器是直接利用LUT后面D触发器来实现。时钟信号CLK由I/O脚输入后进入芯片内部的时钟专用通道,直接连接到触发器的时钟端。触发器的输出与I/O脚相连,把结果输出到芯片管脚,就完成了图2.1所示电路的功能。(以上这些步骤都是由软件自动完成的,不需要人为干预)FPGA的开发工具也是很多的,ALTERA公司的开发工具从MAX+PLUS升级至QUARTUS, QUARTUS由ALTERA公司不断地更新。在此用QUARTUS5.1这个版本的开发工具,它的功能强大使用起来简单,在第四章再详细论述。2.2 EDA的开发流程我们都上过图画课,上课前要先做哪些工作呢?我们先要有准备好作画时的工具,比如纸.笔.墨。工具有了,更重要的就是思考应怎样出色地完成我们的作品,都思考好了才动手画,最后得出满意的作品。在做每一个工程,也是一样,在它的开发前都是要先了解它要用到哪些工具,它的基本的开发流程,它具体要经过哪些过程,这样在做工程时才不会乱作一团忙忙碌碌而无所获。现在我们拥有了开发所用到的软硬件。接下来就到我们策划了。基于FPGA的开发流程如图2.2所示 : 图2.2 FPGA的流程图示图说明:1构思是一开始的必要的一个项目构思,在它的之后才动手做我们的项目。2建立工程是每个项目是着手做的第一步,QUARTUS以工程单元对设计过程进行管理。建立顶层图,可以这样理解,顶层图是一个容器,将整个工程的各个模块包容在里面,编译时就是将这些模块整合在一起。3采用ALTERA公司提供的各种功能模块。QUARTUS软件环境里包含了大量的常用功能模块,例如计数器.累加器.等等。如果采用这些功能模块将节省你许多宝贵的开发时间,带来事半功倍的效果。当然也可以自己去构造属于自己的功能模块。4将各个功能模块用线连起来,这个过程就像PROTEL连结各电器元件,把各个芯片连接起来,组成系统。5这时设计的系统就差不多出来了,下一步要为该设计选择芯片载体,才真正在物理上实现系统功能。这一步的主要工作是:选择芯片型号,为顶层图的各个输入输出信号分配芯片的管脚,设置编译选项,目的是让编译器知道更多更好的信息。6编译,这个过程像软件开发里的编译,但这过程比软件的编译要复杂得多,它毕竟最终要实现硬件里的物理结构,包含了优化逻辑的组合.综合逻辑以及布线等步骤.在QUARTUS这些集成环境会帮你自动完成这几个步骤的工作.如果设计出错了,系统就会有相应的提示,那么就要根据提示进行改正,直到编译成功。7编译后会生成.SOF和.POF的文件,前者是通过JTAG下载到FPGA内部,设计就能实现预期的功能,但断电后FPGA里的信息会丢失,后者可以下载到FPGA的配置芯片(EEPROM或FLASH芯片),掉电后这些配置信息不会丢失,重新上电后通过该配置芯片对FPGA的内部RAM进行配置.对于复杂的设计,工程编译了以后可以用QUARTUS的仿真功能或其它仿真软件(如MODELSIM)对设计反复进行仿真的验证,直到满足要求。2.3EDA常用的开发工具 EDA工具在EDA技术应用中占据极其重要的位置,EDA的核心是利用计算机完成电子设计全过程自动化,因此,基于计算机环境的EDA软件的支持是必不可少的。EDA工具大致可以分为如下5个模块: 1. 设计输入编辑器 2. 仿真器 3. HDL综合器 4. 适配器(或布线器) 5. 下载器当然这样的分类并不是绝对的,现在往往把各个EDA工具集成在一起,如用到的QUARTUS。一、设计输入编辑器 设计输入编辑器是工程设计的第一部,常用的设计输入方法有HDL语言输入(目前用得最多的是Verilog和VHDL),原理图输入、IP CORE输入(是指那些已设计好了的模块)。二、仿真器它有很多仿真工具但在这讲述一下基于FPGA的HDL的仿真,按仿真的描述的能级别的不同,HDL仿真器可以分为单独或综合完成以下各步骤:系统级的仿真、行为仿真、RTL级仿真、门级时序仿真。这个过程按仿真是否考虑延时分类,可以分为功能仿真的时序仿真,根据输入仿真文件的不同,可以由不同的仿真器完成,也可以由同一个仿真器完成. 三、HDL综合器 综合器的功能就是将设计者在EDA平台上完成的针对某个系统的HDL、原理图或状态图形描述,针对给定的硬件结构组件,进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述文件。由此可知综合器是软件描述与硬件实现的一座桥梁。综合的过程就是将电路的高级语言描述转换成低级的、可与FPGA的门陈列基本结构相映射的网表文件。四、适配器 适配器的功能是将由综合生成的网表文件配置于指定的目标器件中,产生最终的下载文件。适配器的目标器件(FPGA芯片)必须属于原综合器指定的目标器件系列。五、下载器 编程下载就是把设计下载到对应的实际器件,实现硬件设计。这几个器件都是由可编程器件厂商来提供,我们可以直接来用。第三章 函数信号发生器的硬件设计 3.1函数信号发生器系统的结构通过发函数信号发生器可以得到递增斜波、递减斜波、三角波、阶台波、正弦波、方波。这些波形的生产都是通过FPGA的核心芯片,各种运算都在FPGA中进行,直接输出选择的波形。其总的结构示意图如3.1: 图3.1 函数信号发生器的结构 其中CLK接在核心板上的50M的晶振,由于50M 的频率太高了,要对这个频率进行分频,为了简单起见,不再专门设计一个分频器,而调用QUARTUS里自带的计数器功能宏模块,采用计数器来代替分频器.RESET是用于复位之用,而SEL是用于波形的选择.通过了FPGA芯片和DAC0832就可以得到波形的输出.其中FPGA是函数信号发生器系统的结构中的核心,相当于电脑的CPU。从DAC0832输出的是电流,如要在DAC0832要输出端输出电压,可以用一个运器,对输出波形进行I/V转换,在放大器在的输入端加一个可变电阻,即可得到所需幅值。对于芯片所用到的电源核心板上已有提供,可以直接用。3.2函数信号发生器所用的硬件介绍 采用此技术的目的就是减少耗材,同时减小器件的体积提高性能,在相同的硬件结构系统中得到所需的功能.所以在这里用到的器件不多。函数信号发生器制作过程中用到的硬件有:4.5V的电源、以ALTERA公司生产的型号为CYCLONE 系列中的EP1C6Q240C8为目标芯片,和以这个目标芯片为核心的核心板,核心板是由康草科技生产,已是现成的,核心板上有稳压管及其供电系统、50MHZ的晶振、SDRAM:8Mbyte、Flash:2Mbyte、提供配置模式:JTAG和EPCS,此外所有IO配置管脚通过插针引出,下载设计到目标芯片时用到的并口下载数据线;还用到选择波形的按钮。由于这些波形产生都是在FPAG芯片中产生,产生的都是数字信号,比如三角波,它从00000000,CLK来一个上升延信号系统会自动给它加1,变成了00000001,再把这个8位二进制的信号输出来,这样周而复始地工作。而FPGA是只数字信号处理器,在模拟号转换它是显得很无助的。所以在它的输出端接上一个数模转换器,把数字信号转换成模拟信号输出。所以它由两部分组成:数据产生,数据的转换。一FPGA芯片 1所要的频率就是把50MHZ的频率通过分频的办法得到所要的频率。用通常的方法是专门设计一个分频器,但也可以通过调用QUARTUS带的计数器的模块宏。用到设置设计宽度为256,即可取0到256分频范围,在这我们都选择为250,由此可以计算输出的频率:F=50MHZ/500=100KHZ。T=10微秒2可以用3个物理的按钮给波形选择的信号,但大家都知道这样做挺累的,而且外围电路要复杂并也浪费了FPGA的片内资源。我们可以利用片内的资源去设计一个三位的六进制的加法计数器,用一个按钮就可以进行波形的选择。当复位时输出全为1,每按一次就是加法计数器就自动1,出来的就是选择波形的信号。3芯片的核心器件是函数信号发生器的处理部分。函数信号发生器是由递增斜波产生模块(icrs)、递减斜波产生模块(dcrs)、三角波产生模块(delat)、阶台波产生模块(ladder)、正弦波产生模块(sin)、方波产生模块(square)和输出波形选择模块(ch6a1),它们都是跟着输入的时钟的上升延而产生相应的数字信号,而输出到0832的则要由SEL产生的选择信号来决定。二.D/A转换模块1D/A转换器的类型很多,从输入电路来说,一般的D/A转换器都带有输入寄存器,与微机能直接对接。在这采用DAC0832分辨率8位的D/A转换集成电路芯片。它具有连接简单,转换控制方便、价格低廉等特点,在各微机系统中得到广泛的应用。如下面是DAC0832的结构框图:3.2芯片0832的内部结构图 8位D/A转换器,实际上是一个T型电阻网络,在外部运算放大器配合下完成D/A转换工作。DAC0832的内部包括两个8位寄存器、1个8位转换器和相应辅助电路:8位输入寄存器为第一级锁存器,它的锁存信号为ILE。当ILE为高电平、CS和WR1为低电平时,输入寄存器的输出随输入而变化。此后,WR1由低变高时,ILE变为低电平,此时,数据被锁存到输入寄存器中。我们这里这种工作方式。 8位DAC寄存器为第二级锁存器,它的锁存信号也称为通道控制信号。WR2和XFEB同时为低电平时,LE2为高电平,这时,8位的DAC寄存器的输出随输入而变化,此后,当WR2由低变高时,LE2变为低电平,将输入寄存器的信息锁存到DAC寄存器。2DAC0832内部有两个寄存器,能实现双缓冲、单缓冲和直通三种工作方式。我们用DAC0832的单缓冲的工作方式,也就只有用一个寄存器受到控制,这时将另一个寄存器的有关控制信号预设置成有效,使之开通.3DAC0832C 以电流形式输出转换结果,若要得到电压形式的输出结果需另加I/V转换电路,这时可采用运算放大器。于我们用到的单极性输出电路,输出电压的格式为:Vout=-(D×Vref/256)式中D为输入数字量的十进制值。因为转换结果Iout1接运算放大器的反相端,所以式中有一个负号。若Vref=+5V,当D=0-255(00HFFH)时,Vout=-(04.98)V.调整运算放大器的调零电位器。可以对D/A芯片进行零点补偿,调节外接于反馈回路的电位器RP1可以调整满量程。第四章 控制系统的软件设计4.1函数信号发生器软件设计规划设计的函数信号发生器就是为了得到递增斜波、递减斜波、三角波、阶台波、正弦波、方波这六种波形。并可通过按钮选择输出波形。从这一章开发进行对函数信号发生器数据产生的具体论述,函数信号发生器可以由递增斜波产生模块(icrs)、递减斜波产生模块(dcrs)、三角波产生模块(delat)、阶台波产生模块(ladder)、正弦波产生模块(sin)、方波产生模块(square)和输出波形选择模块(ch6a1)。先看下函数信号发生器内部的顶层设计的规划图,如图4.1: 图4.1函数信号发生器的软件模块如图可以看到,控制输入有三大块,一个是个按钮的数据选择命令的输入,一个是时时钟输入,它的频率将决定输出波形的频率,还有一个是复位键。在芯片里面要处理的就有波形产生器产生相应的数据后输出8位的数据到数据选择模块中,通过按钮发出选择数据的指令,6选1的数据选择器选择相应的数据进行输出,把这些数据输入D/A模块中,通过D/A模块对数据转换,在它的输出端就可得到相应的波形.下面讲述用VHDL语言描述各模块。首先为此工程建立一个放置与此工程相关的文件的文件夹下,此文件夹被EDA软件默认为工作库。最好将不同的设计项目放在不在不同的文件夹中。一个设计项目可以包含多个设计文件,这些文件包括所有的层次设计文件的由设计者或Q2软件产生的副文件。在这里我们在F盘中建立一个名为END的文件夹,在它的下面建立各模块的文件夹,C6、ICRS、DCRS、DELTA、LADDER、SIN、SQUARE、CH6A1。用于存放它们的设计文件或QUARTUS产生的副文件,再新建一个名为TOP的文件夹为顶层设计文件夹。必须注意文件夹不能用中文,且不可带空格。4.2模块设计4.2.1递增斜波产生模块(icrs) 1、运行QUARTUS软件建立工程,FILE 点击 NEW project wizad 后弹出指定工程名的对话框,在 DIECTORY选择F盘下的END文件夹,在NAME,TOP-LEVEL ENTITY中填写 ICRS,按NEX,出现添加文件对话框,这里可以不理它,直接按NEX进入一步,选择FPGA器件的型号,在FAMILY下拉框中选择CYCLONE系列的FPGA,然后在AVAILABLE DEVICES:根据核心板的FPGA型号选择FPGA型号,在这填写用到的FPGA的型号EP16240C8 ,注意在FILTERS一栏选上“SHOW ADVANCED DEVICES”可以显示所有器件的型号。执行下一步出现另一个对话框,在这是选择其它EDA工具的对话框,用QUARTUS的集成环境进行开发,因此这里不作任何改动。直接按NEX进入工程信息总概对话框。按FINISH即可建立一个名为ICRS的空项目。 2、建立一个VHDL文档,新建 弹出一个对话框,在对话框中DEVICE DESIGN FILES下选择VHDL FILE点击OK,进入了VHDL的编辑窗口。在文本输入窗口中输入如下程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;use ieee.std_logic_UNSIGNED.all;-调用库函数ENTITY ICRS IS -实体描述PORT(clk,reset:in std_logic; q:out STD_LOGIC_VECTOR(7 DOWNTO 0);-端口说明END ICRS;ARCHITECTURE behave OF ICRS IS -行为描述SIGNAL tm: STD_LOGIC_VECTOR(7 DOWNTO 0);BEGINPROCESS(clk,RESET)BEGINIF RESET='0' THEN -复位的条件tm<="00000000" ELSIF rising_edge(clk) THEN -上升延有效if tm="111111111" THEN -达到了峰值置零tm<="00000000"ELSE tm<=tm+1; -通过累加1实现阶台向上END IF;END IF;q<=tm;END PROCESS;END ARCHITECTURE behave ;说明 这一个用VHDL描述的产生递增波形的程序,其中CLK输入时钟端口,RESET为输入复位端口,Q为输出8位二进制端口。这是递增模块的VHDL的语言描述,其中VHDL在EDA中的应用可以将它分为三个主体部分,一个是库函数的调用,在里调用了VHDL中的非标准库IEEE库,第二部分是实体说明,就是对外在的端口的输入与输出格式进行定义,第三部分是对实体里面的行为进持描述,这是主体,执行具体行为都是在这里用VHDL语言讲述.这要它每来一个脉冲就加一,到了加到都是1时就置零,当复位信号为零时也置零.这样时间与脉冲就成了阶梯的关系,随着时间的转移数值也就不断地增加.在输出时用一个D/A转换后输出来的就是我们所要的递增斜波.输入了这些程序以后就将对输入的文本文件进行保存,注意要保存时复选上“addfile to current project”,将文件添加进工程,保存后会产生一个后缀名为.VHD文件,完了之后再进行编译,如果没错将会通过编译,并产生.SOF和.TOF。在下面将会用文图混合使用,故在这里我们要产生相对应的元件符号,以方便在原理图设计中调用功能的模块,所以都需要执行多一步,使它产生所需的功能模块,步骤如:FILECREATEUPDATE create symbol files for current file 执行时又像进入了编译的状态,结束之后就会产生一个实体描述对应的元件符号。到此我们就完成了第一个模块的设计。4.2.2递减斜波产生模块(dcrs)上面已详述了如何去建立存放设计的文件夹,在这里就不再重述了。在END的文件夹建一个名为DCRS文件夹,用于存放递减模块的设计。在文本输入窗中输入递减斜波的程序: LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY dcrs ISPORT(CLK,RESET:IN STD_LOGIC; Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END dcrs;architecture behave of dcrs isbeginprocess(clk,reset)variable tmp: std_logic_vector(7 downto 0);beginif reset='0' thentmp:="11111111"elsif rising_edge(clk) thenif tmp="00000000" thentmp:="11111111"else tmp:=tmp-1; -递减运算end if;end if;q<=tmp;end process;end behave;说明 这一个用VHDL描述的产生递减波形的程序,其中CLK输入时钟端口,RESET为输入复位端口,Q为输出8位二进制端口。有2个输入端口和一个8位二进制的输出端口,当它得到一个复位信号时就置1,每得到一个是升延设计数的数就减1,直到全为0,当全为零时它又会自动置1再继续减1,如此循环。在这产生的波形只是从最高地方向下走一步就减一个台阶,直到为零,同样需要用D/A进行转换。才能得到所要的波形。保存.编译无错后,产生一个元件符号的操作如上所述。最后将产生的文件都保存在名为dcrs的文件夹中4.2.3 三角波模块(delta)在END下新建一个名为DELTA的文件夹,由上所述的步骤输入如下三角波的程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY DELTA IS PORT(CLK,RESET:IN STD_LOGIC; Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END delta;ARCHITECTURE BEHAVE OF DELTA ISBEGINPROCESS(CLK,RESET)VARIABLE M :STD_LOGIC_VECTOR(7 DOWNTO 0);VARIABLE A:STD_LOGIC;BEGIN IF RESET='0' THEN M:="00000000"ELSIF RISING_EDGE(CLK) THENIF A='0' THENIF M="11111110" THENM:="11111111"A:='1'ELSE M:=M+1; -递增运算END IF;ELSE IF M="00000001" THENM:="00000000"A:='0'ELSEM:=M-1; -递减运算END IF;END IF;END IF;Q<=M;END PROCESS;END BEHAVE;这一个用VHDL描述的产生三角波的程序,其中CLK输入时钟端口,RESET为输入复位端口,Q为输出8位二进制端口。通过对M的累加和累减实现三角波的递增和递减波形,在输出端经D/A转换,就可以得可到平滑的三角波形。保存.编译无错后,执行如上实体创建的步骤,产生对应的元件符号。4.2.4阶梯波模块(ladder)在END下新建一个名为ladder的文件夹,由上所述步骤输入如下阶梯波的程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY ladder ISPORT(CLK,RESET:IN STD_LOGIC; q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0);END ladder;architecture behave of ladder isbegin process(clk,reset)variable n: std_logic_vector(7 downto 0);variable a: std_logic;beginif reset='0' thenn:="00000000"elsif rising_edge(clk) thenif a='0' thenif n="11111111" thenn:="00000000"a:='1'elsen:=n+16; -阶台常数为16a:='1'end if;else a:='0'end if;end if;q<=n;end process;end behave;这是用VHDL描述的产生阶梯波的程序,其中CLK输入时钟端口,RESET为输入复位端口,Q为输出8位二进制端口。改变递增的阶台常数,可以改变阶台的多少。保存.编译无错后,执行如上实体创建的步骤,产生对应的元件符号。4.2.5正弦波模块(sin)在END下新建一个名为sin的文件夹,由上所述输入如下正弦波的程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY sin ISPORT(CLK,clr:IN STD_LOGIC; d:OUT integer range 0 to 255 );END sin;architecture behave of sin isbeginprocess(clk,clr)variable b: integer range 0 to 63;beginif clr='0' thend<=0;elsif rising_edge(clk) thenif b=63 then -一个周期取64个点b:=0;elseb:=b+1;end if;case b is -查表输出when 00=>d<=255;when 01=>d<=254;when 02=>d<=252;when 03=>d<=249;when 04=>d<=245;when 05=>d<=239;when 06=>d<=233;when 07=>d<=225;when 08=>d<=217;when 09=>d<=207;when 10=>d<=197;when 11=>d<=186;when 12=>d<=174;when 13=>d<=162;when 14=>d<=150;when 15=>d<=137;when 16=>d<=124;when 17=>d<=112;when 18=>d<=99;when 19=>d<=87;when 20=>d<=75;when 21=>d<=64;when 22=>d<=53;when 23=>d<=43;when 24=>d<=34;when 25=>d<=26;when 26=>d<=19;when 27=>d<=13;when 28=>d<=8;when 29=>d<=4;when 30=>d<=1;when 31=>d<=0;when 32=>d<=0;when 33=>d<=1;when 34=>d<=4;when 35=>d<=8;when 36=>d<=13;when 37=>d<=19;when 38=>d<=26;when 39=>d<=34;when 40=>d<=43;when 41=>d<=53;when 42=>d<=64;when 43=>d<=75;when 44=>d<=87;when 45=>d<=99;when 46=>d<=112;when 47=>d<=124;when 48=>d<=137;when 49=>d<=150;when 50=>d<=162;when 51=>d<=174;when 52=>d<=186;when 53=>d<=197;when 54=>d<=207;when 55=>d<=217;when 56=>d<=225;when 57=>d<=233;when 58=>d<=239;when 59=>d<=245;when 60=>d<=249;when 61=>d<=252;when 62=>d<=254;when 63=>d<=255;when others=>null;end case;end if;end process;end behave;这一个用VHDL描述的产生三角波的程序,工作原理是查表输出。其中CLK输入时钟端口,CLR为输入复位端口,Q为输出8位二进制端口。保存.编译无错后,执行如上实体创建的步骤,产生对应的元件符号。4.2.6方波模块(square)在END下新建一个名为square的文件夹,由上所述步骤,输入如下方波的程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;USE IEEE.STD_LOGIC_UNSIGNED.ALL;ENTITY square ISPORT(CLK,clr:IN STD_LOGIC; Q:OUT integer range 0 to 255);END square;architecture behave of square issignal a: bit;beginprocess(clk,clr)variable cnt: integer; beginif clr='0' thena<='0'elsif rising_edge(clk) thenif cnt<63 then cnt:=cnt+1;else cnt:=0;a<=not a;end if;end if;end process;process(clk,a)beginif rising_edge(clk) thenif a='1' thenq<=255;elseq<=0;end if;end if;end process;end behave;这一个用VHDL描述的产生三角波的程序,其中CLK输入时钟端口,RESET为输入复位端口,Q为输出8位二进制端口。保存.编译无错后, 执行如上实体创建的步骤,产生对应的元件符号。4.2.7波形选择模块(ch6a1)在END下新建一个名为ch6a1的文件夹,由上所述输入如下波形选择的程序:LIBRARY IEEE;USE IEEE.STD_LOGIC_1164.ALL;ENTITY CH6A1 ISPORT(KEY:IN STD_LOGIC_VECTOR(2 DOWNTO 0);p0,p1,p2,p3,p4,p5:IN STD_LOGIC_VECTOR(7 DOWNTO 0);wr:out STD_LOGIC;cs:OUT STD_LOGIC;q: OUT STD_LOGIC_VECTOR