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

下载本文档

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

文档简介

基于FPGA数字电压表设计目 录1系统设计3 1.1 控制模块方案的比较3 1.2 A/D转换方案的比较4 1.3 显示方案的比较4 1.4 总体方案设计51.5 系统的基本原理52 单元电路设计6 2.1 A/D转换部分6 2.1.1 ADC0809工作原理6 2.1.2 ADC0809工作时序7 2.1.3 档位控制电路8 2.2 FPGA功能模块的设计8 2.2.1 码制变换模块8 2.2.2 显示控制及驱动模块9 3 软件设计9 3.1 开发软件及编程语言简介9 3.2 程序流程图94 系统测试104.1 测试仪器清单104.2 测试及误差计算10参考文献11附录1 程序清单111 系统设计1.1控制模块方案的比较方案一:采用3位半数字电压表。 采用此方案电路结构简单,易于实现且易于维护。它的核心器件是一个双积分式A/D转换,双积分式DVM属于VT变换式,其基本原理是在一个测量周期内,首先将被测电压UX加到积分器的输入端,在确定的时间内进行积分,也称定时积分;然后切断UX,在积分器的输入端加与UX极性相反的电压UR,由于UR一定,所以称为定值积分,但积分方向相反,直到积分输出达到起始电平为止,从而将UX转换成时间间隔进行测量。只要用计数器累计时间间隔内的脉冲数,即为UX之值。其原理方框图如图1.1.1所示。显示器译码驱动A/D转换输入信号图1.1.1 3位半电压表原理图方案二:采用单片机为控制核心。目前单片机技术比较成熟,功能也比较强大,配合一定的外围电路可实现数字电压表,原理图如图1.1.2所示。输入信号经AD转换器转换后送到单片机进行数据处理,系统根据不同电压信号计算出不同的数值,并将其显示出来。采用这种方案优点是呆以依赖地成熟的单片机技术、运算功能较强、软件编程灵活、自由度大、设计成本也较低,能较准确地测量输入电压。缺点是在传统的单片机设计系统中必须使用许多分立元件组成单片机的外围电路,因此整个系统显得十分复杂,不易于实现。图1.1.2 单片机控制的数字电压表原理图方案三:采用FPGA作为系统控制的核心。现场可编程门阵列(FPGA)将所有器件集成在一块芯片上,体积大大减小、逻辑单元灵活、集成度高以及适用范围广等特点,可实现大规模和超大规模的集成电路,而且编程灵活、调试方便。综合上述分析,方案三为本设计最佳选择方案。1.2 AD转换方案的比较方案一:采用双积分型AD转换器。双积分型A/D转换器的原理是将输入电压转换成时间(脉冲宽度信号)或频率(脉冲频率),然后由定时器/计数器获得数字值,积分时间常数较大,具有滤波作用,消除了干扰,故双积分A/D转换具有较强的抗干扰能力。缺点是由于积分过程是个缓慢的过程,转换速度慢。方案二:采用逐次比较型AD转换。这是目前应用十分广泛的集成ADC,逐次比较型AD转换内部电路由一个比较器、DA转换器、时钟、逐次比较寄存器SAR、输出寄存器和控制逻辑电路等部分组成。具有速度高、功耗低。输出位数多等特点,其原理图如图1.2.1所示。图1.2.1 逐次比较ADC原理图经比较,采用逐次比较的A/D转换器1.3显示器方案的比较方案一:采用LED数码管,采用数码管动态显示,数码管具有结构简单、低损耗、寿命长、耐老化、成本低、对外界要求低、易于维护、操作简单,编程简单等优点。但是也有一个明显的缺点,即显示的信息量非常有限,只能显示几个有限的阿拉伯数字与字母,电路图如图1.3.1所示。图1.3.八段发光二极管显示器原理结构方案二:运用LCD液晶显示,液晶显示屏是以若干个58或511点阵块组成的显示字符群,每个点阵块为一个字符位.字符间距的行距都为一个点的宽度.采用这种液晶显示功耗低、可靠性高、轻薄短小、辐射小、可视面积大,可以同时显示多种信息。综上所述,拟定第二种方案,即采用LCD液晶显示电压值及相关信息。1.4总体方案设计由上节分析、比较、论证,决定了系统的最终方案:(1).控制部分:采用FPGA为控制核心(2)AD转换部分:采用逐次逼近(比较)型AD转换器ADC0809;(3)显示部分:采用液晶LCD显示系统基本框图如图1.4所示 FPGALCD显示ADC0809译码驱动码制变换档位控制电压输入控制信号按键图1.4 系统总体框图1.5系统的基本原理测量信号(电压信号)送入AD 转换器,控制信号模块发出控制信号,启动A/D的START进行转换,A/D采样得到的数字信号数据在数据处理模块中转换为相应的显示代码,最后经显示译码驱动模块发出控制与驱动信号,推动外部的显示模块(LCD)显示相应的数据。通过外部的键盘可以对系统进行复位控制和显示档位选择,不同的档位选择不同的输入电压范围(05、550)。2 单元电路设计2.1 A/D转换部分2.1.1 ADC 0809工作原理 ADC 0809是一种8位ADC,采用CMOS工艺制成的8 位八通道A/D转换器,片内有8路模拟采样开关,可控制8个模拟量中的一个进入转换器中。其内部结构图和引脚图分别如图2.1.1.1和2.1.1.2所示。图2.1.1.1 ADC0809内部结构片内有8路开关、模拟开关的地址锁存与译码电路、比较器、256R电阻T型网络、树状电子开关、逐次逼近寄存器SAR、三态输出锁存缓冲储存器、定时和控制电路等。 ADC0809通过引脚IN0,IN1,IN7可输入8路单边模拟输入电压。ALE将3位地址线ADDA,ADDB,ADDC进行锁存。图2.1.1.2 ADC0809引脚图在ADC0809片内的256R电阻T型网络和电子开关树它相当一个D/A转换器。它把预测的8位二进制数转换为模拟的电压幅值,送入比较器中与实际电压相比较。ADC0809主要引脚功能如下:IN0IN7:通道07的模拟量输入 D07:数字量输出 ADDC、ADDB、ADDA:通道(07)选择 ALE:通道地址锁存,正脉冲有效 START:启动信号,正脉冲有效,上升沿所有寄存器清0,下降沿开始转换 EOC:转换结束,高电平有效 OE:允许输出,高民平有效2.1.2 ADC0809的工作时序ADC0809的工作时序如图2.1.2.1所示。主要控制信号说明:,START是转换启动信号,高电平有效;ALE是3位通道选择地址(ADDC、ADDB、ADDA)信号的锁存信号。当模拟量送至某一输入端,由3位地址信号选择,而地址信号由ALE锁存;EOC是转换情况状态信号,当转换结束后,EOC输出高电平,以示转换结束;在EOC的上升沿后,若使能输出信号OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。 至此ADC0809的一次转换结束。图 2.1.2.1 ADC0809的工作时序图2.1.3档位控制电路 为了增加DVM的测量范围,设计了档位选择电路,其主要原理是采用电阻分压,原理上ADC0809有八路数据输入端口,也就是说可以分为八档,为了简化设计,只分了两档(1档,10档)图2.1.3.1档位控制电路原理图图中的电位器R25是用来校准的,因为各电阻的值不可能很精确,用电位器来微调校准以保证测量精度。ADC0809的输入范围为(05)V.由于档位的切换是通过程序来控制ADC0809各通道的选通来自动实现的,所以只要输入的电压范围超过5V,则档位自动切换到10档,即选通通道IN1。当输入电压范围为05V时,IN0导通,此时,UI=U26 而当输入电压范围为550V时,FPGA判断选择档位,IN1导通,此时 UI=U27即 UI=由于ADC0809数字量输出为8位,数字量化范围为0255,当输入电压为满量程5V时,转换电路对输入电压的分辨能力为 2.2 FPGA功能模块的设计2.2.1码制变换模块在此码制变换模块DATA_CONVERSION中主要实现的功能是将AD0809采样送来的8位二进制数转换为可被LCD识别的字符型LCD码。为了达到这一目的,首先要将8位二进制码变换为BCD码,然后再分别进行转换,得到字符型码,并送入译码显示模块。2.2.2 显示控制及驱动模块电压值的显示可由LCD实现。本系统选用了一块85字符型液晶显示模块LMB162ABA实现了低功耗,而且可带单位双排显示,字体美观大方。整个电路十分简洁。系统工作过程首先由 FPGA对ADC0809及LCD进行初始化,然后当有输入信号V i,由FPGA通过接口向ADC0809控制信号控制字,使其对输入的模拟信号进行转换,变为8位的数字信号送到输出端,由FPGA经过码制变换等处理后,再通过与LCD的接口驱动并发送数据。当ADC0809采样完成后,由码字变换模块将采样数字信号转换为LCD可识别的字符型数据后,送至驱动模块,再由其驱动LCD,将字符型数据送到LCD的D0D7端,实现显示。3、软件设计3.1 开发软件及编程语言简介系统采用硬件描述语言VHDL按模块化方式进行设计,并将各模块集成于FPGA芯片中,然后通过Xilinx ISE 4.2软件开发平台和ModelSim Xilinx Edition 5.3d XE仿真工具,对设计文件自动地完成逻辑编译、逻辑化简、综合及优化、逻辑布局布线、逻辑仿真,最后对FPGA芯片进行编程,实现系统的设计要求。采用VHDL(Very High Speed Integrated Circuit Hardware Descriptipon Language)超高速集成电路硬件描述语言设计复杂数字电路的方法具有很多优点,VHDL语言的设计技术齐全、方法灵活、支持广泛。VHDL语言的系统硬件描述能力很强,具有多层次描述系统硬件功能的能力,可以从系统级到门级电路,而且高层次的行为描述可以与低层次的RTL描述混合使用。VHDL在描述数字系统时,可以使用前后一致的语义和语法跨越多层次,并且使用跨越多个级别的混合描述模拟该系统。因此,可以对高层次行为描述的子系统及低层次详细实现子系统所组成的系统进行模拟。3.2程序流程图图3.2.1 系统程序流程图4、系统测试4.1测试仪器清单测试使用的仪器设备如表4.1.1所示表4.1.1测试使用的仪器设备序号名称型号数量备注13位半数字万用表UNI-T 1深圳胜利公司 2直流稳压电源DF1731SC2A 1江苏扬中电子仪器厂4.2测试及误差计算 系统的测试主要是测试硬件是否能正常工作,软件和硬件是否匹配,是否合乎设计的要求。在频率测试过程中,系统的测量范围系统的精度是两个较重要的指标。系统的测量结果如表4.2.1所示表4.2.1 系统测量数据表序号标准电压值(U/V)测量电压值(Ux/V)误差(%)12345678910源程序清单顶层:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following lines to use the declarations that are- provided for instantiating Xilinx primitive components.-library UNISIM;-use UNISIM.VComponents.all;entity top is Port ( clk,reset:in std_logic; key1,eoc:in std_logic; D:in std_logic_vector(7 downto 0); ale,start,oe,clk500k:out std_logic; cba:out std_logic_vector(2 downto 0);-0809通道选择 xs:out std_logic_vector(8 downto 0); -发光二极管显示状态 lcden:out std_logic; -接LCD使能端 lcdda:out std_logic; -接LCD_da信号输入端 lcdrw:out std_logic; -接LCD读写信号输入端 lcddata:inout std_logic_vector(7 downto 0);-接LCD数据输入位 end top;architecture Behavioral of top iscomponent key is Port (clk,reset:in std_logic; key1:in std_logic; clkz:out std_logic; dw1:out integer range 0 to 2; cba:out std_logic_vector(2 downto 0);end component;component ad0809 is Port ( clk,reset:in std_logic; eoc:in std_logic; D:in std_logic_vector(7 downto 0); ale,start,oe,clk500k:out std_logic; xs:out std_logic_vector(8 downto 0);-0809工作状态显示 Q:out std_logic_vector(7 downto 0);end component;component yima is Port ( clk:in std_logic; clkz:in std_logic; Q:in std_logic_vector(7 downto 0); v1,v2,v3,v4,v5:out integer range 0 to 9);end component;component lcd is generic(delay:integer:=100); -类属说明 Port ( clk,reset:in std_logic; dw1:in integer range 0 to 2; v1,v2,v3,v4,v5:in integer range 0 to 9; lcden:out std_logic; -接LCD使能端 lcdda:out std_logic; -接LCD_da信号输入端 lcdrw:out std_logic; -接LCD读写信号输入端 lcddata:inout std_logic_vector(7 downto 0);-接LCD数据输入位 end component;signal clkz_load:std_logic;signal dw1_load:integer range 0 to 2;signal Q_load:std_logic_vector(7 downto 0);signal v1_load,v2_load,v3_load,v4_load,v5_load:integer range 0 to 9;beginu1:key port map (clk=clk,reset=reset,key1=key1,clkz=clkz_load,dw1=dw1_load,cba=cba);u2:ad0809 port map (clk=clk,reset=reset,eoc=eoc,D=D,ale=ale,start=start,oe=oe,clk500k=clk500k,xs=xs,Q=Q_load);u3:yima port map (clk=clk,clkz=clkz_load,Q=Q_load,v1=v1_load,v2=v2_load,v3=v3_load,v4=v4_load,v5=v5_load);u4:lcd port map (clk=clk,reset=reset,dw1=dw1_load,v1=v1_load,v2=v2_load,v3=v3_load,v4=v4_load,v5=v5_load, lcden=lcden,lcdda=lcdda,lcdrw=lcdrw,lcddata=lcddata);end Behavioral;按键:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following lines to use the declarations that are- provided for instantiating Xilinx primitive components.-library UNISIM;-use UNISIM.VComponents.all;entity key is Port (clk,reset:in std_logic; key1:in std_logic; clkz:out std_logic; dw1:out integer range 0 to 2; cba:out std_logic_vector(2 downto 0);end key;architecture Behavioral of key issignal clkk:std_logic;beginprocess(clk,reset)variable clk1:std_logic;variable cnt:integer range 0 to 50000000;begin if reset=1 then if clkevent and clk=1 then if cnt49999999 then clk1:=1;cnt:=cnt+1; elsif cnt=50000000 then clk1:=0;cnt:=0; end if; end if; end if;clkz=clk1;end process;process(clk,reset)variable clk0:std_logic;variable cnt:integer range 0 to 3125000;-0.125sbegin if reset=0 then cnt:=0;clk0:=0; elsif clkevent and clk=1 then if cnt=3125000 then cnt:=0;clk0:=not clk0; else cnt:=cnt+1; end if;end if;clkk2 then cnt:=0; elsif key1=0 then cnt:=cnt+1; case cnt is when 1=cba=000;dw1cba=001;dw1cba=000;dw1=1; end case; end if; end if; end if;end process;end Behavioral;显示;library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following lines to use the declarations that are- provided for instantiating Xilinx primitive components.-library UNISIM;-use UNISIM.VComponents.all;entity lcd is generic(delay:integer:=100); -类属说明 Port ( clk,reset:in std_logic; dw1:in integer range 0 to 2; v1,v2,v3,v4,v5:in integer range 0 to 9; lcden:out std_logic; -接LCD使能端 lcdda:out std_logic; -接LCD_da信号输入端 lcdrw:out std_logic; -接LCD读写信号输入端 lcddata:inout std_logic_vector(7 downto 0);-接LCD数据输入位 end lcd;architecture Behavioral of lcd issignal clk_500hz:std_logic;type state is (set_dlnf,clear_lcd,set_cursor,set_dcb,set_location,write_data);signal current_state:state;type ram is array(0 to 9) of std_logic_vector(7 downto 0);signal dataram :ram;signal x1,x2,xv1,xv2,xv3,xv4,xv5:std_logic_vector(7 downto 0);constant v:std_logic_vector(7 downto 0):=01010110;-Fconstant g:std_logic_vector(7 downto 0):=00101101;-横杠constant k:std_logic_vector(7 downto 0):=00100000;-空格constant d:std_logic_vector(7 downto 0):=00101110;-小数点constantdw:std_logic_vector(7 downto 0):=01110110;-单位vbeginprocess(clk,reset,clk_500hz)variable cnt:integer range 0 to 5000;-1khz begin if reset=0then cnt:=0;clk_500hz=0; elsif clkevent and clk=1 then cnt:=cnt+1;if cnt2500 then clk_500hz=1;elsif cnt5000 then clk_500hz=0;else cnt:=0;clk_500hzx1=d;x2x1=k;x2x1=00111111;x2xv1xv1xv1xv1xv1xv1xv1xv1xv1xv1xv1xv2xv2xv2xv2xv2xv2xv2xv2xv2xv2xv2xv3xv3xv3xv3xv3xv3xv3xv3xv3xv3xv3xv4xv4xv4xv4xv4xv4xv4xv4xv4xv4xv4xv5xv5xv5xv5xv5xv5xv5xv5xv5xv5xv5=00111111; end case;end if;end process;process(clk,reset)begin if reset=0then dataram=(00110000),(00110000),(00110000),(00110000), (00110000),(00110000),(00110000),(00110000), (00110000),(00110000);elsif rising_edge(clk)then dataram(0)=v; dataram(1)=g; dataram(2)=xv1; dataram(3)=x1; dataram(4)=xv2; dataram(5)=x2; dataram(6)=xv3; dataram(7)=xv4; dataram(8)=xv5; dataram(9)=dw;end if;end process;process(clk_500hz,reset,dataram)variable cntt,cnt2:integer;begin if reset=0then current_state lcden=0; lcdda=0; lcdrw=0; lcddatadelay and cntt=delay*2 then lcden=1; else lcden=0; end if; if cntt=delay*3 then current_state lcden=0; lcdda=0; lcdrw=0; lcddatadelay and cntt=delay*2 then lcden=1; else lcden=0; end if; if cntt=delay*3 then current_state lcden=0; lcdda=0; lcdrw=0; lcddatadelay and cntt=delay*2 then lcden=1; else lcden=0; end if; if cntt=delay*3 then current_state lcden=0; lcdda=0; lcdrw=0; lcddatadelay and cntt=delay*2 then lcden=1; else lcden=0; end if; if cntt=delay*3 then current_state lcden=0; lcdda=0; lcdrw=0; lcddatadelay and cntt=delay*2 then lcden=1; else lcden=0; end if; if cntt=delay*3 then current_state lcden=0; lcdda=1; lcdrw=0; if cnt2=9 then lcddatadelay and cntt=delay*2 then lcden=1; else lcden=0; end if; if cntt=delay*3 then current_state=write_data; cntt:=0; cnt2:=cnt2+1; end if; else cnt2:=0; current_state=set_cursor; end if; end case; end if; end process;end Behavioral;adc0809:library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;- Uncomment the following lines to use the declarations that are- provided for instantiating Xilinx primitive components.-library UNISIM;-use UNISIM.VComponents.all;entity ad0809 is Port ( clk,reset:in std_logic; eoc:in std_logic; D:in std_logic_vector(7 downto 0); ale,start,oe,clk500k:out std_logic; xs:out std_logic_vector(8 downto 0); Q:out std_logic_vector(7

温馨提示

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

评论

0/150

提交评论