1、基于EDA的数字电压表设计实验要求 FPGA连接A/D转换硬件电路,将ADC单元中提供的0V5V信号源作为ADC0809的模拟输入量,通过IN0进行A/D转换,转换结果在数码上进行显示。通过调节电位器使数码管显示实时采集电压值。 实验设计思路数字电压表设计核心:FPGA设计,FPGA负责ADC0809的启动以及转换数据的读取,再将读取的8位二进制数据进行变换,形成便于输出的3位LED段码送给LED数码管,显示被测电压值。FPGA的设计主要包括几个部分: ADC0809转换控制模块实现ADC0809的启动以及转换数据的读取;数据处理模块实现ADC0809 4位数字量对应BCD码的变换和处理;显示
2、控制模块实现LED段码译码输出。ADC0809与FPGA接口电路 nADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。nADC0809的精度是8位,转换时间约为100s,含锁存控制的8路开关,输出有三态缓冲控制,单5V电源供电。 FPGA与ADC0809接口电路原理图 ADC0809与FPGA接口电路设计nIO_B13、B4、B12、B7、B14、B15、B16、B17接收ADC0809 8位数数据;nIO_B10接收ADC0809 转换结束信号EOC;nIO_B21、B20、B19为ADC0809提供8路模拟信号开关的3位地址选通信号(AD
3、D-AC);nIO_B18为ADC0809提供地址锁存控制信号ALE:高电平时把三个地址信号送入地址锁存器,并经译码器得到地址输出,以选择相应的模拟输入通道;接下页nIO_B6为ADC0809提供输出允许控制信号ENABLE:电平由低变高时,打开输出锁存器,将转换结果的数字量送到数据总线上;nIO_B11为ADC0809提供启动控制信号START:一个正脉冲过后A/D开始转换;nIO_B5为ADC0809提供时钟信号信号CLOCK;nIN0IN7:8路模拟信号输入端口;nVref+和Vref-:参考电压输入端口;ADC0809 VHDL采样控制程序设计ADC0809的工作时序图 nSTART是
4、转换启动信号,一个正脉冲过后A/D开始转换;ALE是3位通道选择地址(ADDC、ADDB、ADDA)信号锁存信号。n当模拟量送至某一输入端(如IN-0或IN-1)等,由3位地址信号选择,而地址信号由ALE锁存。nEOC是转换情况状态信号,当启动转换约100s后,EOC产生一个负脉冲,以示转换结束。n在EOC的上升沿后,且输出使能信号ENABLE为高电平,则控制打开三态缓冲器,把转换好的8位数据送至数据总线。n至此ADC0809的一次转换结束 ADC0809采样控制状态图 FPGA器件可以根据其采样时序用状态机来描述采样控制过程,其状态转换关系 如左图所示。 ADC0809 VHDL采样控制程序
5、 ADC0809采样控制程序电路符号 程序的端口信号与中间信号nentity ADC0809 isn port ( d : in std_logic_vector(7 downto 0); -ADC0809输出的采样数据n clk,eoc : in std_logic; -clk为系统时钟,eoc为ADC0809转换结束信号nclk1,start, ale,en: out std_logic; -ADC0809控制信号n abc_in :in std_logic_vector(2 downto 0); -模拟选通信号nabc_out :out std_logic_vector(2 downto
6、 0); -ADC0809模拟信号选通信号n q : out std_logic_vector(7 downto 0); -送至8个并排数码管信号nend ADC0809; narchitecture behav of ADC0809 is ntype states is ( st0,st1, st2, st3, st4,st5,st6); -定义各状态的子类型nsignal current_state, next_state:states:=st0;nsignal regl :std_logic_vector(7 downto 0); -中间数据寄存信号nsignal qq:std_logi
7、c_vector(7 downto 0);nbegin状态转换模块(com )ncase current_state isn when st0=next_state=st1;ale=0;start=0;ennext_state=st2;ale=1;start=0;ennext_state=st3;ale=0;start=1;en ale=0;start=0;en=0; if eoc=1 then next_state=st3; -检测EOC的下降沿 else next_state ale=0;start=0;en=0; if eoc=0 then next_state=st4; -检测EOC的
8、上升沿 else next_statenext_state=st6;ale=0;start=0;ennext_state=st0;ale=0;start=0;en=1;regl next_state=st0;ale=0;start=0;en=0;n end case;分频模块(clock)nclock:process(clk) -对系统时钟进行分频,得到ADC0809转换工作时钟nbeginn if clkevent and clk=1 then qq=qq+1; -在clk1的上升沿,转换至下一状态nif QQ=01111111 THEN clk1=1; current_state =nex
9、t_state; n elsif qq=01111111 then clk1=0;n end if; nend if;nend process;nq=regl; abc_out=abc_in; nend behav; 显示模块 显示模块nlibrary ieee;nuse ieee.std_logic_1164.all;nuse ieee.std_logic_arith.all;nuse ieee.std_logic_unsigned.all;nentity valconv isnport( nq:in std_logic_vector(7 downto 0); -adna:out std_l
10、ogic_vector(6 downto 0); -小数点后第2位nb:out std_logic_vector(6 downto 0); -小数点后第1位nc:out std_logic_vector(6 downto 0); -个位nnend valconv;显示模块narchitecture bhv of valconv isn signal var1,var2,var3:integer; -分别对应将二进制数据转化为十进制nbeginnprocess(q) -数据读出时转化成十进制并显示nbeginnvar1=50*CONV_INTEGER(q)/2550; -计算个位nvar2=50
11、*CONV_INTEGER(q)/255 rem 10; -计算小数点后第一位nvar3 c c c c c c c c c c c b b b b b b b b b b b a a a a a a a a a a a = 1111111;nend case;nend process;nend bhv;管脚约束(AD模块)管脚约束(数码管)实验结果及程序扩展运行测试 将程序下载到目标芯片中,观察数码管的输出,其输出随着输入电压的变化而变化,当输入电压变为0时,数码管的输出为0,输入为5 V时数码管输出也为5.00 V,运行结果正确。程序扩展 该设计还可以进行相应的扩展,例如增加两个功能按键用于设定电压上下限值,当测量电压超出上下限值时,进行声音报警等,感兴趣的可以试着做数字电压表的各种扩展功能。