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

下载本文档

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

文档简介

1、淮阴师范学院物理与电子电气工程学院课程设计报告学生姓名学 号班 级专 业电气工程及其自动化题 目指导教师 2011年12月一、任务和设计要求 利用FPGA与模数转换器ADC0804设计一个数字电压表,能够测量05V之间的直流电压,用三个数码管显示被测电压,要求精确到小数点后两位数字。了解数字电压表的工作原理,掌握可编程逻辑器件与模数转换器之间的接口电路设计及调试方法。下载并调试电路功能,分析芯片资源的占用情况。2、 设计原理 数字电压表(Digital Voltmeter)简称DVM,是一种用数字显示的电压测量仪表。 由于数字电压表具有读数准确方便、精度高、误差小、灵敏度高和分辨率高、测量速度

2、快等特点而备受青睐。其基本原理是采用数字化测量技术,对直流电压进行模数转换,转换成不连续、离散的数字形式并加以显示。由此可知数字电压表的设计应包括三个主要部分:作为电压表采样端口的模数转换单元、数据处理单元以及电压值显示单元。设计要求利用ADC0804模数转换器,FPGA作为数据处理的核心器件,用LED数码管进行电压值的显示。系统结构框图如图7-1所示 ADC0804FPGA3位LED数码管时钟数据输入个位十位百位cswrrdintr 图7-1系统结构框图 1、数模转换器工作原理 ADC0804是用CMOS集成工艺制成的逐次比较型模数转换芯片,分辨率为8位,转换时间100us,输入电压范围为0

3、5V,,该芯片内部有输出数据锁存器。ADC0804芯片外引脚如图7-2所示 图7-2 ADC0804引脚图其中VIN(+)、VIN(-)为ADC0804的模拟信号输入端,用以接收单极性、双极性或差模输入信号;D0D7为A/D转换器数字信号输入端,CLKIN为外界提供的时钟脉冲输入端,频率限制在100kHz1460kHz;CLKr为内部时钟发生器外接阻端,与CLK IN端配合可以由芯片自身产生时钟脉冲,频率为1/1.1RC。 ADC0804的工作时序如图7-3所示,当片选信号CS与写输入信号WR同时为低电平时,A/D转化器启动,在WR上升沿后100 us完成模数转换,转换结果存入芯片内部的输出数

4、据锁存器,如图7-3(a)所示。转换结束输出信号INTR自动变为低电平,表示本次转换已结束。如CS读输入信号RD同时为低电平,则数据锁存器三态门打开,数字信号送出至输出端D7D0, RD高电平到来后数据锁存器三态门回到高阻状态,如图7-3(b)所示。 (a) (b) 图7-3 ADC0804的时序图2、数据处理及显示单元 FPGA芯片负责ADC0804A/D转换过程的启动以及转换数据的读取。同时,把读取的8位二进制数据转换成便于输出的3位LED段码送给LED数码管显示。因此FPGA部分的程序设计应包括ADC0804转换接口控制模块、译码模块,FPGA电路设计原理如图7-4所示。 本设计采用5V

5、参考电压,测量范围为05V,由于模数转换器件ADC0804的数字输出为8位,则电压的最小分辨率为0.02V,也就是说若转换后的数据为00H,则对应的电压值为0V,转换后的数据为01H,则对应的电压值为0.02V,以此类推,若将转换数据以一定的规则从小到大存放,则可转换数据与实际电压值,以及数据存放地址间的对应关系见表7-1。若将电压数值的每一位用4位BCD码表示(不考虑小数点),则可得如表7-1所示的高四位BCD码和低四位BCD码。 表7-1 ADC0804转换数据与实际电压值对应关系地址高四位字节高四位电压值高四位BCD码地址低四位字节低四位电压值低四位BCD码00H00000.000000

6、H20H00000.000000H02H00010.320032H22H00010.020002H04H00100.640064H24H00100.040004H06H00110.960096H26H00110.060006H08H01001.280128H28H01000.080008H0AH01011.600160H2AH01010.100010H0CH01101.920192H2CH01100.120012H0EH01112.240224H2EH01110.140014H10H10002.560256H30H10000.160016H12H10012.880288H32H10010.18

7、0018H14H10103.200320H34H10100.200020H16H10113.520352H36H10110.220022H18H11003.840384H38H11000.240024H1AH11014.160416H3AH11010.260026H1CH11104.480448H3CH11100.280028H1EH11114.800280H3EH11110.300030H (1)查表法的设计思路如下:由表7-1的对应关系,编写一个查表程序,表内预先存放电压值对应的BCD码,根据采集到的数字电压值,从表中查到高四位BCD码和低四位BCD码,再进行十进制数相加即可得到最终电压值

8、的BCD码。BCD码就是利用4位二进制编码表示十进制数的一种编码。为了实现十进制数运算,必须了解BCD码的运算原理。由于BCD码表示范围为0-9,所以当运算结果大于9时必须进行十进制的调整所谓十进制调整,根据已知数字逻辑原理就是将运算结果加0110(6)进行修正,如图7-5所示,程序设计时,需要注意判断两个数的和是否大于9.例如:从AD0804上取得的数据为“”,高四位1101对应的电压值为4.16V,其对应的BCD编码为“0”,第四位1110对应的电压值为0.28V,其对应的BCD编码为“0”。“0”+“0”=“0”,其和的第四位“1110”,大于9,加6将其调整为BCD码,其值为0100,

9、冰洁向前有一进位,是“0011”变为“0100”,则天正后的数据为“0”,表示十进制数“4.44”,与4.16+0.28的结果相符。如果采用查表法实现数据处理,FPGA设计中需要采用存储器电路,BCD码转换电路等。 (2)计算法的设计思路如下:由表7-1可知,如果将转换后的搞,第四位字节数据看作是一个8位二进制数的话,电压值与转换后的数据之间有一个2倍的关系,假设转换后的数据为“”,“”对应的十进制数为222,222*2=444,与“”对应4.44V电压值相等,而十进制数的显示可以通过对10取模和取余数的方法依次获得个位,十位,百位,分别显示,显示时需要在最高位后加一个小数点显示。如果采用计算

10、法实现数据处理,FPGA设计中需要采用乘法,除法电路才能实现数据处理。三、系统设计1.模数转换接口电路的设计 根据模数转换芯片ADC0804的工作时序,需要完成ADC0809的初始化、A/D变换的启动、状态读取及数据读取、数据锁存等功能。采用状态机的设计思路,分4个状态完成模数转换的操作。2.数据处理模块的设计(1)计算法进行数据处理模块的设计。 计算法对数据处理需要用到无符号数乘法和除法,所以在VHDL要用到std_logic_arith库和std_logic_unsigned库。乘除运算的对象必须是整形数,必要时通过conv_integer和conv_std_logic_vector函数进

11、行数据类型的转换。除法运算可采用调用宏函数的方法生成。(2)查表法进行数据处理模块的设计。 大于9的四位二进制码加6调整为对应的BCD码。程序设计时可从低四位到高四位依次进行调整。3.显示模块的设计 本模块的任务是把数据处理模块得到的BCD码转换成能被数码管识别的段码。3位电压表需要3个LED数码管显示,为了节省资源,采用动态扫描显示方式,扫描时钟由系统时钟CLK提供,其频率大于100Hz,否则有闪烁现象。在时钟信号作用下,当扫描信号为001、010、100时,分别将个位、十位、百位数据送给bexd,再根据bexd的具体数值将对应段码送LED数码管,实现数据显示。4、 参考程序(1) 查表法设

