南京师范大学数字电压表设计
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
数字电压表的设计
电子设计自动化(electronic design automation,EDA)是近几年迅速发展起
来的将计算机软件、硬件、微电子技术交叉运用的现代电子设计技术。其中EDA 设计语言中的VHDL语言是一种快速的电路设计工具,功能涵盖了电路描述、电路综合、电路仿真等三大电路设计内容。本电压表的电路设计正是用VHDL语言完成的。
此次设计主要应用的软件是Quartus II 9.1 (64-Bit)。本次所设计的电压
表的要求:
1. 使用FPGA控制ADC0809,设计一个量程为5V的数字电压表;
2. 假设模拟部分已经调节好,ADC0809输出的全0代表0V,全1代表5V;
3. 整个系统分为2个模块:控制模块和显示模块,将系统仿真出来;
4. 在设计报告中结合说明设计的原理,并给出仿真结果。
硬件电路框图
数字电压表,它是采用数字化测量技术,把连续的模拟量(直流或交流输入电压)转换成不连续、离散的数字形式并加以显示的仪表。由于数字式仪器具有读数准确方便、精度高、误差小、灵敏度高和分辨率高、测量速度快等特点而倍受青睐。通常按A/D转换方式的不同将DVM分成两大类,一类是直接转换型;另一类是间接转换型,又称积分型,包括电压一频率变换。而由前面分析可知本课题的核心电路路由FPGA完成,选用了Altera公司的EPF10K10LC84-4芯片,用VHDL语言对它进行设计,本设计是由三大模块组成,(1)AD转换模块,组要负责将模拟信号转换为数字信号,以便送FPGA处理;(2)FPGA模块,激活A/D 转换器动作、接收A/D转换器传递过来的数字转换值,将接收到的转换值调整成对应的数字信号;(3)显示模块,将数据处理模块输出的4位BCD码译成相应7段数码驱功值,使模拟电压值在4个数码管上显示。工作时,系统按一定的速率采集输入的模拟电压,经ADC0809CCN转换为8位数字量,此8位数字量经FPGA 处理得到模拟电压的数字码,再输入数码管获得被测电压的数字显示。此电压表的测量范围:0~5V,四位数码管显示。
ADC0809模块
ADC0809是采样分辨率为8位的、以逐次逼近原理进行模—数转换的器件。其内部有一个8通道多路开关,它可以根据地址码锁存译码后的信号,只选通8路模拟输入信号中的一个进行A/D转换。
工作原理
START是转换启动信号,高电平有效;ALE是3位通道选择地址(ADDC, ADDB, ADDA)信号的锁存信号。当模拟量送至某一输入端(IN I或IN2等),由3位地址信号选择,而地址信号由ALE锁存;EOC是转换情况状态信号(类似于AD574的STATUS),当启动转换约100us后,EOC产生一个负脉冲,以表示转换结束;在EOC 的上升沿后,若使输出使能信号OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。至此ADC0809的一次转换结束了。
ADC0809的工作过程
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。此地址经译码选通8路模拟输入之一到比较器。START上升沿将逐次逼近寄存器复位。下降沿启动 A/D转换,之后EOC输出信号变低,指示转换正在进行。直到
A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
数据处理模块
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码。
程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;
entity show is
port(
clk : in std_logic;
ge,shi,bai : in integer range 0 to 9;
com,seg : out std_logic_vector(7 downto 0)
);
end;
architecture behave of show is
signal cnt : integer range 0 to 2 := 0;
signal n : integer range 0 to 9;
begin
process(clk)
begin
if(clk'event and clk = '1') then
if(cnt = 2) then
cnt <= 0;
else
cnt <= cnt + 1;
end if;
end if;
end process;
process(cnt,n)
begin
case cnt is
when 0 => n <= ge; com <= "11111110";
when 1 => n <= shi; com <= "11111101";
when 2 => n <= bai; com <= "11111011";
end case;
case n is
when 0 => seg <= "00111111";
when 1 => seg <= "00000110";
when 2 => seg <= "01011011";
when 3 => seg <= "01001111";
when 4 => seg <= "01101001";
when 5 => seg <= "01101101";
when 6 => seg <= "01111101";
when 7 => seg <= "00000111";
when 8 => seg <= "01111111";
when 9 => seg <= "01101111";
end case;
end process;
end behave;
时钟模块
程序如下:
library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;