EDA课程设计 数字电压表 代码及 报告.docx

上传人:b****8 文档编号:12794832 上传时间:2023-06-08 格式:DOCX 页数:18 大小:153.93KB
下载 相关 举报
EDA课程设计 数字电压表 代码及 报告.docx_第1页
第1页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第2页
第2页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第3页
第3页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第4页
第4页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第5页
第5页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第6页
第6页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第7页
第7页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第8页
第8页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第9页
第9页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第10页
第10页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第11页
第11页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第12页
第12页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第13页
第13页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第14页
第14页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第15页
第15页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第16页
第16页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第17页
第17页 / 共18页
EDA课程设计 数字电压表 代码及 报告.docx_第18页
第18页 / 共18页
亲,该文档总共18页,全部预览完了,如果喜欢就下载吧!
下载资源
资源描述

EDA课程设计 数字电压表 代码及 报告.docx

《EDA课程设计 数字电压表 代码及 报告.docx》由会员分享,可在线阅读,更多相关《EDA课程设计 数字电压表 代码及 报告.docx(18页珍藏版)》请在冰点文库上搜索。

EDA课程设计 数字电压表 代码及 报告.docx

EDA课程设计数字电压表代码及报告

第一部分项目名称、内容与要求

项目名称:

数字电压表设计

1.1设计内容

利用FPGA与模数转换器ADC0809设计一个数字电压表,能够测量0~5V之间的直流电压,用四个数码管显示被测电压,要求精确到小数点后三位数字。

了解数字电压表的工作原理,掌握可编程逻辑器件与模数转换器之间的接口电路设计及调试方法。

下载并测试电路功能,分析芯片资源的占用情况。

 

1.2具体要求

1)、能正确测量0-5∨模拟电压,误差<1%,数字电压值分别由四个数码管显示。

(2)、FPGA芯片产生ADC0809控制信号和七段显示器断码和位码等。

(3)、ADC0809芯片实现8位模数转换,输入0-5∨,输出00H-FFH。

(4)、ADC0809输出00H-FFH送FPGA芯片处理为十进制数百十个等位,并产生动态显示位码和断码。

(5)、FPGA芯片产生ADC0809芯片需要写、读和片选信号等,注意时序。

(6)、了解掌握A/D(模数)转换器芯片ADC0809的转换原理、管脚定义以及实际用法。

第二部分:

系统整体架构(ArchitectureDescription)

2.1设计思路

数字电压表(DigitalVoltmeter)简称DVM,是一种用数字显示的电压测量仪表。

由于数字电压表具有读数准确方便、精度高、误差小、灵明度高和分辨率高、测量速度快等特点而备受青睐。

其基本理是采用数字化测量技术,对直流电压进行模数转换,转换成不连续、离散的数字形式并加以显示。

由此可知数字电压表的设计应包括三个主要部分:

作为电压采样端口的模数转换单元、数据处理单元及电压值显示单元。

设计要求利用ADC0809模数转换器,FPGA作为数据处理的核心器件,用LED和数码管进行电压值的显示。

系统结构框图如下图所示。

 

2.2系统原理(包含:

框图等阐述)与设计说明等内容

1、模数转换器工作原理

A/D转换器芯片ADC0809简介8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道抵制锁存用译码电路,其转换时间为100μs左右。

输入电压范围0~5V,该芯片内部有输出数据锁存器。

ADC0809芯片外引脚如下所示。

其中VIN(+)、VIN(-)为ADC0809的模拟信号输入端,用以接受单极性、双极性或差模输入信号;D0~D7为A/D转换器数字信号输出端,CLKIN为外电路提供的时钟脉冲输入端,频率限制在100KHz~1460KHz;CLKR为内部时钟发生器外接电阻端,与CLKIN端配合可有芯片自身产生时钟脉冲,频率为1/1.1RC。

ADC0809的工作时序,当片选信号CS与写输入信号WR同时为低电平时,A/D转换器启动,在WR上升沿后100us完成模数转换,转换结果存入芯片内部的输出数据锁存器,如图7-3(a)所示。

转换结束输出信号INTR自动变为低电平,表示本次转换已结束。

如CS、读输入信号RD同时为低电平,则数据锁存器三态门打开,数字信号送出至输出端D0~D7,RD高电平到来后数据锁存器三态门回到高阻状态。

2.数据处理及显示单元

FPGA芯片负责ADC0809A/D转换过程的启动以及转换数据的读取。

同时,把读取的8位二进制数据转换成便于输出的3位LED段码送给LED数码管显示。

