基于FPGA的数字电压表的设计.docx

上传人:b****8 文档编号:10714307 上传时间:2023-02-22 格式:DOCX 页数:21 大小:124.08KB
下载 相关 举报
基于FPGA的数字电压表的设计.docx_第1页
第1页 / 共21页
基于FPGA的数字电压表的设计.docx_第2页
第2页 / 共21页
基于FPGA的数字电压表的设计.docx_第3页
第3页 / 共21页
基于FPGA的数字电压表的设计.docx_第4页
第4页 / 共21页
基于FPGA的数字电压表的设计.docx_第5页
第5页 / 共21页
点击查看更多>>
下载资源
资源描述

基于FPGA的数字电压表的设计.docx

《基于FPGA的数字电压表的设计.docx》由会员分享,可在线阅读,更多相关《基于FPGA的数字电压表的设计.docx(21页珍藏版)》请在冰豆网上搜索。

基于FPGA的数字电压表的设计.docx

基于FPGA的数字电压表的设计

基于FPGA的数字电压表的设计

基于FPGA的数字电压表的设计

 

摘要

电子设计自动化(electronicdesignautomation,EDA)是近几年迅速发展起来的将计算机软件、硬件、微电子技术交叉运用的现代电子设计技术。

其中EDA设计语言中的VHDL语言是一种快速的电路设计工具,功能涵盖了电路描述、电路综合、电路仿真等三大电路设计内容。

本电压表的电路设计正是用VHDL语言完成的。

此次设计主要应用的软件是美国ALTERA公司自行设计的一种QuartusⅡ。

本次所设计的电压表的测量范围是0~5V,精度为0.01V。

此电压表的设计特点为:

通过软件编程下载到硬件实现,设计周期短,开发效率高。

关键词:

电子设计自动化(EDA);FPGA;VHDL;A/D采集;数字电压表

DesignofDitalVoltmeterBasedonFPGA

Abstract

Thedesignofdigitalsystemisbecomingfaster,bulkier,smallerandlighterthanbefore.Electronicdesignautomationisinthelastfewyearsquicklydevelop,itmakesuseofsoftware,hardware,micro-electronicstechnologytoformacourseofelectronicdesign.Amongthem,theVHDLlanguageofEDAisakindoftooloffastcircuitdesign,thefunctioncoveredthecircuitdescribe,thecircuitsynthesize,thecircuitimitatethetrueetc.ThecircuitofthedesignthatuseVHDLlanguagetocomplete.ThethistimedesignisprimarilytheappliedsoftwareisQuartusⅡlopmenttheefficiencyishigh.

Keywords:

ElectronicDesignAutomation(EDA);FPGA;VHDL;A/DAcquisitiondigitalvoltage

 

第一章绪论

 

1.1研究目的及意义

数字电压表(DigitalVoltmeter)简称DVM,是大学物理教学和实验中的重要仪表,其数字化是指将连续的模拟电压量转换成不连续、离散的数字量并加以显示。

传统的实验用模拟电压表功能单一、精度低、体积大,且存在读数时的视差,长时间连续使用易引起视觉疲劳,使用中存在诸多不便。

而目前数字万用表的内部核心多是模/数转换器,其精度很大程度上限制了整个表的准确度,可靠性较差。

传统的数字电压表设汁通常以大规模ASIC(专用集成电路)为核心器件,并辅以少量中规模集成电路及显示器件构成。

ASIC完成从模拟量的输入到数字量的输出,是数字电压表的心脏。

这种电压表的设计简单、精确度高,但是这种设计方法由于采用了ASIC器件使得它欠缺灵活性,其系统功能固定,难以更新扩展。

后来发展起来的用微处理器(单片机)控制通用A/D转换器件的数字电压表的设计的灵活性明显提高,系统功能的扩展变得简单,但是由于微处理器的引脚数量有限,其控制转换速度和灵活性还是不能满足日益发展的电子工业的需求。

而应用EDA(电子设汁自动化)技术及FPGA(现场可编程门阵列),其集成度高、速度快、性能十分可靠、用户可自由编程且编程语言通俗易懂、系统功能扩展非常方便。

采用FPGA芯片控制通用A/D转换器可使速度、灵活性大大优于由微处理器和通用A/D转换器构成的数字电压表。

