数字电路课程设计报告_第1页
数字电路课程设计报告_第2页
数字电路课程设计报告_第3页
数字电路课程设计报告_第4页
数字电路课程设计报告_第5页
已阅读5页,还剩14页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

数字电路课程设计报告题目:FPGA控制ADC0809的温度采集及控制系统设计学院:机电工程学院专业:自动化姓名:XXXX学号:04123137指导老师:XXXX时间:2014.9.4~2014.10.15FPGA控制ADC0809的温度采集及控制系统设计设计目的温度是日常生活中无时不在的物理量,温度的控制在各个领域有着广泛积极的意义。如温室的温度控制等。另外随着数字电子技术的迅速发展,将模拟电量转换成数字量输出的接口电路A/D转换器是现实世界中模拟信号向数字信号的桥梁。在以往的A/D器件采样控制设计中,多数是以单片机或CPU为控制核心,虽然编程简单,控制灵活,但缺点是控制周期长,速度慢。单片机的速度极大的限制了A/D高速性能的利用,而FPGA的时钟频率可高达100MHz以上。本设计进行时序控制、码制变换,具有开发周期短,灵活性强,通用能力好,易于开发、扩展等优点。设计的基本内容本次设计主要是基于FPGA+VHDL的温度控制系统,可编程器件FPGA和硬件描述语言VHDL的使用使得数字电路的设计周期缩短、难度减少。设计采用模块化思路,包括四个模块FPGA控制ADC0809模块、分频模块、数据传输模块、元件例化模块,再加以整合实现整个系统,达到温度控制的目的。基于FPGA的信号采集系统主要有:A/D转换器,FPGA,RS232通信。A/D转换器对信号进行会采集,A/D内部集成了采样、保持电路,可有效的降低误差,减少外围电路的设计,降低系统的功耗。A/D在接受到指令后进行采集,FPGA采集控制模块首先将采集到的通过A/D转换城的数字信号引入FPGA,而后对数字信号送往算法实现单元进行处理,并存于FPGA内部RAM中。温度测量图FPGA控制ADC0809模块VHDL程序libraryieee;useieee.std_logic_1164.all;entityad_controlisport(d:instd_logic_vector(7downto0);--0809的8位转换数据输出clk,eoc:instd_logic;--clk是转换工作时钟lock1,ale,start,oe,adda:outstd_logic;q:outstd_logic_vector(7downto0));endad_control;architecturertlofad_controlistypestateis(s0,s1,s2,s3,s4,s5,s6);--定义个状态子函数signalcurrent_state,next_state:state;signalregl:std_logic_vector(7downto0);signallock:std_logic;--转换后数据输出锁存时钟信号beginadda<='1';lock1<=lock;process(current_state,eoc)--规定各状态工作方式begincasecurrent_stateiswhens0=>ale<='0';start<='0';oe<='0';lock<='0';next_state<=s1;whens1=>ale<='1';start<='0';oe<='0';lock<='0';next_state<=s2;whens2=>ale<='0';start<='1';oe<='0';lock<='0';next_state<=s3;whens3=>ale<='0';start<='0';oe<='0';lock<='0';if(eoc='1')then--检测eoc的下降沿next_state<=s3;elsenext_state<=s4;endif;whens4=>ale<='0';start<='0';oe<='0';lock<='0';if(eoc='0')then--测试eoc的上升沿next_state<=s4;else--eoc='1'、表明数据转化结束next_state<=s5;endif;whens5=>ale<='0';start<='0';oe<='1';lock<='0';next_state<=s6;whens6=>ale<='0';start<='0';oe<='1';lock<='1';next_state<=s0;whenothers=>ale<='0';start<='0';oe<='0';lock<='0';next_state<=s0;endcase;endprocess;process(clk)--状态转换进程beginif(clk'eventandclk='1')thencurrent_state<=next_state;endif;endprocess;process(lock)--数据锁存进程beginif(lock'eventandlock='1')thenregl<=d;endif;endprocess;q<=regl;endrtl;FlowSummary仿真波形图结果说明:在S0状态中的RESET为复位信号,在此状态下输出ALE<='0';START<='0';OE<='0';LOCK<='0';表示对ADC0809的初始化。在S1状态下输出ALE<='1';START<='0';OE<='0';LOCK<='0';其中ALE上升沿有效,此状态下模拟信号输入选通。在S2状态下,输出ALE<='0';START<='1';OE<='0';LOCK<='0';START信号有效,启动A/D转换。在S3状态下,输出ALE<='0';START<='0';OE<='0';LOCK<='0';在此状态中检测EOC的下降沿,如果EOC的下降沿来了则启动采样,否则,等待启动采样。在S4状态下,输出ALE<='0';START<='0';OE<='0';LOCK<='0';在此状态中检测EOC的上升沿,如果EOC的上升沿来了则停止采样,否则,采样周期中等待。在S5状态下,输出ALE<='0';START<='0';OE<='1';LOCK<='0';OE为高电平,则控制打开三态缓冲器,把转换好的8位数据结果输至数据总线。在S6状态下,输出ALE<='0';START<='0';OE<='1';LOCK<='1';至此一次完整地采样控制结束。2.分频模块VHDL程序libraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--使用库函数entityadcintisPort(clk:instd_logic;--系统时钟clk1:outstd_logic;--分频后的时钟输出 shuout:outstd_logic_vector(7downto0));--8位二进制输出端endadcint;architectureBehavioralofadcintis--结构体beginprocess(clk)--进程variablecnt:integerrange0to49999999;--系统时钟为50MHZbeginifclk'eventandclk='1'then ifcnt=500then--分频系数为800 cnt:=0; clk1<='1';else cnt:=cnt+1; clk1<='0';endif;endif;endprocess;--结束进程shu:process(clk)--variablecnt:integerrange0to49999999;--定义整型变量variablep:std_logic_vector(7downto0):="00000000";variablefull:integerrange0to499;--定义整型变量begin ifclk'eventandclk='1'then iffull=640then full:=0; p:=p+1;else full:=full+1;endif;endif;ifp="11111111"then--当P计数满后,清零重新开始计数p:="00000000";endif;shuout<=p;endprocessshu;endBehavioral;波形仿真图仿真结果说明:clk为系统时钟,所加频率为50MHZ;clk1为adc0809的控制时钟,分频系数500,频率为100khz;shuout为八位二进制输出。数据传输模块数据传输设计图VHDL程序libraryIEEE;--使用库函数useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;--使用程序包entitytransisPORT(clk:instd_logic;reset:instd_logic;--复位enable:instd_logic;--发送使能datain:instd_logic_vector(7downto0);--发送十六进制代码TxD:outstd_logic);--发送端endtrans;architectureBehavioraloftransissignalTReg:Std_Logic_Vector(7downto0);--发送寄存器signalSampleCnt:std_logic_vector(0to1);beginTReg<=datain;--RxProcessRxProc:process(clk,reset,enable)variableBitPos:INTEGERrange0to9;--发送寄存器的位置beginifreset='0'thenBitPos:=0;SampleCnt<="00";elsifRising_Edge(clk)thenifreset='1'then--复位ifSampleCnt="11"thenSampleCnt<="00";elseSampleCnt<=SampleCnt+1;--从0到3每位计数endif;caseBitPosiswhen0=>ifSampleCnt="01"then--起始位TxD<='0';--发送起始位Bitpos:=BitPos+1;endif;when1=>ifSampleCnt="01"thenTxD<=Treg(0);--发送第1位BitPos:=BitPos+1;endif;when2=>ifSampleCnt="01"thenTxD<=Treg(1);--发送第2位BitPos:=BitPos+1;endif;when3=>ifSampleCnt="01"thenTxD<=Treg(2);--发送第3位BitPos:=BitPos+1;endif;when4=>ifSampleCnt="01"thenTxD<=Treg(3);--发送第4位BitPos:=BitPos+1;endif;when5=>ifSampleCnt="01"thenTxD<=Treg(4);--发送第5位BitPos:=BitPos+1;endif;when6=>ifSampleCnt="01"thenTxD<=Treg(5);--发送第6位BitPos:=BitPos+1;endif;when7=>ifSampleCnt="01"thenTxD<=Treg(6);--发送第7位BitPos:=BitPos+1;endif;when8=>ifSampleCnt="01"thenTxD<=Treg(7);--发送第8位BitPos:=BitPos+1;endif;when9=>ifSampleCnt="01"thenTxD<='1';--发送第9位BitPos:=BitPos+1;endif;endcase;elseTxD<='1';BitPos:=0;SampleCnt<="00";endif;endif;endprocess;endBehavioral;FlowSummary波形仿真图仿真结果说明:datain是数据输入,在这里我输入了十六进制数55,使能端enable和reset在置高电平1时使能端有效,数据发送出去,发送端TxD输出了55,因为输入端一直加入的是55,所以输出TxD周期性的,由仿真图可以看出明显的周期性。元件例化模块将单个模块连接为整体(FPGA)VHDL程序:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;entityFPGAis port(CLK,EOC:instd_logic;--CLK为系统时钟;EOC为ADC0809转换结束信号输入FPGACLK1,START,ALE,OE:outstd_logic;--CLK1为ADC0809工作时钟;START为转换启动信号;ALE为地址锁存信号;OE为数据输出控制信号;均从FPGA输出D:instd_logic_vector(7downto0);--ADC0809输出的采样数据输入FPGA ile:outstd_logic;--数据锁存允许信号cont:outstd_logic;--控制信号(WR1、WR2、CS、Xfer)Q:outstd_logic_vector(7downto0);--经数据处理后转化为温度所对应的从FPGA输出的二进制数据 y:outstd_logic_vector(7downto0); se1:outstd_logic_vector(6downto0); se2:outstd_logic_vector(6downto0); ADDA:outstd_logic; ADDB:outstd_logic; ADDC:outstd_logic; LOCK1:outstd_logic;--寄存器锁存测试信号 q1:outintegerrange0to255);--数据处理过程中的整型数据 endFPGA; architecturebof FPGAiscomponentled_decoderis --led_decoder元件例化申明部分 port(a:instd_logic_vector(3downto0); b:instd_logic_vector(3downto0); seg1:outstd_logic_vector(6downto0); seg2:outstd_logic_vector(6downto0));endcomponent;componentADC0809is --ADC0809元件例化申明部分 port(CLK,EOC:instd_logic;CLK1,START,ALE,OE:outstd_logic; D:instd_logic_vector(7downto0); ile:outstd_logic;cont:outstd_logic;Q:outstd_logic_vector(7downto0); a:outstd_logic_vector(3downto0); b:outstd_logic_vector(3downto0); y:outstd_logic_vector(7downto0); ADDA:outstd_logic;ADDB:outstd_logic;ADDC:outstd_logic;LOCK1:outstd_logic;q1:outintegerrange0to255);endcomponent;signals1:std_logic_vector(6downto0); --用于总的seg1与ADC0809的seg1连接signals2:std_logic_vector(6downto0); --用于总的seg2与ADC0809的seg2连接signal u:std_logic_vector(3downto0); --用于ADC0809与led_decoder的a端口相连signal v:std_logic_vector(3downto0); --用于ADC0809与led_decoder的b端口相连beginU0:ADC0809portmap(clk=>clk,EOC=>EOC,clk1=>clk1,START=>START,ALE=>ALE,oe=>oe,d=>d,ile=>ile,cont=>cont, q=>q,a=>u,b=>v,y=>y,ADDA=>adda,addb=>addb,addc=>addc,lock1=>lock1,q1=>q1); --ADC0809元件例化部分 U1:led_decoderportmap(a=>u,b=>v,seg1=>s1,seg2=>s2); ----led_decoder元件例化部分 se1<=s1; se2<=s2; endb;FlowSummary仿真波形图仿真结果说明:CLK是系统所给频率为50MHZ,经128分频后CLK1为390.6KHZ.2)ADDA,ADDB,ADDC分别是1,0,0表示选通通道一。3)控制器发送有效的ALE信号,锁存该地址,以备转换该地址对应的模拟量通道上的模拟量。控制器随即发送START信号启动A/D转换,一旦转换启动,ADC0809会在EOC引脚上输出表示转换进行的低电平信号。待E0C变为高电平,表示转换已完成,此时控制器就可以发送OE信号,控制ADC0809将转换完的数据送到输出引脚上。如图所示,图中数据转换时间为183.99us。符合ADC0809工作时序图。4)cont为低电平,ile为高电平,表示成为直通型连续反馈工作方式,两个寄存器均处于常通状态,两个寄存器的输出跟随数字输入而变化。即DAC0832处于直通型工作状态。5)D为经ADC0809转换送来的二进制数据,图中给出“01111111”,q1为输出中间信号,和D值相同,Q为经数据转换后的输出温度,图中为24°C,表明当一个模拟量V0输入至ADC0809转换后得到的D经一系列的处理转化后得到的与该模拟量所对应的温度T=24°C。6)y是经控制模块从FPGA输出到DAC0832的

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论