因此FPGA部分的程序设计应包括ADC0809转换接口控制模块、数据转换模块、译码模块,FPGA电路设计原理。

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

ADC0809转换数据与实际电压值对应关系

表7-1

地址

高四位字节

高四位电压值

高四位BCD码

地址

高四位字节

高四位电压值

高四位BCD码

00H

0000

0.00

0000H

20H

0000

0.00

0000H

02H

0001

0.32

0032H

22H

0001

0.02

0002H

04H

0010

0.64

0064H

24H

0010

0.04

0004H

06H

0011

0.96

0096H

26H

0011

0.06

0006H

08H

0100

1.28

0128H

28H

0100

0.08

0008H

0AH

0101

1.60

0160H

2AH

0101

0.10

0010H

0CH

0110

1.92

0192H

2CH

0110

0.12

0012H

0EH

0111

2.24

0224H

2EH

0111

0.14

0014H

10H

1000

2.56

0256H

30H

1000

0.16

0016H

12H

1001

2.88

0288H

32H

1001

0.18

0018H

14H

1010

3.20

0320H

34H

1010

0.20

0020H

16H

1011

3.52

0352H

36H

1011

0.22

0022H

18H

1100

3.84

0384H

38H

1100

0.24

0024H

1AH

1101

4.16

0416H

3AH

1101

0.26

0026H

1CH

1110

4.48

0448H

3CH

1110

0.28

0028H

1EH

1111

4.80

0480H

3EH

1111

0.30

0030H

分析表7-1的数据,可知数据转换模块的设计可以有两种方法:

查表法和计算法,下面对计算法进行介绍。

计算法的设计思路如下:

由表7-1可知,如果将转换后的高、低四位字节数据看做是一个8位二进制数的话,电压值与转换后的数据之间有一个2倍的关系(不考虑小数点),假设转换后的数据为“11011110”,“11011110”对应的十进制数为222,222*2=444,与“11011110”对应的4.44V电压值相等,而十进制数的显示可以通过对10取模和取余的方法依次获得个位、十位、百位,分别显示即可,显示时需要在最高位后加一个小数点显示。

如果采用计算法实现数据处理,FPGA设计中需要采用乘法、除法电路才能实现数据处理。

 

数据处理电路流程图如图3.4所示。

 

2.3创新点与原创性内容

总体来说本次实训的代码还是从图书馆和网上查找的,可并没那么顺利的将实训做得达到要求,本次实训本组在查阅的资料里大胆组合创新(采用AD控制元件,BCD8位转12位,三选一数据选择器,位选信号产生器,三进制计数器,七段译码器,小数点产生器)模块,除了AD控制元件模块外后面的模块本组就利用了一个代码将其终合,这样减少了连线,更为简洁。

最后在实践的面前结果就在面前。

第三部分系统设计(含HDL或原理图输入设计)

3.1HDL代码

BCD8位转12位,三选一数据选择器,位选信号产生器,三进制计数器,七段译码器,小数点产生器)终合模块代码

 

libraryieee;

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityADCCLis

port(clk:

instd_logic;

a:

instd_logic_vector(7downto0);

rd,wr,cs:

outstd_logic;

da:

outstd_logic_vector(7downto0);

w:

outstd_logic_vector(2downto0)

);

endADCCL;

architecturebehaveofADCCLis

signaldaa:

std_logic_vector(7downto0);

signalp:

std_logic;

signalwei:

std_logic_vector(2downto0);

signalq:

integerrange0to9;

signalwqian:

integerrange0to5;

signalwbai:

integerrange0to9;

signalwshi:

integerrange0to9;

signalwge:

integerrange0to9;

begin

process(clk,a)

variableqq:

integerrange0to6000000;

variableqian:

integerrange0to5;

variablebai:

integerrange0to9;

variableshi:

integerrange0to9;

variablege:

integerrange0to9;

variablebaii:

integerrange0to1000000;

variableshll:

integerrange0to100000;

variablegee:

integerrange0to10000;

begin

qq:

=conv_integer(a)*19610;

ifqq>=0andqq<=999999thenqian:

=0;

elsifqq>=1000000andqq<=1999999thenqian:

=1;

elsifqq>=2000000andqq<=2999999thenqian:

=2;

elsifqq>=3000000andqq<=3999999thenqian:

=3;

elsifqq>=4000000andqq<=4999999thenqian:

=4;

elsifqq>=5000000andqq<=5999999thenqian:

=5;

elseqian:

=0;

endif;

baii:

=(qq-qian*1000000);

ifbaii>=0andbaii<=99999thenbai:

=0;