本文采用8位A/D转换器ADC0809对模拟电压采样,以一片高性能FPGA芯片为控制核心,以软件实现了诸多硬件功能,对电压信号的转换结果进行准确实时的运算处理并送出显示。

系统的主要功能都集成在一块芯片上,大大减少了系统的分立元件数量,降低了功耗,增加了可靠性,较好地实现了电压的精准测量。

1.2本课题国内外研究概况、应用前景

科学技术的发展为测量仪器、仪表提供了新原理和新技术以及新型的元、器体,同时又对测量仪表提出了更新、更高的要求。

数字电压表(简写为DVM)就是在精密电测量技术、计算技术、自动化技术和电子技术的基础上产生和发展起来的。

数字式仪表是能把连续的被测量自动地变成断续的、用数字编码方式的、并以十进制数字自动显示测量结果的一种测量仪表。

这是一种新型仪表,它把电子技术、计算技术、自动化技术的成果与精密电测量技术密切的结合在一起。

成为仪器、仪表领域中独立而完整的一个分支。

1952年,美国NLS公司首创四位数字电压表,到现在的五十多年中经过了不断的改进和提高。

电压表是从电位差计的自动化考虑中研制成功的,开始是四位然后是五位、六位,而现在发展到七位、八位数码显示;从最初的一、二种工作原理发展到几十种原理,从最早采用继电器、电子管发展到全晶体管化、集成电路化、微处理器化;认一台DVM只能测一、二种参数到能测十几种参数的多用型;显示器件也从辉光数码显示发展到等离子体、发光二极管、液晶显示等。

电压表的体积和功耗越来越小,重量不断减轻,价格也逐步下降,可靠性越来越高,量程范围也逐渐扩大。

回顾一下电压表的发展过程,大致可分为以下三个阶段:

数字化阶段。

50-60年代中期,电压表的特点是运用各种原理实现模数(A/D)转换,即将模拟量转化成数字量,从而实现测量仪表的数字化。

高准确度阶段。

由于精密电测量的需要,电压表开始向高准确度、高位数方向发展,出现了所谓复合型原理的仪表。

智能化阶段。

60年代末期,电子技术和工艺结构有了飞跃的发展,而大规模集成电路(LSI)与计算机技术相结合的产物是微处理器(简写为μP)。

1972年,美国Intel公司首创微处理器不久即研制出微处理器式数字电压表,实现了电压表数据处理自动化和可编程序。

因为带有存贮器并使用软件,所以可进行信息处理,可通过标准接口组成自动测试系统(简写为ATS)。

这些仪表除了完成原有电压表的各种功能外,还能够自校、自检,保证了自动测量的高准确度,实现了仪器、仪表的所谓“智能化”。

当前,智能表发展十分迅速,而微处理式电压表在智能仪表中占的比重最大。

智能化的电压表为实现各种物理量的动态测量提供了可能。

 

第二章硬件电路设计

    

2.1ADC0809模块

ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件。

其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。

2.1.1A/D转换器的主要技术指标

(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.2ADC0809工作原理

1.芯片介绍

ADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。

ADC0809的分辨率为8位,转换时间约1OOus,含锁存控制的8路多路开关,输出有三态缓冲器控制,单5V电源供电。

其实物图如所示。

图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.3.工作时序

ADC0809的工作时序如图3.4所示。

图3.4ADC0809工作时序图

2.1.4ADC0809的工作过程

首先输入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中读出的值

其程序为:

begin

lock_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

nto4)="0011"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"else

do1-"01010";

doo2<=do2whendo2<"01010"else

do2-"01010";

doo3<=do3whendo3<"01010"else

do3-"01010";

doo4<=do4whendo4<"01010"else

do4-"01010";

本模块的功能仿真结果如图4.4所示;当转换数据为10110110,通过查表高4位1011是3.438V,而低4位0110是0.098V,最后的电压输出结果是3.438V+0.098V

=3.536V,它的BCD码表示为,仿真结果正确。

3.4扫描、显示模块

ain3~0是数据处理模块输出的电压值的BCD码;lcd_rs是LCD1602的命令/数据选择信号;lcd_rw是LCD1602的读/写选择信号;lcd_en是LCD1602的使能信号;data是LCD1602的数据输入信号。

其方框图如4.5

图4.5显示模块

其程序为:

architectureoneoflcd1602driveris

constantidle:

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_ve

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 解决方案 > 学习计划

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1