基于FPGA的数字电压表的设计_第1页
基于FPGA的数字电压表的设计_第2页
基于FPGA的数字电压表的设计_第3页
基于FPGA的数字电压表的设计_第4页
基于FPGA的数字电压表的设计_第5页
已阅读5页,还剩12页未读 继续免费阅读

下载本文档

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

文档简介

PAGE4基于FPGA的数字电压表的设计摘要电子设计自动化(electronicdesignautomation,EDA)是近几年迅速发展起来的将计算机软件、硬件、微电子技术交叉运用的现代电子设计技术。其中EDA设计语言中的VHDL语言是一种快速的电路设计工具,功能涵盖了电路描述、电路综合、电路仿真等三大电路设计内容。本电压表的电路设计正是用VHDL语言完成的。此次设计主要应用的软件是美国ALTERA公司自行设计的一种QuartusⅡ。本次所设计的电压表的测量范围是0~5V,精度为0.01V。此电压表的设计特点为:通过软件编程下载到硬件实现,设计周期短,开发效率高。关键词:电子设计自动化(EDA);FPGA;VHDL;A/D采集;数字电压表DesignofDitalVoltmeterBasedonFPGAAbstractThedesignofdigitalsystemisbecomingfaster,bulkier,smallerandlighterthanbefore.Electronicdesignautomationisinthelastfewyearsquicklydevelop,itmakesuseofsoftware,hardware,micro-electronicstechnologytoformacourseofelectronicdesign.Amongthem,theVHDLlanguageofEDAisakindoftooloffastcircuitdesign,thefunctioncoveredthecircuitdescribe,thecircuitsynthesize,thecircuitimitatethetrueetc.ThecircuitofthedesignthatuseVHDLlanguagetocomplete.ThethistimedesignisprimarilytheappliedsoftwareisQuartusⅡwhichismadebytheUnitedStatesALTERAcompany.Thissystem’srangeis-5vto+5vandprecisionis0.01v.Characteristicsofthiselectricvoltagewatchis:Passthesoftwareprogramtodownloadthehardwareorealize,designtheperiodisshort,developmenttheefficiencyishigh.Keywords:ElectronicDesignAutomation(EDA);FPGA;VHDL;A/DAcquisitiondigitalvoltage目录第一章绪论 11.1 研究目的及意义 11.2本课题国内外研究概况、应用前景 1第二章硬件电路设计 32.1ADC0809模块 32.1.1A/D转换器的主要技术指标 32.1.2ADC0809工作原理 42.1.3.工作时序 5第三章FPGA功能模块的设计 63.2控制转换模块 63.3数据处理模块 83.4扫描、显示模块 9第四章总结 14基于FPGA的数字电压表的设计致谢第二章硬件电路设计2.1ADC0809模块ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。2.1.1A(1)分辨率分辨率是指A/D转换器能分辨的最小模拟输入量。通常用能转换成的数字量的位数来表示,如8位、10位、12位、16位等。位数越高,分辨率越高。例如,对于8位A/D转换器,当输入电压满刻度为5V时,其输出数字量的变化范围为0~255,转换电路对输入模拟电压的分辨能力为5V/255=19.5mV。(2)转换时间转换时间是A/D转换器完成一次转换所需的时间。转换时间是编程时必须考虑的参数。若CPU采用无条件传送方式输入A/D转换后的数据,则从启动A/D芯片转换开始,到A/D芯片转换结束,需要一定的时间,此时间为延时等待时间,实现延时等待的一段延时程序,要放在启动转换程序之后,此延时等待时间必须大于或等于A/D转换时间。(3)量程量程是指A/D转换器所能转换的输入电压范围。(4)精度精度是指与数字输出量所对应的模拟输入量的实际值与理论值之间的差值。A/D转换电路中与每一个数字量对应的模拟输入量并非是单一的数值,而是一个范围。例如:对满刻度输入电压为5V的12位A/D转换器,==1.22mV,定义为数字量的最小有效位LSB。若理论上输入的模拟量A,产生数字量D,而实际输入模拟量A产生还是数字量D,则称此转换器的精度为0LSB。当模拟电压或还是产生同一数字量D,则称其精度为1/4LSB。目前常用的A/D转换器的精度为1/4~2LSB。2.1.2A1.芯片介绍ADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。ADC0809的分辨率为8位,转换时间约1OOus,含锁存控制的8路多路开关,输出有三态缓冲器控制,单5V电源供电。其实物图如3.2.2所示。图3.2AD0809实物图2.工作原理START是转换启动信号,高电平有效;ALE是3位通道选择地址(ADDC,ADDB,ADDA)信号的锁存信号。当模拟量送至某一输入端(INI或IN2等),由3位地址信号选择,而地址信号由ALE锁存;EOC是转换情况状态信号(类似于AD574的STATUS),当启动转换约100us后,EOC产生一个负脉冲,以表示转换结束;在EOC的上升沿后,若使输出使能信号OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。至此ADC0809的一次转换结束了。图3.3ADC0809原理图各引脚功能如下:1.IN7~IN0——模拟量输入通道。ADC0809对输入模拟量的要求主要有:信号单极性,电压范围0~5V,若信号过小,还需进行放大。另外,模拟量输入在A/D转换的过程中,其值应保持不变,因此,对变化速度快的模拟输入量,在输入前应增加采样保持电路。2.A、B、C——地址线。A为低位地址,C为高位地址,用于对8路模拟通道进行选择,引脚图中相应为ADDA、ADDB和ADDC。其地址状态与通道的对应关系见表1-1。3.ALE——地址锁存允许信号。由低至高电平的正跳变将通道地址锁存至地址锁存器中。4.START——启动转换信号。START上跳沿时,所有内部寄存器清0;START下跳沿时,开始进行A/D转换。在A/D转换期间,START应保持低电平。5.D7~D0——数据输出线。为三态缓冲输出形式,可以和单片机的数据线直接相连。6.OE——输出允许信号。用于控制三态输出锁存器向单片机上输出转换得到的数据。OE=0,输出数据线呈高电阻态;OE=1,输出转换得到的数据。7.CLOCK——时钟信号。ADC0809内部没有时钟电路,所需时钟信号由外界提供,要求频率范围10kHz~1.2MHz。通常使用频率为500kHz的时钟信号。8.EOC——转换结束状态信号。EOC=0,正在进行转换;EOC=1,转换结束。该状态信号既可作为查询的状态标志,又可以作为中断请求信号使用。9.VCC——+5V电源。10.REF(+)、REF(-)——参考电压。参考电压用来与输入的模拟信号进行比较,作为逐次逼近的基准。其典型值为REF(+)=+5V,REF(-)=0V。2.1.3ADC0809的工作时序如图3.4所示。图3.4ADC0809工作时序图2.首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。第三章FPGA功能模块的设计及仿真3.1软件系统原理整个系统由三大模块组成(1)控制模块,A/D转换控制模块,用以初始化A/D转换器(即ADC0809)、并启动且接收ADC0809传递过来的数字转换值;(2)数据处理模块,将接收到的转换值调整成对应的数字信号;(3)显示模块,将数据处理模块输出的4位BCD码译成8位数据输出给LCD1602显示。具体工作方式如下图所示,首先,被测电压信号进入A/D转换器,FPGA中控制信号模块发出控制信号,启动A/D转换器进行转换,其采样得到的数字信号数据在相应的码制转换模块中转换为显示代码。最后译码驱动模块发出显示控制与驱动信号,驱动外部的LCD模块显示相应的数据。3.2控制转换模块我们使用的FPGA是Altera公司的Cyclone器件EP2C8Q208C8,用状态机作法,产生ADC0809CCN的片选信号、读/写控制信号,通过状态信号EOC判断转换是否结束;转换结束后将转换数据锁存并输出。方框图如4.1图4.1控制转换模块

