基于FPGA的实用电子砰设计论文_第1页
基于FPGA的实用电子砰设计论文_第2页
基于FPGA的实用电子砰设计论文_第3页
基于FPGA的实用电子砰设计论文_第4页
基于FPGA的实用电子砰设计论文_第5页
已阅读5页,还剩29页未读 继续免费阅读

下载本文档

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

文档简介

基于FPGA的电子称设计PAGE第34页共34页基于FPGA的实用电子称摘要:该设计以现场可编程门阵列FPGA为核心控制部件,并基于超高速硬件描述语言VHDL在Xilinx公司的SpartanⅡE系列的XC2S100E芯片上编程实现;系统的硬件部分包括FPGA最小系统板,数据采集、人机交互界面三大部分。最小系统部分主要是扩展了外部数据存储器,数据采集部分由压力传感器、信号的前级处理和A/D转换部分组成。人机界面部分为键盘输入,点阵式液晶显示,软件基于VHDL语言实现了本设计的全部控制功能,包括基本的称重功能,和发挥部分的显示购物清单的功能,并增加了时钟、过载提示欠量程提示、语音提示等创新功能。整机系统结构简单,使用方便。功能齐全,精度高,具有一定的开发价值。关键词:电子称,计价,压力传感器,FPGA,VHDLDesignofappliedElectronic-balanceBasedonFPGATutor:YanWangWeiqingXUZhengyuTangRenfuLan(ElectricEngineeringCollegeNanHuaUniversityAbstract:Thisisadesignforappliedelectronic-balancewhichisbasedonFPGA(FieldProgrammableGateArray).ThedesignwillbeachievedintheSpartan-IIE-XC2S100EchipofXilinxcorporationbyprogrammingwiththeVHDL(VeryHigh-speedDescriptionLanguage)ThehardwareofthesystemincludestheminimumsystemofFPGA,thedatacollector,theinterfaceofpersonandmachine.Theminimumsystem’sfunctionmainlyistoexpandthestorage,ThedatacollectoriscomposedofpressuresensorandA/Dconvertor,TheinterfaceofpersomandmachineincludeskeyboardandLCDdisplay.ThesoftwarewillachieveallcontrolfunctionsofthisdesignaccordingtothelanguageofVHDL.Thisfunctionsisincludingtoweighthefunctionbasically,andthefunctionoftheshoppingdetailedlist.Besides,weaddingseveralexpandingfunctionssuchasdisplayingclockandpromptingwhenthematterisoverload.Thestructureofthewholemachineissimple,theusageisconvenience.,theaccuracyishigh,Itisworthofempolderingtothisappliedelectronic-balance.Keyword:Theelectronicbalance,Pressuresensor,FPGA,VHDL目录第一章系统方案的设计 41.1电子称的设计要求 41.1.1基本要求 41.1.2发挥部分 41.1.3创新部分 41.2设计的基本思路 41.3系统方案比较和论证 41.1.3控制器 41.3.2前级放大器 51.3.3A/D转换器 61.3.4显示输出电路 61.4系统组成 7第二章单元电路设计 72.1称重传感器 72.2前端信号处理 82.3A/D转换电路 92.4主控制控制电路 102.5人机交互界面 112.5.1键盘接口电路 112.5.2LCD显示接口电路 122.5.3LED数码管显示电路 122.6日历时钟电路 132.7电源电路 142.8其它扩展电路 142.8.1通讯接口电路 142.8.2语音电路 152.8.3报警电路 16第三章系统软件的设计 163.1开发软件及编程语言简介 163.2系统软件的设计 163.1.1软件率程序流程 163.1.2VHDL模块设计 173.2.3程序设计顶层映射原理 193.3程序清单及仿真 19第四章系统测试 214.1测试仪器清单 214.2测试方法 214.3测试结果和误差分析 214.3.1测试结果 214.3.2误差计算及分析 22第五章设计总结 22参考文献 22附录1主要元器件清单 23附录2印制板图 23附录3程序清单 24第一章系统方案的设计1.1电子称的设计要求1.1.1基本要求能用简易键盘设置单价,加重后能同时显示重量、金额和单价;重量显示:单位为公斤;最大称重为9.999公斤,重量误差不大于±0.005公斤;单价金额及总价金额显示:单价金额和总价金额的单位为元,最大金额数值为9999.99元,总价金额误差不大于0.01元;具有去皮功能和总额累加计算功能。1.1.2发挥部分能显示购物清单,自拟10种商品名称或代号,清单内容包括:商品名称,数量,单价,金额,本次购物总金额。清单内容的商品名称等可使用代号显示;清单内容增加购货日期和收银员编号;清单内容在(2)的基础上增加售货单位名称(自拟),且全部内容采用中文显示。1.1.3创新部分在完成基本要求和题目所提出的发挥部分要求的情况下,考虑到电子称实际应用的需要,又增加了时钟功能,另外由于实际当中,称可以有一定量的过载,但不能超出要求的范围,为此我们还设计了过载提示功能。1.2设计的基本思路题目要求设计一个实用电子称,按照设计的基本要求,系统可分为三大模块,数据采集模块、控制器模块、人机交互界面模块。其中数据采集模块完成对来自稳重传感器的电压信号的检测、放大、AD转换。此时的数字信号送给控制器处理,由控制器完成被测物体重量的判断、显示等功能。此部分对软件的设计要求比较高,系统的大部分功能都需要软件来控制。在扩展功能上,本设计增加了一个时钟芯片(PCF8563)用以显示购物日期/时钟,一个声光报警电路用以过载提示。1.3系统方案比较和论证1.3.方案一基于51系列单片机来实现。目前单片机技术比较成熟,功能也比较强大,被测信号经放大整形后送入单片机,由单片机对测量信号进行处理并根据相应的数据关系译码显示出被测物体的重量,由于系统需要的按键较多,因此要加一个键盘显示管理芯片(ZLG7289)原理方框图如图1.3单片机控制适合于功能比较简单的控制系统,而且其具有成本低,功耗低,体积小算术运算功能强,技术成熟等优点.但其缺点是外围电路比较复杂,编程复杂。使用这种方案会给系统设计带来一定的难度。MCUMCUAT89S52放大器AD转换器显示器键盘电路时钟芯片传感信号ZLG7289图1.方案二采用现场可编程门阵列(FPGA)为控制核心采用现场可编程门阵列(FPGA)为控制核心,利用EDA软件编程,下载烧制实现。系统集成于一片Xilinx公司的SpartanⅡ系列XC2S100E芯片上,体积大大减小、逻辑单元灵活、集成度高以及适用范围广等特点,可实现大规模和超大规模的集成电路。采用FPGA测频测量精度高,测量频率范围大,而且编程灵活、调试方便,本设计要求的精度较高,所以要求系统的稳定性要好,抗干扰能力要强。因此,我们决定采用方案二,即采用FPGA为控制核心。1.3.压力传感器输出的电压信号为毫伏级,所以对运算放大器要求很高。我们考虑可以采用以下几种方案可以采用:方案一利用普通低温漂运算放大器构成多级放大器。普通低温漂运算放大器构成多级放大器会引入大量噪声。由于A/D转换器需要很高的精度,所以几毫伏的干扰信号就会直接影响最后的测量精度。所以,此中方案不宜采用。方案二由高精度低漂移运算放大器构成差动放大器。差动放大器具有高输入阻抗,增益高的特点,可以利用普通运放(如OP07)做成一个差动放大器。此方案原理图如图1.3.图1.电阻R1、R2电容C1、C2、C3、C4用于滤除前级的噪声,C1、C2为普通小电容,可以滤除高频干扰,C3、C4为大的电解电容,主要用于滤除低频噪声。优点:输入级加入射随放大器,增大了输入阻抗,中间级为差动放大电路,滑动变阻器R6可以调节输出零点,最后一级可以用于微调放大倍数,使输出满足满量程要求。输出级为反向放大器,所以输出电阻不是很大,比较符合应用要求。缺点:此电路要求R3、R4相等,误差将会影响输出精度,难度较大。实际测量,每一级运放都会引入较大噪声。对精度影响较大。方案三采用专用仪表放大器INA126实现。此芯片内部采用差动输入,共模抑制比高,差模输入阻抗大,增益高,精度也非常好,且外部接口简单。INA126接口如图1.3.3所示。可以图1.基于以上分析,我们决定采用方案三实现前级放大功能,即制作方便而且精度很好的专用仪表放大器INA126。1.3.由上本设计使用的压力传感器和精度的分析可知:A/D转换器误差应在以下12位A/D精度:10Kg/4096=2.44g14位A/D精度:10Kg/16384=0.61g考虑到其他部分所带来的干扰,12位A/D无法满足系统精度要求。所以我们需要选择14位或者精度更高的A/D。方案一逐次逼近型A/D转换器,如:ADS7805、ADS7804等。逐次逼近型A/D转换,一般具有采样/保持功能。采样频率高,功耗比较低,是理想的高速、高精度、省电型A/D转换器件。高精度逐次逼近型A/D转换器一般都带有内部基准源和内部时钟,基于FPGA构成的系统设计时仅需要外接几个电阻、电容。但考虑到所转换的信号为一慢变信号,逐次逼近型A/D转换器的快速的优点不能很好的发挥,且根据系统的要求,14位AD足以满足精度要求,太高的精度就反而浪费了系统资源。所以此方案并不是理想的选择。方案二双积分型A/D转换器:如:TLC7135/ICL7135、ICL7109等。双积分型A/D转换器精度高,但速度较慢(如:TLC7135),具有精确的差分输入,输入阻抗高(大于103M双积分型A/D转换器具有很强的抗干扰能力。对正负对称的工频干扰信号积分为零,所以对50HZ的工频干扰抑制能力较强,对高于工频干扰(例如噪声电压)已有良好的滤波作用。只要干扰电压的平均值为零,对输出就不产生影响。尤其对本系统,缓慢变化的压力信号,很容易受到工频信号的影响。故而采用双积分型A/D转换器可大大降低对滤波电路的要求。作为电子秤,系统对AD的转换速度要求并不高,精度上14位的AD足以满足要求。另外双积分型A/D转换器较强的抗干扰能力和精确的差分输入,低廉的价格。综合的分析其优点和缺点,我们最终选择了方案二,即使用TLC7135对信号进行AD转换。。1.3.4方案一全部采用数码管显示,数码能显示时钟,以及被测物体的重量等信息,此方案显示直观,而且编程简单,但若要同时显示单价,金额售货员编号等诸多信息则需要要大量的数码管,而且不能显示中文。由此增加了电路的复杂程度。也加大了编程的难度。方案二使用LED与字符型LCD相结合显示。考虑到系统要求显示的信息量较多,可以用LED与LCD分别显示不同信息,LED可以显示时钟和特重量,LCD采用带中文字库的144*32点阵式液晶显示器系列:LM3037,,可以设置显示单介,金额,中文,购物日期等。LCD具有低功耗、可视面大、画面友好抗干扰能力强等功能,在显示技术已得到广泛应用。由上述分析综合,我们采用了方案二,让其各自完成相应的显示任务。1.4系统组成经过方案比较和论证,最终确定的系统组成框图如图1.4.1所示。图1.第二章单元电路设计2.1称重传感器按照设计的要求,称重范围0~9.999Kg,重量误差不大于Kg,考虑到秤台自重、振动和冲击分量,还要避免超重损坏传感器,所以传感器量程必须大于额定称重(9。999Kg)。采用的是湖南宇航科技限公司生产的LS-1型传感器,表2。1。1为称重传感器的技术指标。其量程为20Kg,精度为±,满量程时误差0.002Kg。可以满足本系统的精度要求。其原理如图2.1.1表2.1.灵敏度mv/v1±0.10(1-3kg)2±0.10(6-25kg)非线性%FS±0.02重复性0.02蠕变%FS/30min±0.02零点输出%FS±1零点温度系数%FS/10±0.02输入电阻Ω420±15输出电阻350±3绝缘电阻MΩ≥5000供桥电压V10(DC/AC)MAX:15(DC/AC)温度补偿范围℃-10~+50允许温度范围-20~+60允许过负荷%FS150连接电缆mmΦ4×400连接方式输入:红(+)、黄(-)输出:蓝(+)白(-)图2.LS-1称重传感器是利用电阻应变原理构成,当外力F直接作用在贴有R1,R2,R3,R4四片应变的弹性体上时,弹性体发生变形,电阻应变片的阻值发生变化,致使电桥发失去平衡,在R1、R3输入额定桥压时,R2、R4上刚有与外力成正比的电压信号输出。输出信号电压可由下式给出:2.2前端信号处理由于稳重传感器输出的信号为毫伏级信号,比AD转换器的输入信号低2-3个数量级,故需要设计一个前置放大器。经过方案比较和论证,我们选择了仪用放大器INA126,构成的放大器及去皮电路。其电路原理图如图2.图2.图中,通过调节RAD1的阻值来改变放大倍数。其放大增益为微弱信号Vi1和Vi2被分别放大后从INA126的第6脚输出。A/D转换器TLC7135的输入电压变化范围是-2V~+2V,传感器的输出电压信号在0~20mv左右,因此放大器的放大倍数在200~300左右,可将R接成100K的电位器。由于TLC7135对高频干扰不敏感,所以滤波电路主要针对工频及其低次谐波引入的干扰。因为压力信号变化十分缓慢,所以滤波电路可以把频率做得很低。图中的LM741的输出端与INA126的地端相连,LM741的2脚与6脚相连构成电压跟随器,R4与正负电源相接,通过改变R4的阻值可使VO与RET之间的压差变化,从而实现调零、去皮的功能。2.3TLC7135是一种双积分式4位半单片A/D转换器,其工作原理是将输入电压转换成时间(脉冲宽度信号)或频率I俯冲频率),再通过定时器(计数器)获得数字信号。其主要性能是:具有高输入阻抗(109Ω),对被测电路几乎没有影响;具有自动校零和自动判别信号极性;有超、欠输出信号;采用位扫描与BCD码输出。A/D转换电路如图2.3.1所示。图2.在设计中,TLC7135的所需的基准电源由VCC经过三端可调稳压器LM317稳压后提供,C8、C9为滤波电容。图中C2是基准电容;C4和R9为积分元件;C5为自零电容;R11和C7组成标准的滤波网络;R10、C6和DW1、DW2组成输入过压保护电路;R7为基准电压调节电位器,可以根据需要显示的满度值选择基准电压的大小,本设计选择的基准电压为1.0000V,它们的关系是;满度值为基准电压的两倍。由于A/D转换器精度与外接的积分电阻、积分电容的精度无关,故可以降低对元件质量的要求。不过积分电容和积分电容的介质损耗会影响到A/D转换器的精度,所以应采用介质损耗较小的聚丙乙烯电容2.4主控制控制电路本设计以Xilinx公司的SpartanⅡE系列的XC2S100E芯片为控制核心,FPGA最小系统为控制器实现电子称的各项功能。FPGA器件采用现场可编程单元阵列LCA结构,它由三个可编程基本模块组成:输入/输出模块IOB阵列、可配置逻辑块CLB阵列及可编程互连网络PI。配置逻辑功能块CLB的可编程逻辑单元,由分层的通用布线通道(RouningChannel)连接,同可编程输入输出功能块围绕来实现,基中CLB提供实现逻辑功能的逻辑单元;IOB提供引脚到内部信号线的接口,布线通道则提供CLB和IOB的到连接通道。设计使用的FPGA最小系统板由XC2S100E、50MHZ晶振、电源部分、指示部分和开关组成,电源部分将5V直流经过TPS70451转换得到+3。和5V+1。8V的直流电,PROM(XC18V02)是一个掉电存储器,在掉电时可自动保存数据,4个脚双列插针用于其它外部设备连接。图2.系统实现的功能主要通过软件的编程实现,FPGA内部分为四个模块:数据处理模块、LED和LCD驱动模块、I2C通讯模块和键盘控制模块,各模块的设计将在第三章详细介绍。图人机交互界面人机交互界面显示是否直观,控制是否方便直接影响收银员的工作效率和顾客的满意程度,困此设计时经多方考虑,我们尽可能将显示界面友好化,将控制键盘简单化。由于FPGA可利用的引脚多,可以控制键盘、LCD和LEC。不需要外加键盘或显示控制芯片,从而简化了外部电路。而且编程难度不大,容易实现。2.5.1由于电子称需要设置单价,这就需要一个设置键和十个数字键,还具有去皮、结算、确认、删除等功能,总共需设置16个键(包括一个复位键)。考虑到FPGA负载电流能力有限,因此按键一端均通过10K电阻再与PFGA引脚相连,其电路原理图如图2.图2.2.5.2图2.5.2图2.2.5.由于LCD为144*32点阵式液晶,显示界面有限,本设计增设的八位共阳极LED数码管能够显示商品的重量和商品的总价,使顾客对自己购买的物品一目了然。其显示的功能主要由软件的设计实现,为了节省系统的资源,本系统采用动态显示。动态显示原理如下:当向LED的段码数据口发送第一个8位数据,这时只有一个数码管显示该数码,延时一段时间后可以发送第二8位数据,显示器分时轮流工作,虽然每次只有一个显示器显示,但由于人的视觉暂留现象,我们仍能感觉到所有显示器都在同时显示。图2.5.3为显示电路的原理图,考虑到FPGA驱动能力有限,我们采用三极管(9012)驱动数码管,并由74HC138译码器控制位码的选通,只有当使能端G1为1,G2A,G2B为0时译码器有效,故G1接VCC,G2A,G2B接地,否则所有的输出被封锁在高电平上。2.53数码管显示电路连接图2.53数码管显示电路连接图2.6日历时钟电路按发挥部分的要求,需要显示购货日期。最简单的办法是在电路中增加了一颗日历时钟芯片。系统采用PCF8563完成时钟设计,PCF8563是Philips公司推出的一款带I2C总线,具有极低功耗的多功能时钟/日历芯片,它具有四种报警功能和定时功能;内部时钟电路、内部振荡电路、内部低电压检测以两线制I2C总线通信方式,不但使用外围电路简洁,而且增加了芯片的可靠性。本系统PCF8563与FPGA接口采用图2图2.6.1日历时钟电路原理图图中,在1、2端接入32.768kHz的石英晶振,配置成片内振荡器,VDD与地之间接入1个电容供电维持时钟芯片。PCF8563与FPGA接口采用3根口线,FPGA通过I2C总线读取PCF8563的基准时间。其中SCL为时钟输入端,数据随时钟信号同步输入器件或从器件输出;SDA为双向引脚,用于串行数据的输入输出。另外值行一提的是,SDA、SCL、INT均为漏极开路,必须加上拉电阻。2.7电源电路系统多个电源,FPGA需要+5V电源,传感器需要+10V以上的线性电源(不能用开关电源,否则称重数据不稳定)。我们采用了三端固定稳压芯片7805和7812为系统提供稳定的电源。这个部分由整流电路、滤波电路、稳压电路等组成,如图2.7.1所示。在这里只给出了+5V电源电路,+12V电源电路与+5V相似,因此不再画出。图其它扩展电路2.8.1通讯接口电路一般的商用电子称都能与上位机(PC机)进行通讯,可以将大量的商品数据存于上位机,然后通过串口或并口通讯与电子称相连,达到远距离控制的目的。基系统采用RS232串口实现该项功能。RS-232的逻辑电平用正负电压表示,且信号使用负逻辑,逻辑0的电压范围是+5V~+15V,而逻辑1的电压范围是-5V~-15V,RS-232端口是计算机与其他设备沟通的最常用的接口,不但操作简单,而且价格便宜。FPGA的输入和输出使用的是5V逻辑电平而不是RS-232电压,如何进行两种信号的转换,是连接时需要解决的问题,事实上,解决的方法很简单,只需使用一个MAX232电平转换专用芯片即可,其电路如图2.8.图.语音电路是系统主要扩展功能之一,能够由语音电路发出超载、欠量程或商品重量、价格等语音提示。本系统采用的ISD1420语音电路为美国ISD公司出品的优质单片语音录放电路,ISD1420由振荡器、语音存储单元、前置放大器、自动增益控制电路、抗干扰滤波器、输出放大器组成,能够录放的时间为20秒。一个最小的录放系统仅由一个麦克风、一个喇叭、两个按钮、一个电源、少数电阻电容组成如图2.8图2.录音内容存入永久存储单元,提供零功率信息存储,这个独一无二的方法是借助于美国ISD公司的专利——直接模拟存储技术(DASTTM)实现的。利用它,语音和音频信号被直接存储,以其原本的模拟形式进入EEPROM存储器。直接模拟存储允许使用一种单片固体电路方法完成其原本语音的再现。不仅语音质量优胜,而且具有断电语音保护功能。2.8.3图2.8.3为系统报警电路原理图,除了上一小节中语音可能用于超载和欠量程提示外,系统还设计了两个发光二极管作为超载和欠量程指示灯,使系统更加完善。当系统判断为超载或欠量程时,FPGA给输出一个低电平信号KG(超载)或KQ(超载),从而驱动发光二极管发光提示。图2.第三章系统软件的设计3.1开发软件及编程语言简介系统采用硬件描述语言VHDL(VeryHighSpeedIntegratedCircuitHardwareDescriptionLanguage)按模块化方式进行设计,并将各模块集成于FPGA芯片中,然后通过XiliinxISE7.1软件开发平台和ModelSimSE6.仿真工具,对设计文件自动的完成逻辑编译、综合及优化、逻辑布局布线、逻辑仿真,最后对FPGA芯片进行编程,实现系统的设计要求。VHDL具有多层次的描述系统硬件功能的能力;支持自顶向下(ToptoDown)和基于库(Library-Based)的设计方法;VHDL对设计的描述具有相对独立性。因此,设计者可不必了解硬件结构,从系统设计入手,在顶层进行系统方框图的划分和结构设计,在方框图一级用VHDL对电路的行为进行描述,并进行仿真和纠错,然后在系统一级进行验证,最后再用逻辑综合优化工具生成具体的门级逻辑电路的网表,下载到具体的FPGA器件中去,从而实现可编程逻辑器件的专用集成电路(ASIC)设计。3.2系统软件的设计根据系统的要求,系统的大部分功能都以硬件为基础,通过VHDL编程实现,本设计软件实现的主要能如下设置单价显示重量、金额和单价显示日期、时钟去皮累计汇总语音报警(超载、欠量程)3.2.1软件系统的主程序流程图如图3.2.图VHDL模块设计分频模块本设计所使用的FPGA最小系统的晶振为50MHZ,要把这个频率的晶振应用于实际中,就必须对该频率做一些处理,简单地说就是分频。分频为我们所需要的固定频率值再投于应用中。比如本系统中TLC7135的时钟信号clkout1就是对标准clk进行分频,分频系统为200。所以clkout1的频率为:50MHZ5KHZ250KHZClkclkoutResetclkout150M50MHZ5KHZ250KHZClkclkoutResetclkout1也就是说每秒发出25K个clkout1信号,且占空比为50%。另外分频模块还给出一个5KH的频供其它模块使用。分频模块示意图如图3.图3.I2C通讯模块I2C总线是一种串行数据总线,只有二根信号线,一根是双向的数据线SDA,另一根是时钟线SCL。目前,支持I2C总线通信协议的视频编、解码芯片大多只支持100Kb/s或400Kb/s的传输速度,并且支持两种地址:①从设备地址(SCLAVEADDRESS,8bit),分为读地址和写地址,高7位用于选中芯片,第0位是读/写控制位(R/W),决定是对该芯片进行读或写操作;②内部寄存器单元地址(SUBADRRESS,8bit),用于决定对内部的哪个寄存器单元进行操作,通常还支持地址单元连续的多字节顺序读写操作。I设计的核心工作是对I2C总线命令及时序的状态划分。在控制核内共设置了两个状态机,分别称为命令状态机和时序状态机。其中,命令状态机用于管理I2C总线上的命令状态,并实现I2C总线具体的读、写操作的命令状态转移过程;时序状态机用于实现I2C总线上启动、停止、读、写、确认等命令的具体时序关系。这样就把控制核从逻辑上分为两个状态机,共同完成最终的总线命令与时序。I2C程序流程图如下图所示。开始开始结束发开始信号写器件地址写器件从地址写寄存器地址写入初始化数据发结束信号写器件地址写器件从地址重发开始信号写器件读命令读各个寄存器发结束信号发开始信号写PCF8563各个寄存器读PCF8563各个寄存器图3.3.33.数据处理模块数据处理模块包括接收部分,数据RAM,乘法运算模块等。系统将商品的代号、名称、单价等信息存于数据RAM中,当接收到AD转换器的数据(电压信号)后,将其转化为相应重量数据信号,并将其进行乘法运算得到金额,即金额=重量×单价并自动检测商品是否大于称重传感器的量程,如果大于传感器的量程则向报警电路输出一个低电平信号BG,使发光二极管点亮。数码管全部显示零。在进行乘法运算得出结果后,各信息送到LED或LCD译码模块。图3.2.数据数据RAM乘法模块接收AD转换数据电压-重量转换模块至译码模块判断模块报警信号键盘控制图3.4.译码显示模块译码显示模块是建立在内部系统和观测人之间的桥梁。通过译码显示,使输出结果可视化,界面友好化。该模块由LED译码和LCD译码组成,主要是将各信息量转换成相应的显示代码。LED译码模块是将数字量转换为BCD码来驱动数码管。采用动态显示,因此采用VHDL状态机设计,共分为八个状态,即八个数码管的位码依次选通点亮数码管。用FPGA驱动液晶显示的原理是对LM3037进行控制,通过8位的总线,先对LM3037进行配置,即写入命令,然后输入要显示的内容,即写入数据,状态转换图如图3.3.图3.35.键盘控制模块键盘控制电路由16个按键组成,其中数据键10个,控制键6个。键盘控制程序的设计将各按键设置为特定的功能,使用起来十分方便。可以通过键盘设置日期、时间、商品代号、单价等不同信息。3.2.3程序设计顶层映射原理系统的程序设计是基于VHDL的模块化设计,通过ISE工程编辑器(Projectnavigator)产生原理图模块(CreateSchematicSymbol)或自动产生顶层映射的原理图(ViewRTLSchematic),如图3.3.3程序清单及仿真程序清单(见附录)。设计输入利用VHDL语言完成后,接下来是对程序进行功能仿真(FunctionSimulation)其仿真的目的是检查程序是否有错,是否达到预定的目标。之后是时序仿真(TimingSimulation),其目的是通过时序可以更清楚的了解程序的工作过程,在较复杂的系统中时序仿真是必不可少的。各模块的时序仿真图见附录。图3.3.6图3.3.6电子称程序设计顶层映射原理图第四章系统测试在系统硬件和软件都安装调试好后,便可以进行软件和硬件的综合测试,并对测试的误差进行分析。4.1测试仪器清单测试使用的仪器设备如表4.表4.1.1测试使用的仪器设备序号名称型号数量备注13位半数字万用表UNI-T1深圳胜利公司2直流稳压电源DF1731SC2A1江苏扬中电子仪器厂3信号发生器GFG-8216A1南京无线电仪器厂4双踪示波器YB43651江苏扬中电子仪器厂5FPGA实验仪DP-FPGA1广州致远电子有限公司4.2测试方法在系统硬件焊接完成及软件功能仿真、下载成功之后。接下来对整个系统进行调试,其方法如下:将传感器放平,接好电路,使用直流稳压电源(DF1731SC2A)为FPGA及其他电路提供+5V电压,为传感器提供12V电压,不放任砝码时看重量显示是否为零,不为零则调整电位器,改变放大器的放大倍数,使重量值为零,加上不同的砝码,记下显示的重量Mx(Kg)。最后进行系统误差计算。在测试过程中根据出现的问题改进电路以及程序。反复进行直到成功。0002西瓜000002西瓜00.65元2005年8月2日10:25LCD显示重量(Kg)金额(元)LED显示图4.2.1系统测试4.3测试结果和误差分析4.3.根据上节的测试方法,设M为砝码的质量,Mx为电子称显示的重量,测试后得到表4.3.1的测试结果.表4.3.1测量结果数据表序号砝码质量/M(g)显示质量/Mx(g)误差(g)相对误差%150%2100100.0003150150.0004200200.0005250249.90.10.04%6300300.0007350350.0008400400.10.10.025%4.3.2表中误差为相对误差,其计算公式为(试4.3.1)由上式可以看出,系统的测量误差取决于两个量M、Mx,计算得出的数据越大,说明误差越大,系统精度越低,从表只可以看出,系统的误差小于0.2%远小于设计要求的误差。第五章设计总结设计采用FPGA最小系统为控制核心,实现了一款具有特色的实用电子称。通过测试,系统完全达到了设计要求,不但完成了基本要求,发挥部分的要求,并增加了语音提示、时钟和过载提示三个创新功能。经过几天的努力实践,不断的测试,不断的改进电路或程序,最后完成了设计。在设计过程中,我们不仅仅是完成了设计任务,更重要的是学到很多课本上没有的知识,同时也特别感谢各位老师和同学的帮助和支持,使我们这次设计能顺利完成。参考文献潘松,黄继业.EDA技术实用教程.北京:科学出版社,2002年10月第一版肖景和.数字集成电路应用精粹.北京:人民邮电出版社,2002年6月第1版陈永甫.电子电路智能化设计实例与应用.北京:电子工业出版社,2002年8月第1版李辉.ISP系统设计技术入门与应用.北京:电子工业出版社,2002年2月第1版曾凡泰,陈美金著.VHDL程序设计.北京:清华大大学学出版社,2001年1月第2版黄智伟.全国大学生电子设计竞赛训练教程.北京:电子工业出版式社,2005年1月第1版附录1主要元器件清单作用器件型号个数封装放大器INA1261DIP8放大器LM3861DIP8放大器AD7111DIP8AD转换TLC71351DIP16时钟芯片PCF85631DIP8语音芯片ISD14201DIP28FPGA最小系统SpartanⅡE-XC2S100E1DIP40译码器74HC1381DIP16I/O扩展82551DIP40键盘控制ZLG72891DIP283289电位器100K410K4100欧2200欧2晶振32.768K112M1锁存器74HC3732DIP20压力传感器LS-1称重传感器1附录2印制板图检测部分底层印制板图(包括前置放大和AD转换部分)检测部分顶层印制板图FPGA控制板印制板图附录3,程序清单1顶层文件Engineer:徐文卿,蓝仁富,唐正宇--DesignName:电子称--ModuleName:TOP--ProjectName:电子称--TargetDevice:--Toolversions:ISE7.1i--Description:带时钟功能,同时显示商品单价,总价,重量等信息。libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitytopisport(clkin:instd_logic; --时钟输入 reset:instd_logic; --复位信号 keynum:instd_logic_vector(9downto0); --数字键输入 keycom:instd_logic_vector(5downto0); --命令键输入 clkout1:outstd_logic; --给ICL7135时钟信号 din:instd_logic_vector(4downto0); --ICL7135位选 bin:instd_logic_vector(3downto0); --ICL7135数据 str:instd_logic; --ICL7135输出指示信号 scl:outstd_logic;--PCF8563时钟芯片SCL sda:inoutstd_logic;--PCF8563时钟芯片SDA rs:outstd_logic; --液晶输出控制口RS rw:outstd_logic;--液晶输出控制口RWe:outstd_logic; --液晶使能口Erst:outstd_logic;--液晶复位psb:outstd_logic;--工作时置高电平lcddata:outstd_logic_vector(7downto0); --液晶数据口leden:outstd_logic_vector(2downto0); --数码管位选口leddata:outstd_logic_vector(7downto0) --数码管段码口);endtop;architectureBehavioraloftopiscomponentkeyboardis --键盘模块port(clkin:instd_logic; reset:instd_logic; keynum:instd_logic_vector(9downto0); keycom:instd_logic_vector(5downto0); codewei:outstd_logic_vector(1downto0); code:outstd_logic_vector(15downto0) );endcomponent; --ICL7135模块componenticl7135isport(clkin:instd_logic; reset:instd_logic; din:instd_logic_vector(4downto0); bin:instd_logic_vector(3downto0); str:instd_logic; leddata:outstd_logic_vector(15downto0) );endcomponent;componentcommunicationis --PCF8563时钟芯片模块port(scl:outstd_logic; sda:inoutstd_logic; clkin:instd_logic; reset:instd_logic; lcddata:outstd_logic_vector(31downto0); point:outstd_logic );endcomponent;componentfenpinis --分频模块 port(clkin:instd_logic; reset:instd_logic; clkout:outstd_logic; clkout1:outstd_logic );endcomponent;componentleddisplayis --数码管显示驱动 port(clk:instd_logic; reset:instd_logic; data:instd_logic_vector(31downto0); point:instd_logic_vector(7downto0); leden:outstd_logic_vector(2downto0); leddata:outstd_logic_vector(7downto0) );endcomponent;componentlcddisplayis --液晶显示驱动 port(clkin:instd_logic; reset:instd_logic; codewei:instd_logic_vector(1downto0); code:instd_logic_vector(15downto0); waredata:instd_logic_vector(63downto0); timedata:instd_logic_vector(31downto0); p:instd_logic; rs:outstd_logic; rw:outstd_logic; e:outstd_logic; rst:outstd_logic; psb:outstd_logic; lcddata:outstd_logic_vector(7downto0) );endcomponent;componentwareis --商品信息储存port(clkin:instd_logic; code:instd_logic_vector(15downto0); waredata:outstd_logic_vector(63downto0) );endcomponent;componentmultiplyis --价格计算电路 port(clkin:instd_logic; uprice:instd_logic_vector(15downto0); weight:instd_logic_vector(15downto0); price:outstd_logic_vector(15downto0) );endcomponent;signalcodewei:std_logic_vector(1downto0); signalcode:std_logic_vector(15downto0); --商品编码signalweight:std_logic_vector(15downto0); --商品重量signaldvclk:std_logic; --分频时钟signaltimedata:std_logic_vector(31downto0); --时钟信息signalpoint:std_logic; --秒钟闪烁控制signalp:std_logic_vector(7downto0); --数码管小数点signalwaredata:std_logic_vector(63downto0); --商品信息signaluprice:std_logic_vector(15downto0); --商品单价signalprice:std_logic_vector(15downto0); --商品总价signalleddataa:std_logic_vector(31downto0); --数码管数据beginu1:keyboardportmap(clkin=>clkin, reset=>reset, keynum=>keynum, keycom=>keycom, codewei=>codewei, code=>code);u2:icl7135portmap(clkin=>clkin,reset=>reset, din=>din, bin=>bin, str=>str, leddata=>weight);u3:communicationportmap(scl=>scl, sda=>sda, clkin=>dvclk, reset=>reset, lcddata=>timedata, point=>point);u4:fenpin portmap (clkin=>clkin, reset=>reset, clkout=>dvclk,clkout1=>clkout1);u5:wareportmap(clkin=>clkin, code=>code, waredata=>waredata);u6:multiplyportmap(clkin=>clkin,uprice=>uprice, weight=>weight, price=>price);u7:leddisplayportmap(clk=>dvclk,reset=>reset, data=>leddataa, point=>p, leden=>leden, leddata=>leddata);u8:lcddisplayportmap(clkin=>dvclk, reset=>reset, codewei=>codewei, code=>code, waredata=>waredata, timedata=>timedata, p=>point, rs=>rs, rw=>rw, e=>e, rst=>rst, psb=>psb, lcddata=>lcddata);p<="01111011";leddataa<=weight&price;uprice<=waredata(15downto0);endBehavioral;2.PCF8563通讯使用的I2C程序Description:与PCF8563通讯使用的I2C程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitycommunicationisport(scl:outstd_logic; sda:inoutstd_logic; clkin:instd_logic; reset:instd_logic;lcddata:outstd_logic_vector(31downto0); point:outstd_logic );endcommunication;architectureBehavioralofcommunicationistypestateis(writestate,readstate); --写和读两个大的状态signalpcfstate:state;typei2cstateis(start,send,read,ans,sans,stop); --I2C的各个子状态signali2c:i2cstate;typeaddr1isarray(0to8)ofstd_logic_vector(7downto0);--写预设值,年月日constantaddress1:addr1:=(("10100010"),--器件地址A20("00000010"),--器件从地址02 1 ("00110000"),--秒寄存器 2("00100010"),--分寄存器 3("00010011"),--小时寄存器4 ("00100101"),--日期寄存器5("00000001"),--星期寄存器6("00010001"),--月份寄存器7("00000001"));--年寄存器 8typeaddr2isarray(0to2)ofstd_logic_vector(7downto0);--读前的初始和命令constantaddress2:addr2:=(("10100010"),--器件地址A2("00000010"),--器件从地址02("10100011"));--器件地址2A3typedatatypeisarray(0to6)ofstd_logic_vector(7downto0);--用来寄存读到的数据的信号组signaldata:datatype;beginprocess(clkin,reset)--I2C进程variablecnt1:integerrange0to9;variablecnt2:integerrange0to8;variablecnt3:integerrange0to3;beginifreset='0'then --复位 pcfstate<=writestate;--一级状态为写状态 i2c<=start; --二级状态为开始状态 cnt1:=0; --各个变量给初值 cnt2:=8; cnt3:=0; data<=(("00000000"), --将时间寄存器清零 ("00000000"), ("00000000"), ("00000000"), ("00000000"), ("00000000"), ("00000000")); elsifrising_edge(clkin)then casepcfstateis whenwritestate=>casei2cis whenstart=>casecnt3is --开始数据传送信号 when0=>sda<='1';cnt3:=1; when1=>scl<='1'cnt3:=2; when2=>sda<='0';cnt3:=3; when3=>scl<='0';i2c<=send;cnt3:=0; whenothers=>null; endcase; whensend=>casecnt3is --数据传送,先写address1 when0=>sda<=address1(cnt1)(cnt2-1); cnt3:=1; when1=>scl<='1';cnt3:=2; when2=>scl<='0';cnt2:=cnt2-1; ifcnt2=0thencnt2:=8; i2c<=ans; else i2c<=send; endif; cnt3:=0; whenothers=>null;endcase;whenans=>casecnt3is --应答信号when0=>sda<='Z';scl<='1';cnt3:=1; when1=>cnt3:=2; when2=>scl<='0';cnt1:=cnt1+1; ifcnt1=9thencnt1:=0;i2c<=stop; elsei2c<=send; endif;cnt3:=0;whenothers=>null;endcase; whenstop=>casecnt3is --停止信号 when0=>sda<='0';cnt3:=1;when1=>scl<='1';cnt3:=2; when2=>sda<='1';cnt3:=3; when3=>scl<='0';pcfstate<=readstate;i2c<=start;cnt3:=0; whenothers=>null; endcase;whenothers=>null;endcase;whenreadstate=>casei2cis --信号开始 whenstart=> casecnt3is when0=>sda<='1';cnt3:=1;when1=>scl<='1';cnt3:=2;when2=>sda<='0';cnt3:=3;when3=>scl<='0';i2c<=send;cnt3:=0; whenothers=>null;endcase;whensend=>casecnt3is --读前初始化when0=>sda<=address2(cnt1)(cnt2-1);cnt3:=1; when1=>scl<='1';cnt3:=2; when2=>scl<='0';cnt2:=cnt2-1;ifcnt2=0thencnt2:=8;i2c<=ans;elsei2c<=send; endif; cnt3:=0;whenothers=>null; endcase; whenans=>casecnt3is --应答信号when0=>sda<='Z';cnt3:=1; when1=>scl<='1';cnt3:=2;when2=>scl<='0';cnt1:=cnt1+1; ifcnt1=2then i2c<=start; elsifcnt1=3then i2c<=read;cnt1:=0; elsifcnt1=1theni2c<=send; endif;cnt3:=0; whenothers=>null;endcase; whenread=>casecnt3is --读数据when0=>sda<='Z';cnt3:=1; when1=>scl<='1';cnt3:=2;when2=>data(cnt1)(cnt2-1)<=sda; cnt3:=3;when3=>scl<='0';cnt2:=cnt2-1; ifcnt2=0thencnt2:=8;i2c<=sans; elsei2c<=read; endif; cnt3:=0;whenothers=>null; endcase; whensans=>casecnt3is --给8563送应答 when0=>sda<='0';cnt3:=1; when1=>scl<='1';cnt3:=2;when2=>scl<='0';cnt1:=cnt1+1; ifcnt1=7thencnt1:=0;i2c<=stop; elsei2c<=read;endif;cnt3:=0;whenothers=>null;endcase;whenstop=>casecnt3is --停止位 when0=>sda<='0';cnt3:=1;when1=>scl<='1';cnt3:=2;when2=>sda<='1';cnt3:=3;when3=>scl<='0'; pcfstate<=readstate; i2c<=start; cnt3:=0; whenothers=>null;endcase;whenothers=>null; endcase;endcase;endif;endprocess; lcddata<=data(6)&data(5)(4downto0)&data(3)(5downto0)&data(2)(5downto0)&data(1)(6downto0);process(data(0)(0)) --小数点进程,按秒闪烁beginifdata(0)(0)='0'then point<='0'; else point<='1'; endif;endprocess;endBehavioral;3乘法电路Description:乘法电路--将商品重量和商品单价输入,将输出商品总价--Dependencies:本程序属于失败之作,使用简单乘法,大量浪费FPGA的资源,还有待改进----Revision:--Revision0.01-FileCreated--AdditionalComments:--libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitymultiplyisport(clkin:instd_logic; uprice:instd_logic_vector(15downto0); --输入单价 weight:instd_logic_vector(15downto0); --输入重量 price:outstd_logic_vector(15downto0) --输出价格 );endmultiply;architectureBehavio

温馨提示

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

最新文档

评论

0/150

提交评论