您好,欢迎访问三七文档
淮阴师范学院物理与电子电气工程学院课程设计报告学生姓名学号班级专业电气工程及其自动化题目指导教师2011年12月课程设计报告1一、任务和设计要求利用FPGA与模数转换器ADC0804设计一个数字电压表,能够测量0~5V之间的直流电压,用三个数码管显示被测电压,要求精确到小数点后两位数字。了解数字电压表的工作原理,掌握可编程逻辑器件与模数转换器之间的接口电路设计及调试方法。下载并调试电路功能,分析芯片资源的占用情况。二、设计原理数字电压表(DigitalVoltmeter)简称DVM,是一种用数字显示的电压测量仪表。由于数字电压表具有读数准确方便、精度高、误差小、灵敏度高和分辨率高、测量速度快等特点而备受青睐。其基本原理是采用数字化测量技术,对直流电压进行模数转换,转换成不连续、离散的数字形式并加以显示。由此可知数字电压表的设计应包括三个主要部分:作为电压表采样端口的模数转换单元、数据处理单元以及电压值显示单元。设计要求利用ADC0804模数转换器,FPGA作为数据处理的核心器件,用LED数码管进行电压值的显示。系统结构框图如图7-1所示图7-1系统结构框图1、数模转换器工作原理ADC0804是用CMOS集成工艺制成的逐次比较型模数转换芯片,分辨率为8位,转换时间100us,输入电压范围为0~5V,,该芯片内部有输出数据锁存器。ADC0804芯片外引脚如图7-2所示ADC0804FPGA3位LED数码管时钟数据输入个位十位百位cswrrdintr课程设计报告2图7-2ADC0804引脚图其中VIN(+)、VIN(-)为ADC0804的模拟信号输入端,用以接收单极性、双极性或差模输入信号;D0~D7为A/D转换器数字信号输入端,CLKIN为外界提供的时钟脉冲输入端,频率限制在100kHz~1460kHz;CLKr为内部时钟发生器外接阻端,与CLKIN端配合可以由芯片自身产生时钟脉冲,频率为1/1.1RC。ADC0804的工作时序如图7-3所示,当片选信号/CS与写输入信号/WR同时为低电平时,A/D转化器启动,在/WR上升沿后100us完成模数转换,转换结果存入芯片内部的输出数据锁存器,如图7-3(a)所示。转换结束输出信号/INTR自动变为低电平,表示本次转换已结束。如/CS读输入信号/RD同时为低电平,则数据锁存器三态门打开,数字信号送出至输出端D7~D0,/RD高电平到来后数据锁存器三态门回到高阻状态,如图7-3(b)所示。(a)(b)图7-3ADC0804的时序图2、数据处理及显示单元FPGA芯片负责ADC0804A/D转换过程的启动以及转换数据的读取。同时,把读取的8位二进制数据转换成便于输出的3位LED段码送给LED数码管显示。因此FPGA部分的程序设计应包括ADC0804转换接口控制模块、译码模块,FPGA电路设计原理如图7-4所示。本设计采用5V参考电压,测量范围为0~5V,由于模数转换器件ADC0804的数字输出课程设计报告3为8位,则电压的最小分辨率为0.02V,也就是说若转换后的数据为00H,则对应的电压值为0V,转换后的数据为01H,则对应的电压值为0.02V,以此类推,若将转换数据以一定的规则从小到大存放,则可转换数据与实际电压值,以及数据存放地址间的对应关系见表7-1。若将电压数值的每一位用4位BCD码表示(不考虑小数点),则可得如表7-1所示的高四位BCD码和低四位BCD码。表7-1ADC0804转换数据与实际电压值对应关系地址高四位字节高四位电压值高四位BCD码地址低四位字节低四位电压值低四位BCD码00H00000.000000H20H00000.000000H02H00010.320032H22H00010.020002H04H00100.640064H24H00100.040004H06H00110.960096H26H00110.060006H08H01001.280128H28H01000.080008H0AH01011.600160H2AH01010.100010H0CH01101.920192H2CH01100.120012H0EH01112.240224H2EH01110.140014H10H10002.560256H30H10000.160016H12H10012.880288H32H10010.180018H14H10103.200320H34H10100.200020H16H10113.520352H36H10110.220022H18H11003.840384H38H11000.240024H1AH11014.160416H3AH11010.260026H1CH11104.480448H3CH11100.280028H1EH11114.800280H3EH11110.300030H(1)查表法的设计思路如下:由表7-1的对应关系,编写一个查表程序,表内预先存放电压值对应的BCD码,根据采集到的数字电压值,从表中查到高四位BCD码和低四位BCD码,再进行十进制数相加即可得到最终电压值的BCD码。BCD码就是利用4位二进制编码表示十进制数的一种编码。为了实现十进制数运算,必须了解BCD码的运算原理。由于BCD码表示范围为0-9,所以当运算结果大于9时必须进行十进制的调整所谓十进制调整,根据已知数字逻辑原理就是将运算结果加0110(6)进行修正,如图7-5所示,程序设计时,需要注意判断两个数的和是否大于9.例如:从AD0804上取得的数据为“11011110”,高四位1101对应的电压值为4.16V,其对应的BCD编码为“010000010110”,第四位1110对应的电压值为0.28V,其对应的BCD编码为“000000101000”。“010000010110”+“000000101000”=“010000111110”,其和的第四位“1110”,大于9,加6将其调整为BCD码,其值为0100,冰洁向前有一进位,是“0011”变为“0100”,则天正后的数据为“010001000100”,表示十进制数“4.44”,与4.16+0.28的结果相符。如果采用查表法实现数据处理,FPGA设计中需要采用存储器电路,BCD码转换电路等。(2)计算法的设计思路如下:由表7-1可知,如果将转换后的搞,第四位字节数据课程设计报告4看作是一个8位二进制数的话,电压值与转换后的数据之间有一个2倍的关系,假设转换后的数据为“11011110”,“11011110”对应的十进制数为222,222*2=444,与“11011110”对应4.44V电压值相等,而十进制数的显示可以通过对10取模和取余数的方法依次获得个位,十位,百位,分别显示,显示时需要在最高位后加一个小数点显示。如果采用计算法实现数据处理,FPGA设计中需要采用乘法,除法电路才能实现数据处理。三、系统设计1.模数转换接口电路的设计根据模数转换芯片ADC0804的工作时序,需要完成ADC0809的初始化、A/D变换的启动、状态读取及数据读取、数据锁存等功能。采用状态机的设计思路,分4个状态完成模数转换的操作。2.数据处理模块的设计(1)计算法进行数据处理模块的设计。计算法对数据处理需要用到无符号数乘法和除法,所以在VHDL要用到std_logic_arith库和std_logic_unsigned库。乘除运算的对象必须是整形数,必要时通过conv_integer和conv_std_logic_vector函数进行数据类型的转换。除法运算可采用调用宏函数的方法生成。(2)查表法进行数据处理模块的设计。大于9的四位二进制码加6调整为对应的BCD码。程序设计时可从低四位到高四位依次进行调整。3.显示模块的设计本模块的任务是把数据处理模块得到的BCD码转换成能被数码管识别的段码。3位电压表需要3个LED数码管显示,为了节省资源,采用动态扫描显示方式,扫描时钟由系统时钟CLK提供,其频率大于100Hz,否则有闪烁现象。在时钟信号作用下,当扫描信号为001、010、100时,分别将个位、十位、百位数据送给bexd,再根据bexd的具体数值将对应段码送LED数码管,实现数据显示。四、参考程序(1)查表法设计的VHDL程序:LIBRARYieee;USEieee.std_logic_1164.all;USEieee.std_logic_arith.all;USEieee.std_logic_unsigned.all;ENTITYvolmeterisPORT(clk:inStd_logic;int:inStd_logic;课程设计报告5dati:inStd_logic_vector(7downto0);wr,rd,cs:outStd_logic;reset:inStd_logic;scan:outStd_logic_vector(2downto0);dato:outStd_logic_vector(7downto0));end;ARCHITECTUREarchOFvolmeterISSIGNALqclk,qint:std_logic;SIGNALclkcount:std_logic_vector(3downto0);SIGNALhexd:std_logic_vector(4downto0);SIGNALdata:std_logic_vector(7downto0);SIGNALlclk:STD_LOGIC;SIGNALvoltage,data_sum,data_l,data_h:std_logic_vector(15downto0);SIGNALaddress_1,address_h:std_logic_vector(5downto0);typestateis(s0,s1,s2,s3);SIGNALsta,led_sta:state;componentlpm_rom0PORT(address:INSTD_LOGIC_VECTOR(5DOWNTO0);clock:INSTD_LOGIC;q:OUTSTD_LOGIC_VECTOR(7DOWNTO0));课程设计报告6endcomponent;BEGINqint=int;process(clk,clkcount)beginifclk'eventandclk='1'thenclkcount=clkcount+1;endif;qclk=clkcount(3);endprocess;process(qclk,qint,reset,lclk)beginifreset='1'thensta=s0;cs='1';wr='1';rd='1';data=00000000;elseifqclk'eventandqclk='1'thencasestaiswhens0=cs='0';wr='0';rd='1';sta=s1;whens1=cs='1';wr='1';rd='1';lclk=qint;iflclk='0'orqint='0'thensta=s2;课程设计报告7elsesta=s1;endif;whens2=cs='0';wr='1';rd='0';sta=s3;whens3=cs='1';wr='1';rd='1';sta=s0;data=dati;endcase;endif;endif;endprocess;address_1=(00&data(3downto0))+(00&data(3downto0))+100000;address_h=(00&data(7downto4))+(00&data(7downto4));u0:lpm_rom0portmap(address=address_1,clock=qclk,q=data_l(15downto8));u1:lpm_rom0portmap(address=address_1+1,clock=qclk,q=data_l(7downto0));u2:lpm_rom0portma
本文标题:数字电压表设计
链接地址:https://www.777doc.com/doc-5137803 .html