我们可以将整个控制转换分成5个步骤状态:状态0:ale<='0';start<='0';lock<='0';oe<='0,转换前对AD0809初始化;状态1:ale<='1';start<='1';lock<='0';oe<='0';--start=1,ale=1表示开始转换状态2:ale<='0';start<='0';lock<='0';oe<='0';状态3:ale<='0';start<='0';lock<='0';oe<='1';--oe=1表示从AD0809中读取出值状态4:ale<='0';start<='0';lock<='1';oe<='1';--lock=1表示锁存从AD0809中读出的值其程序为:beginlock_t<=lock;--状态转换进程COM1:process(cs,eoc)begin casecsis whens0=>next_state<=s1; whens1=>next_state<=s2; whens2=> if(eoc='1')then--eoc=1表明转换结束 next_state<=s3; else next_state<=s2;--转换未结束,继续等待 endif; whens3=>next_state<=s4; whens4=>next_state<=s0; whenothers=>next_state<=s0; endcase;endprocessCOM1;--状态转换进程COM2:process(cs)begin casecsis whens0=>ale<='0';start<='0';lock<='0';oe<='0'; whens1=>ale<='1';start<='1';lock<='0';oe<='0';--start=1,ale=1表示开始转换 whens2=>ale<='0';start<='0';lock<='0';oe<='0'; whens3=>ale<='0';start<='0';lock<='0';oe<='1';--oe=1表示从AD0809中读取出值 whens4=>ale<='0';start<='0';lock<='1';oe<='1';--lock=1表示锁存从AD0809中读出的值 whenothers=>ale<='0';start<='0';lock<='0';oe<='0'; endcase;endprocessCOM2; --时序进程REG:process(clk,rst)begin ifrst='0'then cs<=s0; elsifclk'eventandclk='1'then cs<=next_state; endif;endprocessREG;--锁存器进程LATCH:process(lock)begin iflock='1'andlock'eventthen regl<=d; endif;endprocessLATCH;3.3数据处理模块ADC0809是8位模数转换器,它的输出状态共有256种,如果输入信号Ui为0~5V电压范围,则每两个状态值为5/(256-1),约为0.0196V,故测量分辨率为0.02V。常用测量方法是:当读取到DB7~DB0转换值是XXH时,电压测量值为U≈XXH×0.02V;考虑到直接使用乘法计算对应的电压值将耗用大量的FPGA内部组件,本设计用查表命令来得到正确的电压值。在读取到ADC0809的转换数据后,先用查表指令算出高、低4位的两个电压值,并分别用16位BCD码表示;接着设计16位的BCD码加法,如果每4位相加结果超过9需进行减10进1。这样得到模拟电压的BCD码。其方框图如图4.3图4.3数据处理模块其程序为:data1<="0000000000000000"whendatain(7downto4)="0000"else"0000001100010011"whendatain(7downto4)="0001"else"0000011000100101"whendatain(7downto4)="0010"else"0000100100111000"whendatain(7downto4)="0011"else"0001001001010000"whendatain(7downto4)="0100"else"0001010101100011"whendatain(7downto4)="0101"else"0001100001110101"whendatain(7downto4)="0110"else"0010000110001000"whendatain(7downto4)="0111"else"0010010100000000"whendatain(7downto4)="1000"else"0010100000010011"whendatain(7downto4)="1001"else"0011000100100101"whendatain(7downto4)="1010"else"0011010000111000"whendatain(7downto4)="1011"else"0011011101010000"whendatain(7downto4)="1100"else"0100000001100011"whendatain(7downto4)="1101"else"0100001101110101"whendatain(7downto4)="1110"else"0100011010001000"whendatain(7downto4)="1111"else"0000000000000000";data2<="0000000000000000"whendatain(3downto0)="0000"else"0000000000100000"whendatain(3downto0)="0001"else"0000000000111001"whendatain(3downto0)="0010"else"0000000001011001"whendatain(3downto0)="0011"else"0000000001111000"whendatain(3downto0)="0100"else"0000000010011000"whendatain(3downto0)="0101"else"0000000100010111"whendatain(3downto0)="0110"else"0000000100110111"whendatain(3downto0)="0111"else"0000000101010110"whendatain(3downto0)="1000"else"0000000101110110"whendatain(3downto0)="1001"else"0000000110010101"whendatain(3downto0)="1010"else"0000001000010101"whendatain(3downto0)="1011"else"0000001000110100"whendatain(3downto0)="1100"else"0000001001010100"whendatain(3downto0)="1101"else"0000001001110011"whendatain(3downto0)="1110"else"0000001010010011"whendatain(3downto0)="1111"else"0000000000000000";do1<=('0'&data1(3downto0))+('0'&data2(3downto0));c1<="00000"whendo1<"01010"else"00001";do2<=('0'&data1(7downto4))+('0'&data2(7downto4))+c1;c2<="00000"whendo2<"01010"else"00001";do3<=('0'&data1(11downto8))+('0'&data2(11downto8))+c2;c3<="00000"whendo3<"01010"else"00001";do4<=('0'&data1(15downto12))+('0'&data2(15downto12))+c3;doo1<=do1whendo1<"01010"elsedo1-"01010";doo2<=do2whendo2<"01010"elsedo2-"01010";doo3<=do3whendo3<"01010"elsedo3-"01010";doo4<=do4whendo4<"01010"elsedo4-"01010";本模块的功能仿真结果如图4.4所示;当转换数据为10110110,通过查表高4位1011是3.438V,而低4位0110是0.098V,最后的电压输出结果是3.438V+0.098V=3.536V,它的BCD码表示为0011010100110110,仿真结果正确。3.4扫描、显示模块ain3~0是数据处理模块输出的电压值的BCD码;lcd_rs是LCD1602的命令/数据选择信号;lcd_rw是LCD1602的读/写选择信号;lcd_en是LCD1602的使能信号;data是LCD1602的数据输入信号。其方框图如4.5图4.5显示模块其程序为:architectureoneoflcd1602driverisconstantidle:std_logic_vector(7downto0):="00000000";--闲置模式constantclear:std_logic_vector(7downto0):="00000001";--清屏模式constantsetmode:std_logic_vector(7downto0):="00000010";--模式设置constantswitchmode:std_logic_vector(7downto0):="00000100";--开关控制constantsetfunction:std_logic_vector(7downto0):="00001000";--功能设置constantsetddram:std_logic_vector(7downto0):="00010000";--设置DDRAM地址constantwriteram:std_logic_vector(7downto0):="00100000";--数据写入模式constantbufone:std_logic_vector(7downto0):="01000000";--缓冲一constantbuftwo:std_logic_vector(7downto0):="10000000";--缓冲二signalstate:std_logic_vector(7downto0);--状态变量signalcharcnt:integerrange0to79;--地址变量signalchar_addr:std_logic_vector(7downto0);--读地址变量signalchardata:std_logic_vector(7downto0);--数据中间变量signaldchar:std_logic_vector(7downto0);--数字0-9中间变量signaladdress:std_logic_vector(7downto0);componentcharramport(clock:instd_logic:='1';--RAM时钟输入信号data:instd_logic_vector(7downto0);--RAM数据输入信号rdaddress:instd_logic_vector(7downto0);--RAM读地址rden:instd_logic:='1';--RAM读使能信号wraddress:instd_logic_vector(7downto0);--RAM写地址wren:instd_logic:='0';--RAM写使能信号q:outstd_logic_vector(7downto0)--RAM数据输出信号);endcomponent;beginu1:charramportmap(clock=>clk, --随着dchar不同的值,显示不同的字符 data=>dchar+"00110000",--“00110000”代表字符‘ rdaddress=>char_addr,--RAM读地址与字符显示地址的地址相连 rden=>'1', wraddress=>address+"00001000",--第一行第9列地址 wren=>'1', q=>chardata--RAM的q与字符数据相连 );--调用类型转换类型,把整型数转换为8位的std_logic_vector类型 char_addr<=conv_std_logic_vector(charcnt,8);lcd_en<=clk;--LCD1602的使能信号--根据不同的状态,产生不同的控制信号L1:process(state,charcnt,chardata)begin casestateis --闲置状态 whenidle=> lcd_rs<='0';--命令 lcd_rw<='1';--写 data<="ZZZZZZZZ";--信号为高阻态 --功能设置 --8位数据,2行显示,5*7的点阵 whensetfunction=> lcd_rs<='0';--命令 lcd_rw<='0';--读 data<="00111100"; --开关控制 --显示开,光标关,闪烁关 whenswitchmode=> lcd_rs<='0'; lcd_rw<='0'; data<="00001100"; --模式设置 --AC自动增一,画面不动 whensetmode=> lcd_rs<='0'; lcd_rw<='0'; data<="00000110"; --清屏模式 whenclear=> lcd_rs<='0'; lcd_rw<='0'; data<="00000001"; --设置DDRAM地址 --“10000000”选择第一行地址(80H),“11000000” whensetddram=> lcd_rs<='0'; lcd_rw<='0'; ifcharcnt<38then--显示个数不足38个字符时,选择第一行地址显示 data<="10000000"; else data<="11000000"; endif; --缓冲一 --缓冲一,二,是因为字符RAM的输入与输出设置了寄存器 --为了保证输出数据与输出地址一致,设置了这两个缓冲器 whenbufone=> lcd_rs<='0'; lcd_rw<='0'; ifcharcnt<38then data<="10000000"; else data<="11000000"; endif; --缓冲二 whenbuftwo=> lcd_rs<='0'; lcd_rw<='0'; ifcharcnt<38then data<="10000000"; else data<="11000000"; endif; --数据输出模式 whenwriteram=> lcd_rs<='1';--数据 lcd_rw<='0';--读 data<=chardata; --其他状态模式 whenothers=> lcd_rs<='0'; lcd_rw<='1'; data<="ZZZZZZZZ";--信号为高阻态 endcase;endprocessL1;--状态转换进程L2:process(clk,reset_n)begin ifreset_n='0'then state<=idle; charcnt<=0; elsifclk'eventandclk='1'then casestateis whenidle=> state<=setfunction; whensetfunction=> state<=switchmode; whenswitchmode=> state<=setmode; whensetmode=> state<=clear; whenclear=> state<=setddram; whensetddram=> state<=bufone; whenbufone=> charcnt<=charcnt+1; state<=buftwo; whenbuftwo=> charcnt<=charcnt+1; state<=writeram; whenwriteram=> if

温馨提示

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

评论

0/150

提交评论