实验四 ADC0809的采样控制电路实现
一、 实验目的
1、 学习和理解状态机的设计和工作原理。
2、学习用状态机对A/D转换器ADC0809的采样控制电路的实现。
二、实验原理
ADC0809是CMOS的8位A/D转换器(如图一所示),片内有8路模拟开关,可控制8个模拟量中的一个进入转换器中。ADC0809的分辨率为8位,转换时间约100us,含锁存控制的8路多路开关,输出有三态缓冲器控制,单5V电源供电。
图一 波形仿真图
主要控制信号说明:如图4-1所示,START是转换启动信号,高电平有效;ALE是3位通道选择地址(ADDC、ADDB、ADDA)信号的锁存信号。当模拟量送至某一输入端(如IN1或IN2等),由3位地址信号选择,而地址信号由ALE锁存;EOC是转换情况状态信号(类似于AD574的STATUS),当启动转换约100us后,EOC产生一个负脉冲,以示转换结束;在EOC的上升沿后,若使输出使能信号OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。至此ADC0809的一次转换结束了。
三、实验步骤
1、用VHDL实现一个硬件电子琴,利用quartus II进行文本编辑输入和仿真测试;给出仿真波形。并下载测试 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),具体查EDA/SOPC技术实验讲义附录第三节(P55)。
3、设目标器件是EP1K30TC144-3,本实验电路结构图NO.5(即结构图NO.5A,图二,由该图可见,ADC0809的转换时钟CLK已经事先接有750KHz的频率),将实验系统左下角多位选择多路开关的4,,6,7向下拨,其余向上,即使0809工作使能。
4、下载目标文件后,可用螺丝刀旋转实验系统左下角的电位器,以便为ADC0809提供变化的待测模拟信号,这时数码管8和7将显示ADC0809采样输出并被锁存的数字值(16进制),数据来自FPGA的输出。数码管2和1也将显示同样数据,此数据直接来自0809的数据口。 5、用螺丝刀旋转实验系统左下角的电位器得到不同的电位并观察记录其对应的输出值(记录16组左右)并把记录结果绘制为曲线。
29C040(PIN31->WE,PIN1->A18,PIN30->A17,PIN3->A15,PIN29->A14)27040(PIN31->A18,PIN30->A17,PIN3->A15,PIN29->A14)27020(PIN30->A17,PIN3->A15,PIN29->A14)27010(PIN30->VCC,PIN3->A15,P29->A14)PIO48PIO10PIO47PIO14PIO39PIO38PIO37PIO36PIO35PIO34PIO33PIO32PIO24PIO25PIO26GND
VCC
10KVR1
67A18/A19VCCA16A18/A15/WEA14(A15)A17/VCCA12WR/A14
6264A7A1362256A6A8628128A5A92764A4A1127256A3OE27512A2A1027010A1CS127020A0D727040D0D627080D1D5
D2D4GNDD3RAM/ROM
2726VCCPIO9PIO46PIO45PIO11PIO12PIO13PIO8PIO15PIO31PIO30PIO29PIO28PIO27
SLA17VCCSLRAM
628128(PIN30->VCC,PIN3->A14,PIN29->WE)6264(PIN30->VCC,PIN29->WR)
62256(PIN30->VCC,PIN3->A14,P29->WE)27512(PIN30->VCC,PIN3->A15,P29->A14)
6
VGA45R76 200
R(PIO40)
G(PIO41)B(PIO42)HS(PIO43)VS(PIO44)
GNDRAM_EN
VCC
4513
J7
PS/2接口
12MHZA
PIO11
PIO12PIO13PIO14PIO15PIO24PIO25PIO26PIO27PIO28PIO29PIO30PIO31
VCC
1112151819P37GND
9
P10P35
P11P34
P12P33
6
P13P32
EU3P14X1
P15X2
3
P16P31
2
P17P30
VCCRSTAT89C2051
接PC机
2-2EU1750KHZACLOC2-3ADC08092-42-52-62-7AIN026lsb2-8IN-027EOCIN-12ADD-AAIN11ADD-B(24)ADD-C(23)2ALE+512ENABLEref(+)ref(-)START
FIT
PIO46PIO45
PIO35
PIO8PIO37
10C2103
241618RS-23211JP2
ADEN
ADEOCCOMP
COMM
2PIO23PIO22PIO21PIO20PIO19PIO18PIO17PIO16
PIO32
PIO33PIO35
PIO34
PIO8
复位键
单片机接口电路
FIT
JP2(1/2,3/4)
8
7
6
5
4
3
2
1
扬声器
滤波1JP2
COMM
65103
译码器译码器译码器译码器译码器PIO19-PIO16PIO23-PIO20PIO27-PIO24PIO31-PIO28PIO35-PIO32PIO39-PIO36PIO43-PIO40PIO47-PIO44
SPEAKER
AOUT
5.1K
2WR1
DAC0832
9
EU2FB
IOUT2
PIO24
PIO25PIO26PIO27PIO28PIO29PIO30PIO31
7654+5
1112
+12
23
TL082/1
23LM311PIO37
VCC
AIN0
D2D1FPGA/CPLD目标芯片PIO15-PIO8PIO7PIO6PIO5PIO4PIO3PIO2PIO1PIO0
10K+12D10D9
键8键7键6键5键4键3键2键1
实验电路结构图
NO.5
1
D0/CS
D1WR2
17
D2XFER
3
D3A GND
D4D GNDD5
8
D6VREF
D7VCC
VCC
4
COMPJP2(COMP)
图二 实验电路结构图NO.5
五、问题讨论与提高
1、在不改变原代码功能的条件下将附录4-1中表达成用状态码直接输出型的状态机。 2、实验报告:根据以上的实验内容写出实验报告,包括程序设计、软件编译、仿真分析、硬件测试和详细实验过程;设计原程序,程序分析报告、仿真波形图及其分析报告。
附录:
4-1
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;