12、计的VHDL程序:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith.all;USE ieee.std_logic_unsigned.all;ENTITY volmeter isPORT( clk :in Std_logic; int :in Std_logic; dati :in Std_logic_vector(7 downto 0); wr,rd,cs :out Std_logic; reset :in Std_logic; scan :out Std_logic_vector(2 downto 0); da

13、to :out Std_logic_vector(7 downto 0);end;ARCHITECTURE arch OF volmeter ISSIGNAL qclk,qint :std_logic;SIGNAL clkcount :std_logic_vector(3 downto 0);SIGNAL hexd :std_logic_vector(4 downto 0);SIGNAL data :std_logic_vector(7 downto 0);SIGNAL lclk :STD_LOGIC;SIGNAL voltage,data_sum,data_l,data_h :std_log

14、ic_vector(15 downto 0);SIGNAL address_1,address_h :std_logic_vector(5 downto 0);type state is (s0,s1,s2,s3);SIGNAL sta,led_sta : state;component lpm_rom0 PORT ( address :IN STD_LOGIC_VECTOR (5 DOWNTO 0); clock :IN STD_LOGIC ; q :OUT STD_LOGIC_VECTOR (7 DOWNTO 0) ); end component;BEGINqint=int;proces

15、s(clk,clkcount)begin if clkevent and clk=1 then clkcount=clkcount+1; end if; qclk=clkcount(3);end process;process(qclk,qint,reset,lclk)begin if reset=1 then sta=s0;cs=1;wr=1;rd=1;datacs=0;wr=0;rd=1;stacs=1;wr=1;rd=1; lclk=qint; if lclk=0 or qint=0 then sta=s2; else stacs=0;wr=1;rd=0;stacs=1;wr=1;rd=

16、1;sta=s0;data=dati; end case; end if; end if;end process;address_1=(00 & data(3 downto 0)+(00 & data(3 downto 0)+;address_haddress_1,clock=qclk,q=data_l(15 downto 8);u1: lpm_rom0 port map(address=address_1+1,clock=qclk,q=data_l(7 downto 0);u2: lpm_rom0 port map(address=address_h,clock=qclk,q=data_h(

17、15 downto 8);u3: lpm_rom0 port map(address=address_h+1,clock=qclk,q=data_h(7 downto 0);data_sum1001 then voltage(3 downto 0)=1001 then voltage(7 downto 4)=1001 then voltage(11 downto 8)=data_sum(11 downto 8)+0110+1; else voltage(11 downto 8)=data_sum(11 downto 8)+1; end if; else voltage(7 downto 4)=

18、data_sum(7 downto 4)+1; end if; else voltage(3 downto 0)1001 then voltage(7 downto 4)=1001 then voltage(11 downto 8)=data_sum(11 downto 8)+0110+1; else voltage(11 downto 8)=data_sum(11 downto 8)+1; end if; else voltage(7 downto 4)=1001 then voltage(11 downto 8)=data_sum(11 downto 8)+0110; else volta

19、ge(11 downto 8)=data_sum(11 downto 8); end if; end if; end if; end if;end process;process(clk,led_sta,reset)begin if reset=1 then led_sta=s0;hexd=00000;scanscan=001;hexd=0 & voltage(3 downto 0);led_stascan=010;hexd=0 & voltage(7 downto 4);led_stascan=100;hexd=1 & voltage(11 downto 8);led_stascan=000

20、;hexd=00000;led_sta=s0; end case; end if; end if;end process;dato(7 downto 0)= when hexd=00000 else when hexd=00001 else when hexd=00010 else when hexd=00011 else when hexd=00100 else when hexd=00101 else when hexd=00110 else when hexd=00111 else when hexd=01000 else when hexd=01001 else when hexd=1

21、0000 else when hexd=10001 else when hexd=10010 else when hexd=10011 else when hexd=10100 else when hexd=10101 else when hexd=10110 else when hexd=10111 else when hexd=11000 else when hexd=11001 else ZZZZZZZZ;end arch;(2) .计算法设计的VHDL程序:LIBRARY ieee;USE ieee.std_logic_1164.all;USE ieee.std_logic_arith

22、.all;USE ieee.std_logic_unsigned.all;ENTITY volmeter_1 ISPORT( clk :in Std_logic; int :in Std_logic; dati :in Std_logic_vector(7 downto 0); wr,rd,cs :out Std_logic; reset :in Std_logic; scan :out Std_logic_vector(2 downto 0); dato :out Std_logic_vector(7 downto 0);END;ARCHITECTURE arch OF volmeter_1

23、 ISSIGNAL qclk,qint,lclk :std_logic;SIGNAL count :std_logic;SIGNAL clkcount :std_logic_vector(3 downto 0);SIGNAL hexd :std_logic_vector(7 downto 0);SIGNAL data :std_logic_vector(7 downto 0);SIGNAL data_0,data_1,data_2,remian_value :std_logic_vector(8 downto 0);SIGNAL value1 :integer range 0 downto 5

24、10;SIGNAL value :std_logic_vector(8 downto 0);type state is (s0,s1,s2,s3);SIGNAL sta,led_sta : state;component divide1PORT ( denmo : in std_logic_vector (8 downto 0); numer : in std_logic_vector (8 downto 0); quotient : out std_logic_vector(8 downto 0); remain : out std_logic_vector(8 downto 0); end

25、 component;beginqint=int;process(clk)begin if clkevent and clk=1 then clkcount=clkcount+1; end if; qclk=clkcount(3);end process;process(qclk,qint,reset,lclk)begin if reset=1 then sta=s0;cs=1;wr=1;rd=1;datacs=0;wr=0;rd =1;stacs=1;wr=1;rd=1; lclk=qint; if lclk=0 or qint=0 then sta=s2; else stacs=0;wr=

26、1;rd=0;stacs=1;wr=1;rd=1;sta=s0;data=dati; end case; end if; end if;end process;value1=conv_integer(data)*2;value,numer=value,quotient=remian_value,remain=data_0);u2:divide1 port map(denmo=,numer=remian_value,quotient=data_2,remain=data_1);process(count,clk) begin if clkevent and clk=1 then count=no

27、t count; end if;end process;process(clk,led_sta)begin if reset=1 then led_sta=s0;hexd=;scanscan=001;hexd=data_0(7 downto 0);led_stascan=010;hexd=data_1(7 downto 0);led_stascan=100;hexd= or data_2(7 downto 8);led_stascan=000;hexd=;led_sta=s0; end case; end if; end if;end process;dato(7 downto 0)= whe

28、n hexd= else when hexd=00001 else when hexd=00010 else when hexd=00011 else when hexd=00100 else when hexd=00101 else when hexd=00110 else when hexd=00111 else when hexd=01000 else when hexd=01001 else when hexd=10000 else when hexd=10001 else when hexd=10010 else when hexd=10011 else when hexd=1010

29、0 else when hexd=10101 else when hexd=10110 else when hexd=10111 else when hexd=11000 else when hexd=11001 else ZZZZZZZZ;end arch;五、系统调试与性能分析1、仿真波形 由于电路的设计涉及外部接口电路,对ADC0804的控制及数据的读取,此部分的调试必须将程序下载后才能运行,因此仿真时可以将程序稍作改动,直接给出模数转换后的数据,看显示数据是否正确以及ADC0804控制信号的时序是否真确即可。 (1)ADC0804控制信号时序仿真。从仿真波形图可以看出,ADC0804的

30、控制信号的波形满足其工作时序要求: CS = WR=0,RD =1,启动ADC0804进行模数转换操作;CS = WR=RD =1,ADC0804进行转换动作,int下降沿表示转换完成,进入下一状态;CS = WR=0,WR=1,请求读取转换后的数据;读取数据线DB0DB7上的数据,置CS = WR=RD =1。 图7-9ADC0804控制信号时序仿真波形 (2)显示数据仿真波形。由下图可知,当FPGA从AD0804读取上的数据为3AH时,输出的段码为、,分别对应字符6(个数位)、1(十位数)、1(百位数,其中最高位为小数点),即1.16V,由表7-1可知,当ADC0804的转换数据为3AH时

31、,对应的电压值应为0.96+0.2=1.16V,显示结果正确。图7-10显示数据仿真波形2、下载及调试仿真成功后可以进行程序的下载及调试,本设计已掌握科技发展有限公司的KH-310实验教学仪器为平台,进行电路的设计及调试。 在程序下载前必须进行引脚锁定,由前述分析可知,FPGA需要的输入信号有时钟信号clk,复位信号reset以及模数转换器ADC0804传送过来的数字量和转换完成中断信号int,输出信号有ADC0804的读写控制信号rd,wr,片选信号CS,数码管的选通及段数据输出信号。 其中时钟信可以由连接在FPGA芯片上的晶振提供,选择10kHz频率,其余的输入信号由连接在FPGA芯片I/O引脚上的按键提供。模数转换ADC0804与FPGA的连线如表7

温馨提示

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

评论

0/150

提交评论