实验8 A/D采样控制电路设计
一、实验目的
1、了解一般状态机的设计方法和状态机在VHDL语言中应用。 2、学习利用状态机来实现A/D转换器ADC089的采样控制。
二、实验原理
ADC0809 为单极性、8位转换精度、逐次逼进式A/D 转换器,其采样速度为每次转换约100μs。 它的各引脚功能和工作时序如图8.1 所示。有8 个模拟信号输入通道IN0~IN7, 由ADDA ADDB 和ADDC (ADDC) 为最高位作为此8 路通道选择地址,在转换开始前,由地址锁存允许信号ALE 将此3 位地址锁入锁存器中,以确定转换信号通道;EOC 为转换结束状态信号,由低电平转为高电平时指示转换结束,此时可读入转换好的8 位数据,EOC 在低电平时指示正在进行转换;START 为转换启动信号,上升沿启动;OE 为数据输出允许信号,高电平有效;CLK 为ADC 转换时钟输入端口(500kHz 左右)。为了达到A/D 器件的最高转换速度,A/D 转换控制器必须包含监测EOC 信号的逻辑,一旦EOC 从低电平变为高电平,即可将OE 置为高电平,然后传送或显示已转换好的数据[D0..D7]。
图8.1 0809/0832 引脚图与时序图
图8.2 A/D 采样控制器逻辑图
图8.2 是ADC0809 采样控制器ADC_STATE的逻辑图, 其中D[7..0]为ADC0809 转换结束后的输出数据(可接PIO16~PIO23); QQ[7..0]通过7段译码器在GW48-CK 系统上的数码管8 和数码管7 上显示出来(可接PIO40~PIO47);ST 为自动转换时钟信号(接clock0) ALE 和STA(即START) 分别是通道选择地址锁存信号和转换启动信号(分别接PIO33和PIO34); EOC 接PIO8;OE 和ADDA分别为输出使能信号和通道选择低位地址信号(分别接PIO35 和PIO32);模拟信号由通道1(AIN1_VR1)进入0809 的IN1。变换数据输出使能OE 由EOC 取反后控制。本项设计由于通过监测EOC 信号,可以达到0809 最快的采样速度,所以只要目标器件的速度允许,ST可接受任何高的采样控制频率。
三、实验内容
1、编写出ADC0809采样控制电路的VHDL程序,并对其进行调试、编译和仿真;
2、选择合适的实验电路结构图,对设计的ADC0809采样控制电路完成锁定引脚、编程下载和硬件验证。硬件测试步骤如下:
(1) 实验电路选用NO.5,由图可见,ADC0809的转换时钟CLK已经事先接有750HZ的频率,将实验系统左下角选择插针处的“转换结束”和“A/D使能”用跳线帽短接。
(2) 引脚锁定为: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)。
四、实验仪器及设备
PC机一台、GW48-CK实验系统一套、下载电缆一根、UT51数字万用表及DF4320双踪示波器各1只
五、实验报告
1、写出ADC0809采样控制电路的VHDL程序,并绘出仿真波形;
2、给出ADC0809采样控制电路的时序分析信息、引脚锁定信息和器件资源占用情况;
3、完成实验思考题;
4、归纳本次实验心得体会(从本次实验中获得了那些收益、本次实验中你的成功之处与有待改进的地方,下次怎样改进等)。
六、实验思考题
1、修改本实验程序,使之能实现对ADC0809的8路模拟数据轮流进行A/D转换?
程序【5-1】:ADC0809 采样控制器的VHDL参考程序: LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY ADC_STATE IS
PORT(D:IN STD_LOGIC_VECTOR(7 DOWNTO 0); CLK,EOC:IN STD_LOGIC; OE,ADDA:OUT STD_LOGIC; ALE,START:OUT STD_LOGIC;
Q:OUT STD_LOGIC_VECTOR(7 DOWNTO 0); QQ:OUT INTEGER RANGE 0 TO 7); END ADC_STATE;
ARCHITECTURE BEHAV OF ADC_sTATE IS
TYPE STATES IS(ST0,ST1,ST2,ST3,ST4,ST5,ST6,ST7); SIGNAL CURRENT_STATE,NEXT_STATE:STATES:=ST0; SIGNAL REG8B:STD_LOGIC_VECTOR(7 DOWNTO 0); SIGNAL LOCK:STD_LOGIC; BEGIN
ADDA<='1';
PRO:PROCESS(CURRENT_STATE,EOC) BEGIN
CASE CURRENT_STATE IS
WHEN ST0=>QQ<=0;ALE<='0';START<='0';OE<='0';LOCK<='0'; NEXT_STATE<=ST1;
WHEN ST1=>QQ<=1;ALE<='1';START<='0';OE<='0';LOCK<='0'; NEXT_STATE<=ST2;
WHEN ST2=>QQ<=2;ALE<='1';START<='1';OE<='0';LOCK<='0'; NEXT_STATE<=ST3;
WHEN ST3=>QQ<=3;ALE<='1';START<='1';OE<='0';LOCK<='0'; IF EOC='0' THEN
NEXT_STATE<=ST4; ELSE
NEXT_STATE<=ST3; END IF;
WHEN ST4=>QQ<=4;ALE<='0';START<='0';OE<='0';LOCK<='0';