elsifbaii>=100000andbaii<=199999thenbai:

=1;

elsifbaii>=200000andbaii<=299999thenbai:

=2;

elsifbaii>=300000andbaii<=399999thenbai:

=3;

elsifbaii>=400000andbaii<=499999thenbai:

=4;

elsifbaii>=500000andbaii<=599999thenbai:

=5;

elsifbaii>=600000andbaii<=699999thenbai:

=6;

elsifbaii>=700000andbaii<=799999thenbai:

=7;

elsifbaii>=800000andbaii<=899999thenbai:

=8;

elsifbaii>=900000andbaii<=999999thenbai:

=9;

elsebai:

=0;

endif;

shll:

=((qq-qian*1000000)-bai*100000);

ifshll>=0andshll<=9999thenshi:

=0;

elsifshll>=10000andshll<=19999thenshi:

=1;

elsifshll>=20000andshll<=29999thenshi:

=2;

elsifshll>=30000andshll<=39999thenshi:

=3;

elsifshll>=40000andshll<=49999thenshi:

=4;

elsifshll>=50000andshll<=59999thenshi:

=5;

elsifshll>=60000andshll<=69999thenshi:

=6;

elsifshll>=70000andshll<=79999thenshi:

=7;

elsifshll>=80000andshll<=89999thenshi:

=8;

elsifshll>=90000andshll<=99999thenshi:

=9;

elseshi:

=0;

endif;

gee:

=(((qq-qian*1000000)-bai*100000)-(shi*10000));

ifgee>=0andgee<=999thenge:

=0;

elsifgee>=1000andgee<=1999thenge:

=1;

elsifgee>=2000andgee<=2999thenge:

=2;

elsifgee>=3000andgee<=3999thenge:

=3;

elsifgee>=4000andgee<=4999thenge:

=4;

elsifgee>=5000andgee<=5999thenge:

=5;

elsifgee>=6000andgee<=6999thenge:

=6;

elsifgee>=7000andgee<=7999thenge:

=7;

elsifgee>=8000andgee<=8999thenge:

=8;

elsifgee>=9000andgee<=9999thenge:

=9;

elsege:

=0;

endif;

wqian<=qian;wbai<=bai;wshi<=shi;wge<=ge;

endprocess;

process(clk)

variablecnt:

std_logic_vector(2downto0);

begin

ifclk'eventandclk='1'then

ifcnt<3thencnt:

=cnt+1;

elsecnt:

="000";p<=notp;

endif;

wei<=cnt;

casecntis

when"000"=>q<=wqian;

when"001"=>q<=wbai;

when"010"=>q<=wshi;

when"011"=>q<=wge;

whenothers=>null;

endcase;

endif;

wr<=p;rd<='1';cs<='0';

endprocess;

process(q)

begin

caseqis

when0=>daa<="11111100";

when1=>daa<="01100000";

when2=>daa<="11011010";

when3=>daa<="11110010";

when4=>daa<="01100110";

when5=>daa<="10110110";

when6=>daa<="10111110";

when7=>daa<="11100000";

when8=>daa<="11111110";

when9=>daa<="11110110";

whenothers=>null;

endcase;

endprocess;

process(wei,daa)

begin

ifwei="000"then

w<=wei;da<=daaor"00000001";

else

w<=wei;da<=daa;

endif;

endprocess;

endbehave;

 

AD控制元件代码

 

IBRARYieee;--A/D0809

useieee.std_logic_1164.all;

useieee.std_logic_arith.all;

useieee.std_logic_unsigned.all;

entityadis

port(ST,eoc:

instd_logic;--控制端口

d:

instd_logic_vector(7downto0);

oe,sta,ale,adda:

outstd_logic;

q:

outstd_logic_vector(7downto0));

endad;

architectureaofadis

typestatesis(st0,st1,st2,st3,st4,st5,st6);--7个状态

signalc_state,n_state:

states:

=st0;

signalregl:

std_logic_vector(7downto0);

signallock:

std_logic;

begin

adda<='1';

com:

process(c_state,eoc)

begin

casec_stateis

whenst0=>ale<='0';sta<='0';oe<='0';lock<='0';

n_state<=st1;

whenst1=>ale<='1';sta<='0';oe<='0';lock<='0';

n_state<=st2;

whenst2=>ale<='0';sta<='1';oe<='0';lock<='0';

n_state<=st3;

whenst3=>ale<='0';sta<='0';oe<='0';lock<='0';

if(eoc='1')thenn_state<=st4;

elsen_state<=st3;――eoc为‘1’转换结束进入下一状态

