实验五 A/D采样电路设计
一、实验目的:通过本次实验掌握用VHDL语言设计程序能够通过时序
对ADC0809器件进行控制并进行采集、输出。
二、实验要求:
1、 了解并掌握ADC0809的工作原理。
2、 编写相应的程序实现对ADC0809的控制。
3、 定义引脚并下载,将ADC0809的转换结果输出到数码管。
三、实验步骤:
1、ADC0809的工作时序及原理:
ADC0809是CMOS的8位A/D转换器,片内有8路模拟开关,可控制8个模
拟量中的一个进入转换器中。ADC0809的分辨率为8位,转换时间约100us,
含锁存控制的8路多路开关,输出有三态缓冲器控制,单5V电源供电。
主要控制信号说明:如上图所示,START是转换启动信号,高电平有效;ALE
是3位通道选择地址(ADDC、ADDB、ADDA)信号的锁存信号。当模拟量送至某
一输入端(如IN1或IN2等),由3位地址信号选择,而地址信号由ALE锁存;
EOC是转换情况状态信号(类似于AD574的STATUS),当启动转换约100us后,
EOC产生一个负脉冲,以示转换结束;在EOC的上升沿后,若使输出使能信号
OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。
至此ADC0809的一次转换结束了。
2、利用VHDL语言输入方法设计程序对ADC0809进行控制。
3、利用MAX+plusII进行文本编辑输入和仿真测试;给出仿真波形。最后进
行引脚锁定并进行测试,硬件验证电路对ADC0809的控制功能。
测试步骤:根据附录的模式5,建议引脚锁定为:START接PIO34,OE接
PIO35,EOC接PIO8,ALE接PIO33,状态机时钟CLK接clock0(PIN2,可选
“65536Hz”或更高),ADDA接PIO32(ADDB和ADDC都接GND),ADC0809的8
位输出数据线接PIO23~PIO16,锁存输出Q显示于数码8/数码7(PIO47~
PIO40),设目标器件是EPF10K10,ADC0809的转换时钟CLK已经事先接有750KHz
的频率),将实验系统左下角选择插针处的“转换结束”和“A/D使能”用二短
路帽短接。下载目标文件后,可用螺丝刀旋转实验系统左下角的电位器,以便
为ADC0809提供变化的待测模拟信号,这时数码管8和7将显示ADC0809采样
输出并被锁存的数字值(16进制)
4、 实验报告:根据以上的实验要求、实验内容写出实验报告。
5、 写出实验心得体会。
6、 思考题:如何将显示的16进制转化为真正的电压显示。
参考程序:
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ADCINT IS
PORT ( D : IN STD_LOGIC_VECTOR(7 DOWNTO 0); --0809的8位转换数据输出
CLK ,EOC : IN STD_LOGIC; --CLK是转换工作时钟
LOCK1, ALE, START, OE, ADDA : OUT STD_LOGIC;
Q : OUT STD_LOGIC_VECTOR(7 DOWNTO 0) );
END ADCINT;
ARCHITECTURE behav OF ADCINT IS
TYPE states IS (st0, st1, st2, st3,st4,st5,st6) ; --定义各状态子类型
SIGNAL current_state, next_state: states :=st0 ;
SIGNAL REGL : STD_LOGIC_VECTOR(7 DOWNTO 0);
SIGNAL LOCK : STD_LOGIC; -- 转换后数据输出锁存时钟信号
BEGIN
ADDA <= '1'; LOCK1 <=LOCK;
PRO: PROCESS(current_state,EOC) BEGIN --规定各状态转换方式
CASE current_state IS
WHEN st0 => ALE<='0';START<='0';OE<='0';LOCK<='0' ;next_state <= st1;
WHEN st1 => ALE<='1';START<='0';OE<='0';LOCK<='0' ;next_state <= st2;
WHEN st2 => ALE<='0';START<='1';OE<='0';LOCK<='0' ;next_state <= st3;
WHEN st3 => ALE<='0';START<='0';OE<='0';LOCK<='0';
IF (EOC='1') THEN next_state <= st3; --测试EOC的下降沿
ELSE next_state <= st4;
END IF ;
WHEN st4=> ALE<='0';START<='0';OE<='0';LOCK<='0';
IF (EOC='0') THEN next_state <= st4; --测试EOC的上升沿,=1表明转换结束
ELSE next_state <= st5; --继续等待
END IF ;
WHEN st5=> ALE<='0';START<='0';OE<='1';LOCK<='0';next_state <= st6;
WHEN st6=> ALE<='0';START<='0';OE<='1';LOCK<='1';next_state <= st0;
WHEN OTHERS => ALE<='0';START<='0';OE<='0';LOCK<='0';next_state <= st0;
END CASE ;
END PROCESS PRO ;
PROCESS (CLK)
BEGIN
IF ( CLK'EVENT AND CLK='1') THEN
current_state <= next_state; -- 在时钟上升沿,转换至下一状态
END IF;
END PROCESS; -- 由信号current_state将当前状态值带出此进程,进入进程PRO
PROCESS (LOCK) -- 此进程中,在LOCK的上升沿,将转换好的数据锁入
BEGIN
IF LOCK='1' AND LOCK'EVENT THEN REGL <= D ;
END IF;
END PROCESS ;
Q <= REGL;
END behav