1、 目 录 第1章 引言 1 1.1设计要求 1 1.2设计思路 1 1.2 设计方案 2 第2章 硬件电路设计 1 2.1硬件电路框图 1 2.2ADC0809模块 1 2.3 FPGA模块 5 3.4显示模块 5 第3章 FPGA功能模块的设计及仿真 1 3.1系统软件原理 1 3.2采样控制模块 2 3.3数据处理模块 4 3.4扫描、显示模块 5 总结 1 致 谢 1 参考文献 1 源程序: 1 第1章 引言 数字电压表(Digital Voltmeter)简称DVM,是实验中的重要仪表,其数字化是指将连续的模拟电压量转换成不连续、离散的
2、数字量并加以显示。传统的实验用模拟电压表功能单一、精度低、体积大,内部核心多是模/数转换器,其精度很大程度上限制了整个表的准确度,可靠性较差。 而应用EDA(电子设汁自动化)技术及FPGA(现场可编程门阵列),其集成度高、速度快、性能十分可靠、用户可自由编程且编程语言通俗易懂、系统功能扩展非常方便。采用FPGA芯片控制通用A/D转换器可使速度、灵活性大大优于由微处理器和通用A/D转换器构成的数字电压表。[1] 数字式仪表是能把连续的被测量自动地变成断续的、用数字编码方式的、并以十进 制数字自动显示测量结果的一种测量仪表。这是一种新型仪表,它把电子技术、计算技术、自动化技术的成果与精密电测量
3、技术密切的结合在一起。成为仪器、仪表领域中独 立而完整的一个分支。 1.1设计要求 本课题主要研究数字电压表的一般设计原理,并结合新型的可编程逻辑器件(FPGA)设计了一种方便、实用的数字电压表。我主要设计软件那部分。采用ACEX1k30TC144-3的一款FPGA芯片实现电压表的数码显示的功能。设计中所要求设计的数字电压表为4位,由三大部分组成,数据转换模块进行模数转换后到数据处理模块处理得到BCD码转换成能被数码管识别的字型编码,再到显示模块,每一部分又包含了若干子电路,将各电路组合起来,就构成了一个整体。 1.2设计思路 硬件设计所需的硬件主要有:直流电平输出电路、ADC080
4、9、七段显示器。 基于FPGA的数字电压表有三大部分组成,具体分为A/D转换电路、FPGA控制电路和显示电路。电压输入A/D转换器后转化为数字量送入FPGA芯片,经过FPGA的逻辑控制(A/D控制、BCD码转换和扫描显示),最终由LED数码显示结果。 图1.1硬件结构图 1.2 设计方案 我采用8位A/D转换器ADC0809对模拟电压采样,以一片高性能FPGA芯片为控制核心,以软件实现了诸多硬件功能,对电压信号的转换结果进行准确实时的运算处理并送出显示。系统的主要功能都集成在一块芯片上,大大减少了系统的分立元件数量,降低了功耗,增加了可靠性,较好地实现了电压的精准测量 第2章
5、 硬件电路设计 2.1硬件电路框图 数字电压表,它是采用数字化测量技术,把连续的模拟量(直流或交流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、灵敏度高和分辨率高、测量速度快等特点而倍受青睐。通常按A/D转换方式的不同将DVM分成两大类,一类是直接转换型;另一类是间接转换型,又称积分型,包括电压一频率变换。而由前面分析可知本课题的核心电路路由FPGA完成,选用了Altera公司的EPF10K10LC84-4芯片,用VHDL语言对它进行设计,本设计是由三大模块组成,(1)AD转换模块,组要负责将模拟信号转换为数字信号,以便送FPGA处
6、理;(2)FPGA模块,激活A/D转换器动作、接收A/D转换器传递过来的数字转换值,将接收到的转换值调整成对应的数字信号;(3)显示模块,将数据处理模块输出的4位BCD码译成相应7段数码驱功值,使模拟电压值在4个数码管上显示。工作时,系统按一定的速率采集输入的模拟电压,经ADC0809CCN转换为8位数字量,此8位数字量经FPGA处理得到模拟电压的数字码,再输入数码管获得被测电压的数字显示。此电压表的测量范围:0~5V,四位数码管显示。整个数字电压表的硬件结构如3-1图所示[9]。 电压输入 A/D转换器 A/D控制 控制核心 FPGA 扫描显示 显示器 B
7、CD码转换 图2.1系统原理图 2.2ADC0809模块 ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。 2.2.1 A/D转换器的主要技术指标 (1)分辨率 分辨率是指A/D转换器能分辨的最小模拟输入量。通常用能转换成的数字量的位数来表示,如8位、10位、12位、16位等。位数越高,分辨率越高。例如,对于8位A/D转换器,当输入电压满刻度为5V时,其输出数字量的变化范围为0~255,转换电路对输入模拟电压的分辨能力为5V/255=19.5m
8、V。 (2)转换时间 转换时间是A/D转换器完成一次转换所需的时间。 转换时间是编程时必须考虑的参数。若CPU采用无条件传送方式输入A/D转换后的数据,则从启动A/D芯片转换开始,到A/D芯片转换结束,需要一定的时间,此时间为延时等待时间,实现延时等待的一段延时程序,要放在启动转换程序之后,此延时等待时间必须大于或等于A/D转换时间。 (3)量程 量程是指A/D转换器所能转换的输入电压范围。 (4)精度 精度是指与数字输出量所对应的模拟输入量的实际值与理论值之间的差值。A/D转换电路中与每一个数字量对应的模拟输入量并非是单一的数值,而是一个范围 。例如:对满刻度输入电压为5V的1
9、2位A/D转换器, = =1.22mV,定义为数字量的最小有效位LSB。若理论上输入的模拟量A,产生数字量D,而实际输入模拟量A 产生还是数字量D,则称此转换器的精度为 0LSB。当模拟电压 或 还是产生同一数字量D,则称其精度为 1/4LSB。 目前常用的A/D转换器的精度为1/4~2LSB。实现A/ D 转换的方法比较多, 常见的有计数法、双积分法和逐次逼近法。由于逐次逼近式A / D 转换具有速度快, 分辨率高等优点, 而且采用该法的ADC芯片成本较低, 因此在设计中采用该种方式。逐次逼近式A/ D 转换器的原理如图2 所示。它由逐次逼近寄存器、D/ A 转换器、比较器和缓冲寄存器等组
10、成。当启动信号由高电平变为低电平时, 逐次逼近寄存器清0, 这时, D/ A 转换器输出电压V o 也为0, 当启动信号变为高电平时, 转换开始, 同时, 逐次逼近寄存器进行计数。[10] 图2.2逐次逼近式A/D转换 逐次逼近寄存器工作时与普通计数器不同, 它不是从低位向高位逐一进行计数和进位, 而是从最高位开始, 通过设置试探值来进行计数。在第一个时钟脉冲到来时, 控制电路把最高位送到逐次逼近寄存器, 使它的输出为10000000, 这个输出数字一出现, D/ A 转换器的输出电压V o 就成为满量程值的128/ 255。这时, 若Vo> Vi 则作为比较器的运算放大器的输出就成为低电
11、平, 控制电路据此清除逐次逼近寄存器中的最高位; 若Vo < Vi 则比较器输出高电平, 控制电路使最高位的1保留下来。若最高位被保留下来, 则逐次逼近寄存器的内容为10000000, 下一个时钟脉冲使次低位D6 为1。于是, 逐次逼近寄存器的值为11000000, D/ A 转换器的输出电压Vo 到达满量程值的192/ 255。此后, 若Vo> V i 则比较器输出为低电平, 从而使次高位域复位; 若V o< Vi 则比较器输出为高电平, 从而保留次高位为1。重复上述过程, 经过N 次比较以后, 逐次逼近寄存器中得到的值就是转换后的数值。转换结束后, 控制电路送出一个低电平作为结束信号, 此
12、信号的下降沿将逐次逼近寄存器中的数字量送入缓冲寄存器, 从而得到数字量输出。 2.2.2 ADC0809工作原理 (1)ADC0809.芯片介绍 ADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。ADC0809的分辨率为8位,转换时间约1OOus,含锁存控制的8路多路开关,输出有三态缓冲器控制,单5V电源供电。 图2.3 ADC0809管脚分配图 (2). ADC0809的工作原理 START是转换启动信号,高电平有效;ALE是3位通道选择地址(ADDC, ADDB, ADDA)信号的锁存信号。当模拟量送至某一输入
13、端(IN I或IN2等),由3位地址信号选择,而地址信号由ALE锁存;EOC是转换情况状态信号(类似于AD574的STATUS),当启动转换约100us后,EOC产生一个负脉冲,以表示转换结束;在EOC的上升沿后,若使输出使能信号OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。至此ADC0809的一次转换结束了。[11] 2.2.3. ADC0809的工作状态 首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到
14、A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平 时,输出三态门打开,转换结果的数字量输出到数据总线上。 2.3 FPGA模块 我们使用的FPGA是Altera公司的ACEX1K器件1K30TC144-3,采用ACEX1k30TC144-3的一款FPGA芯片实现电压表的数码显示的功能。在其中主要用状态机作法,产生ADC0809CCN的片选信号、读/写控制信号,通过状态信号INTR判断转换是否结束;转换结束后将转换数据锁存并输出。主要负责对AD转换器的控制,用以初始化A/D转换器,并启动且接受A/D转换器传递过来的数字转换
15、值然后将接受到的转换值调整成模拟电压所对应的数字信号。 OE ABC START ALE EOC 转换 控制 模块 数据 转换 译码 模块 8位 二进制数数 12位 二进制数 三位 数码管 数据输入 C 图2.4 FPGA模块 3.4显示模块 本模块的任务是把数据处理模块处理得到的BCD码转换成能被数码管识别的字型编码。8位二进制数转换成BCD码后为12位,因此需4个数码管显示结果,由于采用GW 48实验板,该板自带了译码电路,故只需将数据处理模块处理得到的12位BCD码DATA [11~0]分为三组即DATA [1
16、1~8]、DATA [7~4]、DATA_OUT[3~0];然后分别接GW 48实验板上的引脚PIO35~ PIO32、PIO39~ PIO36、PIO43~ PIO40相接。 图2.5显示模块 图2.6 LED显示数字电压表设计原理框图 第3章 FPGA功能模块的设计及仿真 3.1系统软件原理 基于FPGA的数字电压表有三大部分组成,具体分为A/D转换电路、FPGA控制电路和显示电路。电压输入A/D转换器后转化为数字量送入FPGA芯片,经过FPGA的逻辑控 制(A/D控制、BCD码转换和扫描显示),最终由LED数码显示结果。 控制模块,
17、A/D转换控制模块,用以初始化A/D转换器(即ADC0809)、并启动且接收ADC0809传递过来的数字转换值 数据处理模块,将接收到的转换值调整成对应的数字信号 显示模块,将数据处理模块输出的4位BCD码译成相应 7 段数码驱功值,使模拟电压值在3个数码管上显示。具体工作方式如下图所示,首先,被测电压信号进入A/D转换器,FPGA中控制信号模块发出控制信号,启动A/D转换器进行转换,其采样得到的数字信号数据在相应的码制转换模块中转换为显示代码。最后译码驱动模块发出显示控制与驱动信号,驱动外部的LCD模块显示相应的数据。 图3.1语言设计流程图 3.2采样控制模块 8 位A/
18、D 转换器ADC0809 为单极性输入、逐次逼近型A/D 转换器逐次逼近式ADC 是应用最广泛的一种A/D 转换方法。逐次逼近式进行转换时, 用一个逐次比较寄存器存放转换出来的数字量, 转换结束时, 将数字量送到缓冲器中。[12]由启动信号对逐次比较寄存器清零, 使D/A 转换器输出电压U0 也为零。比较器输出高电平, 转换开始。同时, 逐次逼近寄存器在控制电路控制下进行计数[13]。 ADC0809 控制逻辑是通过类似对分搜索的方法来控制逐次比较寄存器进行数, 即首先使最高位D7 = 1, 经D/A 转换后得到一个满量程一半的模拟电压U0。U0 与输入电压Ui 进行比较, 如果Ui >Uo
19、 , 比较器得出1, 则控制电路使逐次比较寄存器的D7 位保留1; 如果Ui < Uo , 比较器输出为0, 则清除位D7 的1, 然后使次高位D6 = 1, 与上次的结果相加后经DPA 转换得到新的U0 ( 满量程的3P4 或1P4) ,再与Ui 进行比较, 决定保留还是清除位上的1, ,,重复上述过程, 直至D0 为止。这样, 经过8 次比较后, 8 位逐次比较寄存器的状态即为一次A/D 转换完成后所对应的数字量。ADC0809 除含有8 位逐次逼近型APD 转换器外, 还有8 通道多路转换器和3 位地址锁存和译码器, 以实现对8 路输入模拟量的选择。当地址锁存允许信号有效时, 将3 位地
20、址锁入地址锁存器中,经译码器选择8 路模拟量中的一路通过8 位A/D 转换器转换输出。输出端具有三态输出锁存缓冲器,受输出允许信号的控制, 当该信号为高电平时, 打开输出缓冲器三态门, 转换结果输出到数据总线上; 当该信号为低电平时, 输出数据线呈高阻态。ADC0809 是CMOS 工艺芯片, 允许的电源范围较宽,可从5~ 15V。当该芯片采用单5V 电源工作时, 模拟信号输入范围为0 ~ 5V, 输出可与TTL 兼容。[14] 根据ADC0809工作原理设计的采样控制器模。模块图如图4.2所示。其中d[7: 0] , eoc, oe, ale, start 与ADC0809 的同名引脚相对
21、应; reset 为复位信号, 高电平有效; q [7: 0] 为采样控制器的输出数据, 其实际上是ADC0809 转换所得数据的缓存输出。 基于Verilog HDL 语言的A/D 采样控制器设计 图3.2 采样控制模块 。 图3.3采样控制模块功能仿真波形图 3.3数据处理模块 ADC0809是8位模数转换器,它的输出状态共有256种,如果输入信号Ui为0~5V电压范围,则每两个状态值为5/(256-1),约为0.0196V,故测量分辨率为0.02V。常用测量方法是:当读取到DB7~DB0转换值是XXH时,电压测量值为U≈XXH×0.02V;本设计直接采用宏模
22、块的参数化乘法器lpm_mult和参数化常数产生器,直接计算U的值。然后将八位二进制通过译码输出得到12位BCD码。 [17] 图3.4数据处理模块 图3.5 8位二进制转换BCD码 图3.6 8位2进制转换成BCD码的功能仿真图 3.4扫描、显示模块 DATAIN是数据处理模块输出的电压值的BCD码;SEL是数码管的片选信号;通过扫描分别输出四位电压值的BCD码DATA,将BCD码译成相应的7段数码驱动值,送数码管显示。 图3.7显示模块 图3.8七段显示译码器模块的符号 图3.9 扫描显示原理图 图3.10扫描显示功能仿真波形图
23、 总结 随着信息技术获得了突飞猛进的发展,信息技术渗透了我们生活的几乎全部领域,改变着人类的生存状态和思维模式。而我们的课题所涉及的电子设计自动化(EDA)技术就是在这种时代背景下产生的,并影响巨大。FPGA是新型的可编程逻辑器件,与传统 ASIC 相比,具有设计开发周期短、设计制造成本低、开发工具先进 等优点,特别适合于产品的样品开发和小批量生产。传统的数字电压表多以单片机为控制核心,芯片集成度不高,系统连线复杂,难以小型化,尤其在产品需求发生变化时,不得不重新布版、调试,增加了投资风险和成本。而采用 FPGA 进行产品开发,可以灵活地进行模块配置,大大缩短了
24、开发周期,也有利于数字电压表向小型化、集成化的方向发展。 随着电子技术的发展,当前数字电子系统的设计正朝着速度快、容量大、体积小、重量轻的方向发展。推动该潮流发展的引擎就是日趋进步和完善的ASIC设计技术。目前数字系统的设计可以直接面向用户需求,根据系统的行为和功能的要求,自上而下的完成相应的描述、综合、优化、仿真与验证,直接生成器件。上述设计过程除了系统行为和功能描述以外,其余所有的设计几乎都可以用计算机来自动完成,也就说做到了电子设计自动化(EDA)这样做可以大大的缩短系统的设计周期,以适应当今品种多、批量小的电子市场的需求。 致 谢 在本文完成之际,这里面每一个页面的显示
25、每一行语句的调试,每一段文本的输入之中都有我辛勤的汗水。设计的时间虽然短暂,我却从中学到了很多的东西。我由衷地感谢关怀,教诲,帮助、支持和鼓励我完成学业的老师和朋友,特别感谢我的指导老师XX老师。她一直对我悉心指导,严格要求,热情鼓励。为我创造了很多锻炼提高的机会。XX老师为我论文的顺利完成指出了很好的方向。XX老师渊博的知识,宽大无私的胸怀,夜以继日的工作精神,对事业的孜孜追求,骄人不倦的教师风范和对问题的敏锐观察力,都将使我毕生受益。 在此我谨向我的指导老师以及在毕业设计过程中给予我很大帮助的老师、同学致以最诚挚的 参考文献 [1] 包本刚.基于FPGA的数字电压表设计[J].电子
26、工程师,2007,25(5):63-65. [2] 潘松主编《EDA技术实用教程》[M].北京:科学出版社,2003,P5. [3] 彭成.基于FPGA的测频测相及CAN通信模拟的技术与实现[D]. 大连:大连海事大学,2006. [4] 王宝友.EDA技术实用教程,北京联合大学出版社(自然科学版),2002 [5] 程文华.基于条件插值算法的手持终端图像显示技术研究[D]. 华东师范大学,2010. [6] 李跃文. 基于FPGA的中频电源控制电路的研究[D]. 重庆:重庆大学,2009. [7] 赵雅兴.《FPGA原理设计与应用》[M].天津大学出版社,1999,P89—P92
27、 [8] 易仲芳主编《80X86微型计算机原理与应用》[M].电子工业出版社,1995,P84—P89. 源程序: module adc( d, clk, eoc, lock, ale, start, oe, adda, q, reset) ; input reset; input[ 7: 0] d; input clk, eoc; output lock, ale, start, oe, adda; output[ 7: 0] q; reg [ 7: 0] q; reg
28、ale, start, oe, adda; reg [2:0] current_state; reg [2:0] next_state; reg lock; //定义状态 parameter st0= 3'b000; parameter st1= 3'b001; parameter st2= 3'b010; parameter st3= 3'b011; parameter st4= 3'b100; parameter st5= 3'b101; parameter st6= 3'b110; //组合逻辑 always@( current_state or eoc)
29、begin case( current_state) st0: begin ale <= 0; start <= 0; oe <= 0; lock<= 0; next_state <= st1; end st1: begin ale <= 1; start <= 0; oe <= 0; lock<= 0; next_state <= st2; end st2: begin ale <= 0; start <= 1; oe <= 0; lock<= 0; next_state <= st3; end st3: begin ale <= 0; start <= 0; oe <= 0; l
30、ock<= 0; if( ! eoc = = 1 ) next_state <= st3; else next_state <= st4; end st4: begin ale <= 0; start <= 0; oe <= 0; lock<= 0; if( eoc == 0) next_state <= st4; else next_state <= st5; end st5: begin ale <= 0; start <= 0; oe <= 1; lock<= 0; next_state <= st6; end st6: begin ale <= 0; start <=
31、 0; oe <= 1; lock<= 1; next_state <= st0; end default : begin ale <= 0; start <= 0; oe <= 0;lock <= 0; next_state <= st0; end endcase end always@( posedge clk or posedge reset ) begin if( reset ) begin current_state<= 0; adda <= 1; end else current_state<= next_state; end //数据锁存 always@ ( posedge lock) begin q <= d; end endmodule