endif;――否则继续转换

whenst4=>ale<='0';sta<='0';oe<='1';lock<='0';

n_state<=st5;

whenst5=>ale<='0';sta<='0';oe<='0';lock<='1';

n_state<=st6;

whenst6=>ale<='0';sta<='0';oe<='0';lock<='1';

n_state<=st0;

whenothers=>n_state<=st0;

endcase;

endprocesscom;

reg:

process(st)

begin

if(st'eventandst='1')then

c_state<=n_state;

endif;

endprocessreg;

lo:

process(lock)--锁存

begin

if(lock'eventandlock='1')then

regl<=d;

endif;

endprocesslo;

q<=regl;

enda;

 

3.2系统整体电路图(或RTL级电路图)

第四部分:

系统仿真(SimulationWaveform)

系统仿真图如图:

仿真前输入设置图:

功能仿真图:

时序仿真图:

第五部分:

FPGA实现(FPGAImplementation)

1、硬件验证

在前两次代码无误但下载到芯片硬件验证,始终不能满足要求时,经过查阅资料和老师指导。

和本组成员的不放弃的努力下。

改正过RTL原理图后,怀着试一试的态度和必胜的心态又一次下载到硬件验证。

2、操作过程

下载成功后,我们可以通过AD装换芯片ADC0809(详见附录)的功能,通过:

A/B/C三段的不同84321BCD码状态来得到此芯片八个频道具体是哪一频道。

(注:

000选CH0;001选CH1…)然后将相应的频道接到直流电压(0——5V)。

当然输出显示为数码管显示和3个LED灯(3个LED灯主要是显示的是CS,RD,WD)。

3、结果等说明

在实验箱上的左上角的直流电压旋钮旋到最小处时数码管显示为:

0:

.000,当旋到最大处时数码管显示为:

5:

.000,中间的值位0V——5V之间。

 

第六部分:

总结(Closing)

这次数字电压表系统的设计达到了预期的效果,这次设计的内容主要体现在程序算法上。

 

电压值。

此程序下载后占用芯片内存小易实现。

,DVM的高速发展,使它已成为实现

量的采集资料的过程。

在这个过程里我们走过需对弯路和冤枉路。

这些都是我们宝贵的

字系统设

参考书目(Reference):

EDA技术与实验———陈立万陈强赵威威李洪兵姜玉泉

电子设计自动化(EDA)课程设计与项目实例——李莉路而红

 

附录(Appendix):

A/D转换器芯片ADC0809简介8路模拟信号的分时采集,片内有8路模拟选通开关,以及相应的通道抵制锁存用译码电路,其转换时间为100μs左右。

1.ADC0809的内部结构

ADC0809的内部逻辑结构图如图9-7所示。

图9.7《ADC0809内部逻辑结构》

图中多路开关可选通8个模拟通道,允许8路模拟量分时输入,共用一个A/D转换器进行转换,这是一种经济的多路数据采集方法。

地址锁存与译码电路完成对A、B、C3个地址位进行锁存和译码,其译码输出用于通道选择,其转换结果通过三态输出锁存器存放、输出,因此可以直接与系统数据总线相连,表9-1为通道选择表。

 

2.信号引脚

ADC0809芯片为28引脚为双列直插式封装,其引脚排列见图9.8。

对ADC0809主要信号引脚的功能说明如下:

IN7~IN0——模拟量输入通道

ALE——地址锁存允许信号。

对应ALE上跳沿,A、B、C地址状态送入地址锁存器中。

START——转换启动信号。

START上升沿时,复位ADC0809;START下降沿时启动芯片,开始进行A/D转换;在A/D转换期间,START应保持低电平。

本信号有时简写为ST.

A、B、C——地址线。

通道端口选择线,A为低地址,C为高地址,引脚图中为ADDA,ADDB和ADDC。

其地址状态与通道对应关系见表9-1。

CLK——时钟信号。

ADC0809的内部没有时钟电路,所需时钟信号由外界提供,因此有时钟信号引脚。

通常使用频率为500KHz的时钟信号

EOC——转换结束信号。

EOC=0,正在进行转换;EOC=1,转换结束。

使用中该状态信号即可作为查询的状态标志,又可作为中断请求信号使用。

D7~D0——数据输出线。

为三态缓冲输出形式,可以和单片机的数据线直接相连。

D0为最低位,D7为最高

OE——输出允许信号。

用于控制三态输出锁存器向单片机输出转换得到的数据。

OE=0,输出数据线呈高阻;OE=1,输出转

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

当前位置:首页 > IT计算机 > 电脑基础知识

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2