




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于FPGA的频率计设计摘要:现场可编程门阵列FPGA的出现给现代电子设计带来了极大的方便和灵活性,使复杂的数字电子系统设计变为芯片级设计,可编程器件最大的特点是可通过软件编程对其器件的结构和工作方式进行重构,能随时进行设计调整从而满足各种需求。FPGA是英文FieldProgrammableGateArray的缩写,它是在PAL,GAL,等可编程器件的基础上进一步发展的产物,它是采用了逻辑单元阵列LCA这样一个新概念,内部包括可配置逻辑模块,输出输入模块和内部连线三个部分。关键字:现场可编程门阵列FPGA、数字式频率计、VHDL、EDA、LCD;
ThefrequencyofdesignbasedonFPGAAbstract:ThefieldreprogrammablearrayFPGAtomodernelectronicdesigntheemergenceofbringsgreatconvenienceandflexibility,andmakethecomplexdigitalelectronicsystemdesignintochipleveldesign,programmabledevicesbiggestcharacteristicistobeabletoitsdevicesthroughprogrammingthestructureandtheworkingwayreconstructiondesigncan,atanytime,inordertomeetvariousneeds.FieldProgrammableGateFPGAisinEnglish,itistheabbreviationofArrayinGALPAL,basedonProgrammabledevicesforthefurtherdevelopmentoftheproduct,itistousethelogicelementArrayofsuchanewconcept,LCAinternalincludingconfigurablelogicmodule,outputinputmoduleandinternalattachment3parts.Keywords:thefieldreprogrammablearrayFPGA,digitalfrequencymeter,VHDL,EDA,LCD;
课题选择及开发环境课题选择意义1、全面掌握EDA(ForPCB)设计工具和设计技巧,并且具备一定可制造性设计理念。2、熟练使用测试仪器和具备一定的调试手段。3、领会信号完整性和电源完整性,能对系统不稳定状况作出初步判断。4、掌握数字电路,掌握硬件描述语言,掌握时序分析。5、掌握FPGA设计流程(包括:编译、综合、映射、布局布线、时序分析、形式验证、前仿真、后仿真)并熟练使用EDA(ForFPGA)软件群,同时实现必要的优化,以实现面积与速度的平衡。二、课题背景及国内外发展情况:频率计的基本功能是根据基准时钟对被测时钟进行检测,并且被测时钟的频率值在数码管进行显示。这里采用的工作原理是利用基准时钟产生1s的时间宽度,从而在这1s的时间宽度里对被测时钟计数,然后将最后的计数结果送到数码管显示。传统的数字频率计可以通过普通的硬件电路组合来实现,其开发过程、调试过程十分繁琐,而且由于电子器件之间的互相干扰,影响频率计的精度,也由于其体积较大,已不适应电子设计的发展要求。采用EDA(ElectronicDesignAutomation)的方法来完成频率计的设计,即通过VHDL硬件描述语言的设计,用FPGA来实现。FPGA即现场可编程逻辑器件是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可根据不同的配置模式,采用不同的编程模式。加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只需用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。同时EDA开发工具的通用性、设计语言的标准化以及设计过程几乎与所用器件的硬件结构无关,所以设计成功的各类逻辑功能块软件有很好的兼容性和可移植性,可以在很短的时间里完成十分复杂的系统设计。系统的硬件框架设计本系统由脉冲输入电路、整形滤波电路、核心控制电路(由FPGA构成)和输出显示电路组成,如图2所示控制的核心芯片FPGA:它由两大功能模块组成:(1)频率计数模块,包含两个部分,选通时间控制部分,可改变选通时间;计数部分,根据选通时间的长短对被测信号正脉冲进行计数;(2)扫描显示模块,对计数的结果进行扫描显示,从而完成整个测频率的过程。外围的电路相对简单,只有信号输入整形电路和LCD显示电路。系统的工作原理:是被测信号经整形生成矩形波(幅度0-5V)输入到控制核心芯片FPGA的计数模块,计数模块根据所提供的矩形波上升沿计数,计数时间则由选通时间控制部分决定,根据频率所处的范围来决定档位;将计数的结果给显示电路,通过扫描,在LCD上显示频率的大小。工具软件基础ProtelDXP软件ProtelDXP简介ProtelDXP是集所有设计工具于一身的、功能较强大的一种EDA软件。它具有良好的数据易交换性和开放性,形成了从电气原理到物理结构的电子设计自动化体系。该软件不仅在绘制原理图、印刷线路板布局、布线方面功能完备,还由于它内嵌一个功能强大的A/D混合信号仿真器,利用它设计人员能够方便、快捷地进行电路的原理图与印刷电路图的设计.随时可以对电路进行试验仿真和功能验证,甚至可以对当前的原理图进行仿真,察看和分析电路的性能指标,及时发现设计中所存在的问题并加以改正.提高电路设计的工作效率。ProtelDxp设计电路原理图到电路板PCB图的一般步骤电子电路设计的基础是设计好原理图,然后通过原理图的网络连接关系来设计电路板PCB图,一般来说,从原理图到电路板PCB图的设计步骤如下(1)将要绘制的原理图及对应的PCB图所需要的元器件封装列成表格,这样在绘图过程中就不会有元器件遗漏;(2)启动ProtelDXP系统建立后缀名为.SchDoc的原理图设计文件;(3)设置图纸大小确定整个电路图的总体布局;(4)加载原理图元件库;(5)放置好所有元件并连线;(6)对原理图进行电气规则检查,修改不完善的地方;(7)对上述原理图进行仿真,进一步验证电路图的可行性,并做相应的修改;(8)对修改后的原理图进行编译,生成PCB所需网络表;(9)启动PCB系统建立后缀名为.PcbDoc的PCB文件;(9)启动PCB系统建立后缀名为.PcbDoc的PCB文件;(10)回加载PCB元件库;(11)通过原理图生成的网络表将元器件的封装加载到PCB编辑器中;(12)对元器件进行布局;(13)PCB编辑器参数及PCB设计规则设置;(14)自动布线;(15)手工修改调整布局;(16)对PCB进行电路规则检查,修改不完善的地方;(17)对PCB板进行3D演示,来观看PCB电路板布局是否合理;AlteraQuartusII工具的使用QuartusII简介Altera公司的QuartusII设计软件提供完整的多平台设计环境,它能够直接满足特定设计的需要,为可编程芯片系统(SOPC)设计的综合性环境。QuartusII软件拥有FPGA和CPLD设计的所有阶段的解决方案,QuartusII设计流程如下图所示。编程和配置设计输入编程和配置设计输入综合布局布线时序分析仿真功耗分析调试工程更改管理时序逼近图1.1QuartusII设计流程图QuartusII设计工具支持基于VHDL、VerilogHDL的设计,其内部嵌有VHDL、VerilogHDL逻辑综合器。QuartusII可以利用第三方的综合工具如Synplify进行逻辑综合,也可以利用第三方的仿真工具如Modelsim进行仿真,此外QuartusII与MATLAB和DSPBuilder结合,可以进行基于FPGA的DSP系统开发。使用QuartusII内嵌的SOPCBuilder,配合NiosIIIDE集成开发环境,可以开发NiosII嵌入式软核处理器。图形用户界面设计流程QuartusII软件为设计流程的每个阶段提供QuartusII图形用户界面及命令行界面,可以在整个流程中使用这些界面中的一个,也可以在设计流程的不同阶段使用不同的界面。下图所示为QuartusII图形用户界面的功能:设计输入设计输入TextEditBlock&SyinbolEditorMegaWizardPlug-InManager综合Analysis&SynthesisVHDL、VerilogHDL&AHDLDesignAssisant布局布线FitterAssignmentEditorFlcorplanEditorChipEditorReportWindow时序分析TirningAnalyzerReportWindow仿真SimulatorWaveformEditor编程AssemblerProgrammerConvertProgrammingFiles系统设计SOPCBuilderDSPBuilder软件开发SoftwareBuilder基于块的设计LogicLockFloorplanEditorVQMWriterEDA界面EDANetlistWriter时序逼近FloorplanEditorLogicLock调试SignalTapIISignalProbeChipEditor工程更改管理ChipEditorResourcePropertyEditorChengeManager图2.1QuartusII图形用户界面的功能图2.2:QuartusII图形用户界面QuartusII图形用户界面的基本设计流程步骤使用NewProjectWizard(File菜单)建立新工程并指定目标器件或器件系列;使用TextEditor(文本编辑器)建立VerilogHDL、VHDL或Altera硬件描述语言(AHDL)设计。您可以使用BlockEditor(原理图编辑器)建立流程图或原理图。流程图中可以包含代表其它设计文件的符号。还可以使用MegaWizardPlug-InManager生成宏功能模块和IP内核的自定义变量,在设计中将它们实例化;(可选)使用AssignmentEditor、Settings对话框(Assignments菜单)、FloorplanEditor和/或LogicLock功能指定初始设计的约束条件;(可选)使用SOPCBuilder或DSPBuilder建立系统级设计;(可选)使用SoftwareBuilder为Excalibur™器件处理器或Nios嵌入式处理器建立软件和编程文件;使用Analysis&Synthesis对设计进行综合;(可选)使用仿真器对设计执行功能仿真;使用Fitter对设计执行布局布线。在对源代码进行少量更改之后,还可以使用增量布局布线;使用TimingAnalyzer对设计进行时序分析;使用仿真器对设计进行时序仿真;(可选)使用物理综合、时序底层布局图、LogicLock功能、Settings对话框和AssignmentEditor进行设计优化,实现时序关闭;使用Assembler为设计建立编程文件;使用编程文件、Programmer和Altera硬件编程器对器件进行编程;或将编程文件转换为其它文件格式以供嵌入式处理器等其它系统使用;(可选)使用SignalTapIILogicAnalyzer、SignalProbe功能或ChipEditor对设计进行调试;(可选)使用ChipEditor、ResourcePropertyEditor和ChangeManager进行工程更改管理;系统硬件设计系统硬件整体布线图系统的主要功能电路本系统设计中主要功能模块是FPGA主控模块,它是整个设计的中心和核心,外围电路主要包括晶振电路,模拟信号输入高速整形电路,复位电路,数码管显示电路以及JTAG下载电路。上图说明:该图为为本系统设计的主电路图,其分成2各模块,左边为宽带放大器模块,实现的是模拟电路板块的功能;右边的为CPLD模块,实现的是数字电路板块的功能。将其分化成两个区域是为了在移动或者拖动电路时,使两个模块各自的电路元件之间的相对位置不发生改变,确保其相对固定和完整。模块CPLD具体电路图,如下:宽带放大器模块电路图为:基于FPGA的系统设计关于CPLDCPLD主要是由可编程逻辑宏单元(MC,MacroCell)围绕中心的可编程互连矩阵单元组成。其中MC结构较复杂,并具有复杂的I/O单元互连结构,可由用户根据需要生成特定的电路结构,完成一定的功能。由于CPLD内部采用固定长度的金属线进行各逻辑块的互连,所以设计的逻辑电路具有时间可预测性,避免了分段式互连结构时序不完全预测的缺点。发展历史及应用领域20世纪70年代,最早的可编程逻辑器件--PLD诞生了。其输出结构是可编程的逻辑宏单元,因为它的硬件结构设计可由软件完成,所以它的设计比纯硬件的数字电路具有很强的灵活性,但其过于简单的结构也使它们只能实现规模较小的电路。为弥补PLD只能设计小规模电路这一缺陷,20世纪80年代中期,推出了复杂可编程逻辑器件--CPLD。目前应用已深入网络、仪器仪表、汽车电子、数控机床、航天测控设备等方面。器件特点它具有编程灵活、集成度高、设计开发周期短、适用范围宽、开发工具先进、设计制造成本低、对设计者的硬件经验要求低、标准产品无需测试、保密性强、价格大众化等特点,可实现较大规模的电路设计,因此被广泛应用于产品的原型设计和产品生产(一般在10,000件以下)之中。几乎所有应用中小规模通用数字集成电路的场合均可应用CPLD器件。CPLD器件已成为电子产品不可缺少的组成部分,它的设计和应用成为电子工程师必备的一种技能。关于VHDLVHDL的英文全名是Very-High-SpeedIntegratedCircuitHardwareDescriptionLanguage。翻译成中文就是超高速集成电路硬件描述语言。因此它的应用主要是应用在数字电路的设计中。目前,它在中国的应用多数是用在FPGA/CPLD/EPLD的设计中。当然在一些实力较为雄厚的单位,它也被用来设计ASIC。VHDL主要用于描述数字系统的结构,行为,功能和接口。除了含有许多具有硬件特征的语句外,VHDL的语言形式和描述风格与句法是十分类似于一般的计算机高级语言。VHDL的程序结构特点是将一项工程设计,或称设计实体(可以是一个元件,一个电路模块或一个系统)分成外部(或称可是部分,及端口)和内部(或称不可视部分),既涉及实体的内部功能和算法完成部分。在对一个设计实体定义了外部界面后,一旦其内部开发完成后,其他的设计就可以直接调用这个实体。特点功能强大、设计灵活。VHDL具有功能强大的语言结构,可以用简洁明确的源代码来描述复杂的逻辑控制。它具有多层次的设计描述功能,层层细化,最后可直接生成电路级描述。VHDL支持同步电路、异步电路和随机电路的设计,这是其他硬件描述语言虽不能比拟的。VHDL还支持各种设计方法,既支持自底向上的设计,又支持自顶向下的设计;既支持模块化设计,又支持层次化设计。支持广泛、易于修改。由于VHDL已经成为IEEE标准所规范的硬件描述语言,目前大多数EDA工具几乎都支持VHDL,这为VHDL的进一步推广和广泛应用奠定了基础。在硬件电路设计过程中,主要的设计文件是用VHDL编写的源代码,因为VHDL易读和结构化,所以易于修改设计。强大的系统硬件描述能力。VHDL具有多层次的设计描述功能,既可以描述系统级电路,又可以描述门级电路。而描述既可以采用行为描述、寄存器传输描述或结构描述,也可以采用三者混合的混合级描述。另外,VHDL支持惯性延迟和传输延迟,还可以准确地建立硬件电路模型。VHDL支持预定义的和自定义的数据类型,给硬件描述带来较大的自由度,使设计人员能够方便地创建高层次的系统模型。独立于器件的设计、与工艺无关。设计人员用VHDL进行设计时,不需要首先考虑选择完成设计的器件,就可以集中精力进行设计的优化。当设计描述完成后,可以用多种不同的器件结构来实现其功能。很强的移植能力。VHDL是一种标准化的硬件描述语言,同一个设计描述可以被不同的工具所支持,使得设计描述的移植成为可能。易于共享和复用。VHDL采用基于库(Library)的设计方法,可以建立各种可再次利用的模块。这些模块可以预先设计或使用以前设计中的存档模块,将这些模块存放到库中,就可以在以后的设计中进行复用,可以使设计成果在设计人员之间进行交流和共享,减少硬件电路设计。关于液晶显示液晶显示材料具有明显的优点:驱动电压低、功耗微小、可靠性高、显示信息量大、彩色显示、无闪烁、对人体无危害、生产过程自动化、成本低廉、可以制成各种规格和类型的液晶显示器,便于携带等。由于这些优点。用液晶材料制成的计算机终端和电视可以大幅度减小体积等。液晶显示技术对显示显像产品结构产生了深刻影响,促进了微电子技术和光电信息技术的发展。JHD162A特性 电参数:=5.0V10%,=0V,=25°C 显示内容:16字符*2行 字符点阵:5*7点 驱动方式:1/16D 可供型号:TNSTN(黄绿模灰模黑白模) 反射型带EL或LED背光源 EL/100VAC400HZ LED/4.2VDC 供电部分:2.2.2JHD162A应用部分1.应用电路图 2.外形尺寸/显示内容3.接口第1脚:VSS为电源地第2脚:VDD接5V电源正极第3脚:V0为液晶显示器对比度调整端,接正电源时对比度最弱,接地电源时对比度最高(对比度过高时会产生“鬼影”,使用时可以通过一个10K的电位器调整对比度)。第4脚:RS为寄存器选择,高电平1时选择数据寄存器、低电平0时选择指令寄存器。第5脚:RW为读写信号线,高电平(1)时进行读操作,低电平(0)时进行写操作。第6脚:E(或EN)端为使能(enable)端。第7~14脚:D0~D7为8位双向数据端。第15~16脚:空脚或背灯电源。15脚背光正极,16脚背光负极。4.读模式时序图 5.写模式时序图 6.指令表 指令指令码指令周期f=250KHZRSR/WDB7DB6DB5DB4DB3DB2DB1DB01清屏00000000011.64ms2光标返回000000001*1.64ms3设置输入方式00000001I/DS40us4显示开关0000001DCB40us5移位000001S/CR/L**40us6功能设置00001DLNF**40us7CGRAM地址设置0001ACG40us8DDRAM地址设置001ADD40us9忙标志/读地址计数器01BFAC0us10c10写数据40us11CGRAM/DDRAM数据读11读数据40us说明:它的读写操作、屏幕和光标的操作都是通过指令编程来实现的。(说明:1为高电平、0为低电平)指令1:清显示,指令码01H,光标复位到地址00H位置指令2:光标复位,光标返回到地址00H指令3:光标和显示模式设置I/D:光标移动方向,高电平右移,低电平左移S:屏幕上所有文字是否左移或者右移。高电平表示有效,低电平则无效指令4:显示开关控制。D:控制整体显示的开与关,高电平表示开显示,低电平表示关显示C:控制光标的开与关,高电平表示有光标,低电平表示无光标B:控制光标是否闪烁,高电平闪烁,低电平不闪烁指令5:光标或显示移位S/C:高电平时移动显示的文字,低电平时移动光标指令6:功能设置命令DL:高电平时为4位总线,低电平时为8位总线N:低电平时为单行显示,高电平时双行显示F:低电平时显示5x7的点阵字符,高电平时显示5x10的点阵字符指令7:字符发生器RAM地址设置指令8:DDRAM地址设置指令9:读忙信号和光标地址BF:为忙标志位,高电平表示忙,此时模块不能接收命令或者数据,如果为低电平表示不忙。指令10:写数据指令11:读数据。(四)系统软件设计本设计FPGA芯片采用的是Altera公司的Cyclone系列EP1C6T144C8芯片,该芯片的反应时间可达ns级,频率计的测频范围可为1Hz~999MHz。系统在兼顾测量精度和测量反应时间的基础上,实现了量程的自动转换,测量可以全自动地进行。其控制和逻辑电路是基于QuartusⅡ和VHDL语言进行设计,外部电路相当简单。主要源程序1.主程序libraryIEEE;useIEEE.STD_LOGIC_1164.all;useIEEE.STD_LOGIC_ARITH.all;useIEEE.STD_LOGIC_UNSIGNED.all;--librarywork;--usework.PkgLcd.all;entitylcdisport(clk:instd_logic;--4MHZFROMD12Reset:instd_logic;button1:instd_logic;button2:instd_logic;lcd_rs:outstd_logic;lcd_rw:outstd_logic;lcd_e:bufferstd_logic;data:outstd_logic_vector(7downto0);stateout:outstd_logic_vector(10downto0));endlcd;architectureBehavioraloflcdistypeCharModelisarray(0to13)ofstd_logic_vector(4downto0);constantUserDefinedChar:CharModel:=(("00111"),("00010"),("00110"),("00101"),("00110"),("00100"),("00100"),("01111"),("10001"),("01011"),("11101"),("01011"),("11101"),("00011"));typeLCDStateis(INIT,IDLE,CLEAR,SETMODE,SWITCHMODE,SHIFTL,SHIFTR,BLINK,SETFUNCTION,SETDDRAM,WRITERAM,CHECK,SETCGADDR,SENDCGDATA);signalstate:LCDState;constantcur_inc:std_logic:='1';constantcur_dec:std_logic:='0';constantcur_shift:std_logic:='1';constantcur_noshift:std_logic:='0';constantopen_display:std_logic:='1';constantopen_cur:std_logic:='0';constantblank_cur:std_logic:='0';constantshift_display:std_logic:='1';constantshift_cur:std_logic:='0';constantright_shift:std_logic:='1';constantleft_shift:std_logic:='0';constantdatawidth8:std_logic:='1';constantdatawidth4:std_logic:='0';constanttwoline:std_logic:='1';constantoneline:std_logic:='0';constantfont5x10:std_logic:='1';constantfont5x7:std_logic:='0';signalcounter:integerrange0to127;signalcounter1:integerrange0to127;signaldiv_counter:integerrange0to15;constantDIVSS:integer:=15;signalchar_addr:std_logic_vector(5downto0);signaldata_in1,data_in2,data_in3:std_logic_vector(7downto0);signaldata_in:std_logic_vector(7downto0);signalStringNumber:integerrange0to2;signalStringNumberLast:integerrange0to2;signalStringNumberChange:boolean;signalFunctionNumber:integerrange0to2;signalFunctionNumberChange:boolean;signalcButton1,cButton1Last:std_logic;signalcButton2,cButton2Last:std_logic;signalcButton1Pressed:boolean;signalcButton2Pressed:boolean;signalflag1:std_logic;signalflag2:std_logic;signalresponse1:std_logic;signalresponse2:std_logic;signalDisplayOn:std_logic;signalLineNumber:integerrange0to15;componentchar_ramgeneric(DisplayContent:string:="HelloChina");port(address:instd_logic_vector(5downto0);data:outstd_logic_vector(7downto0));endcomponent;componentchar_ram_userport(address:instd_logic_vector(5downto0);data:outstd_logic_vector(7downto0));endcomponent;componentClkGenport(clk:instd_logic;reset:instd_logic;clkout:outstd_logic;clkout1:outstd_logic;lcd_e_out:outstd_logic);endcomponent;signalclkdiv:std_logic;signalclk_int:std_logic;beginGenerateClks:ClkGenportmap(clk=>clk,reset=>reset,clkout=>clkdiv,clkout1=>clk_int,lcd_e_out=>lcd_e);String1:char_ramgenericmap(DisplayContent=>"WelcometoShanghaiSecondPolytechnicUniversity")portmap(address=>char_addr,data=>data_in1);String2:char_ramgenericmap(DisplayContent=>"07ComputerScienceS1")portmap(address=>char_addr,data=>data_in2);String3:char_ramgenericmap(DisplayContent=>"TaoCheng")portmap(address=>char_addr,data=>data_in3);process(reset,clk_int)beginif(reset='0')thencButton1<='0';cButton2<='0';elsif(rising_edge(clk_int))thencButton1<=button1;cButton2<=button2;endif;endprocess;process(reset,clk_int)beginif(reset='0')thencButton1Last<='1';cButton2Last<='1';elsif(rising_edge(clk_int))thencButton1Last<=cButton1;cButton2Last<=cButton2;endif;endprocess;cButton1Pressed<=(cButton1Last='0')and(cButton1='1');cButton2Pressed<=(cButton2Last='0')and(cButton2='1');process(reset,clk_int)beginif(reset='0')thenFunctionNumber<=0;elsif(rising_edge(clk_int))thenif(cButton2Pressed)thenif(FunctionNumber=2)thenFunctionNumber<=0;elseFunctionNumber<=FunctionNumber+1;endif;endif;endif;endprocess;--FuntionNumber=--0:rollingleft--1:rollingright--2:blinkeffectprocess(reset,clk_int)beginif(reset='0')thenStringNumber<=0;elsif(rising_edge(clk_int))thenif(cButton1Pressed)thenif(StringNumber=2)thenStringNumber<=0;elseStringNumber<=StringNumber+1;endif;endif;endif;endprocess;process(cButton1Pressed,response1)beginif(cButton1Pressed)thenflag1<='1';elsif(rising_edge(response1))thenflag1<='0';endif;endprocess;process(cButton2Pressed,response2)beginif(cButton2Pressed)thenflag2<='1';elsif(rising_edge(response2))thenflag2<='0';endif;endprocess;StringNumberChange<=(StringNumberLast/=StringNumber);data_in<=data_in1whenStringNumber=0elsedata_in2whenStringNumber=1elsedata_in3;char_addr<=conv_std_logic_vector(counter,6)whenstate=WRITERAMandcounter<64elseconv_std_logic_vector(counter-65,6)whenstate=WRITERAMandcounter>64andcounter<127else"000000";--stateout<=state;stateout<=(others=>'0');--StateMachineprocess(clk_int,Reset)beginif(Reset='0')thenresponse1<='0';response2<='0';lcd_rs<='0';lcd_rw<='0';data<=(others=>'0');state<=INIT;counter<=0;div_counter<=0;LineNumber<=0;elsif(rising_edge(clk_int))thencasestateiswhenINIT=>response1<='0';response2<='0';lcd_rs<='0';lcd_rw<='0';data<=(0=>'1',others=>'0');state<=SETCGADDR;whenSETCGADDR=>lcd_rs<='0';lcd_rw<='0';if(LineNumber>13)thenstate<=IDLE;elsestate<=SENDCGDATA;data<="01"&conv_std_logic_vector(LineNumber,6);endif;whenSENDCGDATA=>lcd_rs<='1';lcd_rw<='0';--data<="000"&UserDefinedChar(LineNumber);data<="00011111";LineNumber<=LineNumber+1;state<=SETCGADDR;whenIDLE=>response1<='0';response2<='0';lcd_rs<='0';lcd_rw<='0';data<=(others=>'0');counter<=0;div_counter<=0;LineNumber<=0;state<=CLEAR;whenCLEAR=>lcd_rs<='0';lcd_rw<='0';data<="00000001";state<=SETFUNCTION;whenSETFUNCTION=>lcd_rs<='0';lcd_rw<='0';data<="001"&datawidth8&twoline&font5x7&"00";state<=SETMODE;whenSETMODE=>lcd_rs<='0';lcd_rw<='0';data<="000001"&cur_inc&cur_noshift;state<=SWITCHMODE;whenSWITCHMODE=>lcd_rs<='0';lcd_rw<='0';data<="00001"&open_display&open_cur&blank_cur;state<=WRITERAM;whenWRITERAM=>lcd_rs<='1';lcd_rw<='0';data<=data_in;if(counter=32)thenstate<=SETDDRAM;counter<=counter+1;elsif(counter/=32andcounter<65)thenstate<=WRITERAM;counter<=counter+1;elseif(FunctionNumber=2)thenstate<=BLINK;elsif(FunctionNumber=0)thenstate<=SHIFTL;elsestate<=SHIFTR;endif;endif;whenSETDDRAM=>lcd_rs<='0';lcd_rw<='0';if(counter=0)thendata<="10000000";elsedata<="11000000";endif;state<=WRITERAM;whenSHIFTL=>lcd_rs<='0';lcd_rw<='0';data<="0001"&shift_display&left_shift&"00";--state<=IDLE;state<=CHECK;whenSHIFTR=>lcd_rs<='0';lcd_rw<='0';data<="0001"&shift_display&right_shift&"00";state<=CHECK;whenBLINK=>lcd_rs<='0';lcd_rw<='0';DisplayOn<=notDisplayOn;data<="00001"&DisplayOn&open_cur&blank_cur;state<=CHECK;whenCHECK=>lcd_rs<='0';lcd_rw<='0';data<=(others=>'0');if(flag1='1')then--thereisdisplaycontentchangeresponse1<='1';state<=IDLE;elsif(flag2='1')then--thereisdisplayfunctionchangeresponse2<='1';state<=IDLE;else--NOchangeif(div_counter=15)thendiv_counter<=0;if(FunctionNumber=2)thenstate<=BLINK;elsif(FunctionNumber=0)thenstate<=SHIFTL;elsestate<=SHIFTR;endif;elsediv_counter<=div_counter+1;state<=CHECK;endif;endif;whenothers=>state<=IDLE;endcase;endif;endprocess;endBehavioral; 2.调用定义字符libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;entitychar_ramisgeneric(DisplayContent:string:="HelloChina");port(address:instd_logic_vector(5downto0); data:outstd_logic_vector(7downto0) );endchar_ram;architecturefunofchar_ramistypeRAMisarray(1toDisplayContent'high)ofstd_logic_vector(7downto0);signalMyRam:RAM;typeram2isarray(0to7)ofstd_logic_vector(7downto0);constantcgram:ram2:=(("00001000"),("00001111"),("00010010"),("00001111"),("00001010"),("00011111"),("00000010"),("00000010"));functionchar_to_integer(indata:character)returnintegerisvariableresult:integerrange0to16#9F#;begin caseindatais when''=> result:=32; when'!'=> result:=33; when'"'=> result:=34; when'#'=> result:=35; when'$'=> result:=36; when'%'=> result:=37; when'&'=> result:=38; when'''=> result:=39; when'('=> result:=40; when')'=> result:=41; when'*'=> result:=42; when'+'=> result:=43; when','=> result:=44; when'-'=> result:=45; when'.'=> result:=46; when'/'=> result:=47; when'0'=> result:=48; when'1'=> result:=49; when'2'=> result:=50; when'3'=> result:=51; when'4'=> result:=52; when'5'=> result:=53; when'6'=> result:=54; when'7'=> result:=55; when'8'=> result:=56; when'9'=> result:=57; when':'=> result:=58; when';'=> result:=59; when'<'=> result:=60; when'='=> result:=61; when'>'=> result:=62; when'?'=> result:=63; when'@'=> result:=64; when'A'=> result:=65; when'B'=> result:=66; when'C'=> result:=67; when'D'=> result:=68; when'E'=> result:=69; when'F'=> result:=70; when'G'=> result:=71; when'H'=> result:=72; when'I'=> result:=73; when'J'=> result:=74; when'K'=> result:=75; when'L'=> result:=76; when'M'=> result:=77; when'N'=> result:=78; when'O'=> result:=79; when'P'=> result:=80; when'Q'=> result:=81; when'R'=> result:=82; when'S'=> result:=83; when'T'=> result:=84; when'U'=> result:=85; when'V'=> result:=86; when'W'=> result:=87; when'X'=> result:=88; when'Y'=> result:=89; when'Z'=> result:=90; when'['=> result:=91; when'\'=> result:=92; when']'=> result:=93; when'^'=> result:=94; when'_'=> result:=95; when'`'=> result:=96; when'a'=> result:=97; when'b'=> result:=98; when'c'=> result:=99; when'd'=> result:=100; when'e'=> result:=101; when'f'=> result:=102; when'g'=> result:=103; when'h'=> result:=104; when'i'=> result:=105; when'j'=> result:=106; when'k'=> result:=107; when'l'=> result:=108; when'm'=> result:=109; when'n'=> result:=110; when'o'=> result:=111; when'p'=> result:=112; when'q'=> result:=113; when'r'=> result:=114; when's'=> result:=115; when't'=> result:=116; when'u'=> result:=117; when'v'=> result:=118; when'w'=> result:=119; when'x'=> result:=120; when'y'=> result:=121; when'z'=> result:=122; when'{'=> result:=123; when'|'=> result:=124; when'}'=> result:=125; when'~'=> result:=126; --whencgram=>result:=16; when others=>result:=32; endcase; returnresult;endfunction;beginRamGen:foriin1toDisplayContent'highgenerateMyRam(i)<=conv_std_logic_vector(char_to_integer(DisplayContent(i)),8);endgenerate;DataOutput:process(address)beginif(conv_integer(unsigned(address))>DisplayContent'highoraddress="000000")thendata<=conv_std_logic_vector(char_to_integer(''),8);elsedata<=MyRam(conv_integer(unsigned(address)));endif;endprocessDataOutput;endfun;3.分频程序libraryieee;useieee.std_logic_1164.all;useieee.numeric_std.all;entityClkGenisport(clk:instd_logic;--4MHzclockfromoscillatorreset:instd_logic;--asynchronousreset,activehighclkout:outstd_logic;clkout1:outstd_logic;lcd_e_out:outstd_logic);--Outputclock50%dutycycleendClkGen;architecturertlofClkGenisconstantdivcnt:integer:=40000;signalclk_int:std_logic;signalclkcnt:integerrange0to50000;signalclkdiv:std_logic;signaltc_clkcnt:std_logic;signalclkint:std_logic;signallcd_e:std_logic;begin--rtlprocess(clk,reset)beginif(reset='0')thenclkcnt<=0;elsif(clk'eventandclk='1')thenif(clkcnt=divcnt)thenclkcnt<=0;elseclkcnt<=clkcnt+1;endif;endif;endprocess;tc_clkcnt<='1'whenclkcnt=divcntelse'0';process(tc_clkcnt,reset)beginif(reset='0')thenclkdiv<='0';elsif(tc_clkcnt'eventandtc_clkcnt='1')thenclkdiv<=notclkdiv;endif;endprocess;clkout<=clkdiv;process(clkdiv,reset)beginif(reset='0')thenclkint<='0';elsif(clkdiv'eventandclkdiv='1')thenclkint<=notclkint;endif;endprocess;clkout1<=clkint;process(clkdiv,reset)beginif(reset='0')thenlcd_e<='0';elsif(clkdiv'eventandclkdiv='0')thenlcd_e<=notlcd_e;endif;endprocess;lcd_e_out<=lcd_e;endrtl;系统调试运行系统调试软件调试VHDL代码生成:用VHDL代码生成各功能模块,再进行编译检查是否存在语法错误;各模块功能仿真:对VHDL代码生成各功能模块,再进行软件波形仿真;生成顶层示意图:在确保波形仿真正确的前提下,对每个功能模块执行CreateSymbolFilesforCurrentFile,生成顶层文件.bdf,再进行编译检查有没有错误。硬件调试检查元器件焊接:主要检查元器件有没有虚焊和元器件间有没有短路现象;检查CPLD片是否正常工作:上电后用手摸CPLD芯片表面,如果感觉很烫,说明不正常,并查看示波器上显示的波形是否稳定,正常;检查液晶屏是否显示正常:打开电源查看液晶屏是否灯亮,并调整对比度,使其在最佳状态;检查JTAG下载是否正常:首先将JTAG线连接到JTAG口,再在Quartus编译环境中查看是否能检测到FPGA芯片。(二)系统下载运行引脚配置图:在Quartus编译环境中对输入输出信号引脚定义到FPGA芯片的相应引脚上,如下图:引脚配置图下载图:然后对顶层文件进行编译链接,通过JTAG下载到系统中,如下图:下载图最后在外部扩展信号采集和相应的数码显示电路,就可以完成一个相对简单的数字频率计。结束语在开始接触这个课题的时候我本是完全没有思路,不了解自己的工作,然后通过冯老师的教导,知道我这次的主要的任务就是设计一个硬件能实现频率计,而这个硬件就是通过FPGA这个高频率的芯片。在做的过程中,遇到过很多困难,像是如何设计这个电路图,如何去封装,最主要的是我对频率计了解不多而且又缺乏实战经验,可谓是困难重重,多亏了冯老师的耐心教导和帮助一点点的让我步入轨道,帮我调整思路,明确自己的任务,一步一个脚印,终于到现在快要完成了。这次的毕业设计让我心里有很大的满足感,而且通过这次的学习让我对FPGA,VHDL,DXP有了更多的了解,在此我还是要特别谢谢我的指导老师冯筱林老师,在这次的毕业设计中他帮助了我很多,也很支持我,真的很谢谢他。参考文献:[1]Ki-JeongKwon.Choong-BumPark.HoonChoiAproxy-basedapproachformobilitysupportintheDDSsystem[2]JenqYCDigtalspectraofnonuniformlysampledsignals:fundamentalsandhighspeedwaveformdigitizers1998(2)[3]TimoRahkonen.HarriEksyma.AnttiMantyniemiADDSSynthesizerwithDigitalTimeDomainInterpolator2001[5]高仕友基于FPGA的DDS信号发生器的设计2009(10)[6]余勇基于FPGA的DDS正弦信号发生器的设计和实现2005(9)[7]期刊论文基于CPLD/FPGA的VHDL语言电路优化设计-现代电子技术2010,33(3)[8]期刊论文VHDL语言在FPGA中的应用-微计算机信息2006,22(35)[9]谭会生,张昌凡.EDA技术及应用[M].西安:西安电子科技大学出版社,2001.附录外文资料翻译—原文部分Field-programmablegatearrayAfield-programmablegatearray(FPGA)isa\o"Semiconductor"semiconductordevicethatcanbeconfiguredbythecustomerordesigneraftermanufacturing—hencethename"\o"Field-programmable"field-programmable".FPGAsareprogrammedusingalogic\o"Circuitdiagram"circuitdiagramora\o"Sourcecode"sourcecodeina\o"Hardwaredescriptionlanguage"hardwaredescriptionlanguage(HDL)tospecifyhowthechipwillwork.Theycanbeusedtoimplementanylogicalfunctionthatan\o"Application-specificintegratedcircuit"application-specificintegratedcircuit
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年药技医技考试试题及答案
- 安徽省淮北市2024-2025学年八年级(上)期末物理试卷(含解析)
- 2025年c 前端面试题及答案
- 2025年公共卫生相关试题及答案
- 2025年java开发 linux面试题及答案
- 2025年开学时间测试题及答案
- 2025年太原一模考试题及答案
- 2025年初中化学海水试题及答案
- 2025年船员常见面试题及答案
- 2025年文明行车科目一试题及答案
- 薄膜太阳能电池及制造工艺课件
- 基于Python的瓜子二手车网数据采集与分析
- 2024年江苏护理职业学院单招职业适应性测试题库附答案
- 砌砖看台施工方案
- 2020年同等学力申硕《计算机科学与技术学科综合水平考试》历年真题及答案
- 2024国际压疮护理指南
- 电厂应急救援培训
- 2024-2030年中国滑板车行业竞争策略及发展前景预测报告
- 2024-2030年中国建筑垃圾处理行业发展分析及投资规划研究报告
- 心理测试课件教学课件
- 出生证警示教育培训
评论
0/150
提交评论