FPGA设计ADC0809.docx
《FPGA设计ADC0809.docx》由会员分享,可在线阅读,更多相关《FPGA设计ADC0809.docx(13页珍藏版)》请在冰豆网上搜索。
FPGA设计ADC0809
FPGA设计-ADC0809
摘要
实现时必须严格遵守ADC0809的工作时序,对选定的通道输入一个模拟量,调节电位器改变输入的模拟量。
利用quartus2进行文本编辑输入和试仿 ;给出仿真波形。
最后进行引脚锁定并进行测试,硬件验证ADC0809 的控制功能。
具体过程为:
编写ADC0809时序的VHDL代码。
对其进行编译仿真主要控制信号为:
Start为转换启动信号,高电平有效;
ale为通道选择地址信号的锁存信号。
当启动转换后,程序开始执行,查询状态,状态为0.1.时等待,状态2时,查询EOC信号的状态,判断是否转换结束,当EOC=1时表示转换结束,否则继续等待;转换结束后继续查询状态,若OE信号为高电平则控制打开三态缓冲器,当LOCK信号为高电平时,将转换后的数据进行锁存,至此一次转换结束。
关键词:
工作时序、AD0809 、VHDL、quartus2、编译仿真、Start 、EOC、OE、三态缓冲器
1设计任务
基于VHDL语言,实现对ADC0809简单控制。
2系统设计原理
2.1硬件设计原理
ADC0809 为单极性输入,8位转换逐次逼近A/D转换器,可对0~5V的INT0~INT7的8路模拟电压信号分时进行转换,完成一次转换的时间为100 微秒。
ADD-CBA作为8路通道选择地址,在转换开始前由地址锁存允许信号ALE将3位地址锁入锁存器中,以确定转换信号通道;EOC为状态结束标志,低电平转为高电平时转换结束;START为转换启动信号,上升沿有效;OE为数据输出允许端,高电平有效;〔D0⋯D7〕为A/D变换数据输出端。
本次实验为测试方便,因此直接选择IN0端口为输入端,即使ADDC,ADDB,ADDA都接地。
2.1.1ADC0809的主要特性
1)8路输入通道,8位A/D转换器,即分辨率为8位。
2)具有转换起停控制端。
3)转换时间为100μs
4)单个+5V电源供电
5)模拟输入电压范围0~+5V,不需零点和满刻度校准。
6)工作温度范围为-40~+85摄氏度
7)低功耗,约15mW。
2.1.2ADC0809的外部特性
ADC0809芯片有28条引脚,采用双列直插式封装,如图1所示。
下
面说明各引脚功能。
IN0~IN7:
8路模拟量输入端。
2-1~2-8:
8位数字量输出端。
ADDA、ADDB、ADDC:
3位地址输入线,用于选通8路模拟输入中的一路
ALE:
地址锁存允许信号,输入,高电平有效。
START:
A/D转换启动脉冲输入端,输入一个正脉冲(至少100ns宽)使其启动(脉冲上升沿使0809复位,下降沿启动A/D转换)。
EOC:
A/D转换结束信号,输出,当A/D转换结束时,此端输出一个高电平(转换期间一直为低电平)。
OE:
数据输出允许信号,输入,高电平有效。
当A/D转换结束时,此端输入一个高电平,才能打开输出三态门,输出数字量。
CLK:
时钟脉冲输入端。
要求时钟频率不高于640KHZ。
REF(+)、REF(-):
基准电压。
Vcc:
电源,单一+5V。
GND:
地。
图1 ADC0809引脚图图2ADC0809
2.1.3工作过程
首先输入3位地址,并使ALE=1,将地址存入地址锁存器中。
此地址经译码选通8路模拟输入之一到比较器。
START上升沿将逐次逼近寄存器复位。
下降沿启动A/D转换,之后EOC输出信号变低,指示转换正在进行。
直到A/D转换完成,EOC变为高电平,指示A/D转换结束,结果数据已存入锁存器,这个信号可用作中断申请。
当OE输入高电平时,输出三态门打开,转换结果的数字量输出到数据总线上。
转换数据的传送A/D转换后得到的数据应及时传送给单片机进行处理。
数据传送的关键问题是如何确认A/D转换的完成,因为只有确认完成后,才能进行传送。
为此可采用下述三种方式。
(1)定时传送方式
对于一种A/D转换器来说,转换时间作为一项技术指标是已知的和固定的。
例如ADC0809转换时间为128μs,相当于6MHz的MCS-51单片机共64个机器周期。
可据此设计一个延时子程序,A/D转换启动后即调用此子程序,延迟时间一到,转换肯定已经完成了,接着就可进行数据传送。
(2)查询方式
A/D转换芯片由表明转换完成的状态信号,例如ADC0809的EOC端。
因此可以用查询方式,测试EOC的状态,即可确认转换是否完成,并接着进行数据传送。
(3)中断方式
把表明转换完成的状态信号(EOC)作为中断请求信号,以中断方式进行数据传送。
不管使用上述哪种方式,只要一旦确定转换完成,即可通过指令进行数据传送。
首先送出口地址并以信号有效时,OE信号即有效,把转换数据送上数据总线,供单片机接受。
本次设计依据ADC809工作时序图来编写相关程序,由其时序图来判断状态机当前的状态。
2.2软件设计思路
采用双进程有限状态机的方法来产生ADC0809的工作时序。
设计st0~st7共8个工作状态,st0:
初始状态;st1:
产生ALE的上升沿,将地址“000”锁入0809的地址寄存器中;st2:
产生采样信号START上升沿,开始A/D转换;st3:
检测EOC下升沿;st4:
检测EOC上升沿,转换结束;st5:
数据转换结束,开启输出允许EN;st6:
输出允许EN延时一个脉冲,输出数据;st7:
关闭允许输出EN如表1所示。
表1状态转换表
当前状态
控制输入
下一状态
控制输出
ST0
时钟上升沿
ST1
ale<='0';start<='0';en<='0'
ST1
时钟上升沿
ST2
ale<='1';start<='0';en<='0'
ST2
时钟上升沿
ST3
ale<='0';start<='1';en<='0'
ST3
时钟上升沿且EOC=1
是
ST4
ale<='0';start<='0';en<='0'
否
ST3
ST4
时钟上升沿且EOC=0
是
ST5
ale<='0';start<='0';en<='0'
否
ST4
ST5
时钟上升沿
ST6
ale<='0';start<='0';en<='1'
ST6
时钟上升沿
ST0
ale<='0';start<='0';en<='1';regl<=d
Other
时钟上升沿
ST0
ale<='0';start<='0';en<='0'
2.3程序流程图
Y
N
Y
N
根据此流程图,结合表1的状态转换表可以写出ADC0809的VHDL描述。
VHDL语言描述的ADC0809程序看附录一。
3功能与时序仿真
原先使用ISE软件进行功能仿真与时序的仿真,但是由于对ISE软件使用不够熟练,我改用QuartusⅡ进行ADC0809的功能仿真与时序仿真。
3.1功能仿真得出的RTL图
使用QuartusⅡ,创建工程后添加一个VHDL文本,把附录的程序写进去后运行,没有出现错误。
运行之后得出的RTL图如图3所示。
图4ADC0809的RTL图
3.2功能仿真得出的状态图
在QuartusⅡ中,功能仿真还能得出其状态图,如图4所示,可以看出这是一个Moore型有限状态机。
图5ADC0809的状态图
3.3时序仿真
功能仿真之后就可以对其进行时序仿真,设置结束时间为350us,并设置CLK的频率为10KHZ。
得到如图5所示的时序仿真图。
图6ADC0809的时序仿真图
由图5可以看出符合ADC0809的工作时序,这就使用VHDL语言实现对ADC0809的简单控制。
4总结
通过本次的课程设计,使我对FPGA这门课程有了更深一步的理解,对知识进行了进一步的的巩固与提高,锻炼了自己的综合技能。
通过小组内同学的讨论与方案的论证,大家积极献言献策,集大家的智慧,终于选出了一个较好的方案。
用仿真软件进行仿真与调试,编写VHDL语言时遇到了极大地困难,这也是这项任务的重中之重。
在编写VHDL语言时由于前期的思路不清,导致编写的语言很混乱,在查阅了网上的资料后才有了比较清楚完备的认识,这一点对我有很大启发。
在这个过程中,我对仿真软件的操作与应用能力得到了进一步的加强。
这次实验让我更加注重了对这门课程的学习,了解到其重要性,这门技术必将成为今后很长一个时期的学习与应用重点,这对我们的成长与发展有极大促进作用。
5参考文献
[1]杨志方.EDA技术及应用.华中科技大学出版社,2008
[2]潘松.EDA技术与VHDL.清华大学出版社,2010
[3]刘岚.FPGA应用技术基础教程.电子工业出版社,2009
[4]曾繁泰.VHDL程序设计.清华大学出版社,2001
[4]杨志刚.FPGA技术应用.机械工业出版社,2001
附录一程序
libraryieee;
useieee.std_logic_1164.all;
useieee.std_logic_unsigned.all;
useieee.std_logic_arith.all;
entityADC0809is
port(d:
instd_logic_vector(7downto0);--ADC0809输出的采样数据
clk,eoc:
instd_logic;--clk为系统时钟,eoc为ADC0809转换结束信号
clk1,start,ale,en:
outstd_logic;--ADC0809控制信号
abc_in:
instd_logic_vector(2downto0);--模拟选通信号
abc_out:
outstd_logic_vector(2downto0);--ADC0809模拟信号选通信号
q:
outstd_logic_vector(7downto0));--送至8个并排数码管信号
endADC0809;
architecturebehavofADC0809is
typestatesis(st0,st1,st2,st3,st4,st5,st6);--定义各状态的子类型
signalcurrent_state,next_state:
states:
=st0;
signalregl:
std_logic_vector(7downto0);--中间数据寄存信号
signalqq:
std_logic_vector(7downto0);
begin
com:
process(current_state,eoc)--规定各种状态的转换方式
begin
casecurrent_stateis
whenst0=>next_state<=st1;ale<='0';start<='0';en<='0';
whenst1=>next_state<=st2;ale<='1';start<='0';en<='0';
whenst2=>next_state<=st3;ale<='0';start<='1';en<='0';
whenst3=>ale<='0';start<='0';en<='0';
ifeoc='1'thennext_state<=st3;--检测EOC的下降沿
elsenext_state<=st4;
endif;
whenst4=>ale<='0';start<='0';en<='0';
ifeoc='0'thennext_state<=st4;--检测EOC的上升沿
elsenext_state<=st5;
endif;
whenst5=>next_state<=st6;ale<='0';start<='0';en<='1';
whenst6=>next_state<=st0;ale<='0';start<='0';en<='1';regl<=d;
whenothers=>next_state<=st0;ale<='0';start<='0';en<='0';
endcase;
endprocess;
clock:
process(clk)--对系统时钟进行分频,得到ADC0809转换工作时钟
begin
ifclk'eventandclk='1'thenqq<=qq+1;--在clk1的上升沿,转换至下一状态
ifQQ="01111111"THENclk1<='1';current_state<=next_state;
elsifqq<="01111111"thenclk1<='0';
endif;
endif;
endprocess;
q<=regl;abc_out<=abc_in;
endbehav;
本科生实习成绩评定表
姓名
性别
专业、班级
实习题目:
实习答辩或质疑记录:
成绩评定依据:
最终评定成绩(以优、良、中、及格、不及格评定)
指导教师签字: