您好,欢迎访问三七文档
当前位置:首页 > 建筑/环境 > 给排水/暖通与智能化 > 电子通信专业几篇本科毕业论文解析
基于PLD的高速数据采集系统.摘要本文介绍了一种基于PLD的高速数据采集系统,主要阐述了系统的软件设计。本系统使用FPGA作为数据采集芯片,主要对红外遥控码进行采集测量。系统以EDA技术为设计核心,采用DMA方式存取数据,实现系统高速的要求。1.前言在多媒体教学的今天,多媒体课室的遥控教学设备在不断增加,如果能在多媒体课室的控制台上统一遥控这些设备,这将给教学带来极大的方便。遥控是通过红外管发送红外遥控码对其设备进行控制的。不同设备的遥控发送的红外遥控码都是不同的。同样地,若控制台要控制这些遥控设备,就必须发送与其遥控发送的完全一样的红外遥控码。控制台要实现对所有遥控设备的集中控制,首先就应当获取这些设备的红外遥控码。本文所介绍的就是一种能准确采集红外遥控码的系统。红外遥控码主要有脉冲和载波两种形式,但无论是哪一种形式,都是只有‘0’和‘1’的二进制数字信号,只要采集到信号高低电平的脉宽,就能还原出原信号。下面是一个典型红外遥控码的波形:一般红外遥控码的一些参数:①载波频率:34K~40KHz,主要集中于38KHz。②载波脉冲占空比(高电平脉宽与一个周期宽度之比)通常为1:4或1:3。取1:4的40K载波计算,一个载波周期为25us,一个高电平脉宽6.25us。③整个红外遥控码时间长度一般小于150ms,编码长度(也就是解调后的红外遥控码位数)通常小于34位。2.方案论证与比较采集红外遥控码的脉宽可以由脉宽计数器实现,其基本原理是:在一个红外遥控码宽里对标准时钟的周期脉冲进行累加计数,其计数值乘以标准时钟周期就是这个红外遥控码的脉宽。例如,取10MHz频率的标准时钟,其周期为0.1us。下图中一个红外遥控码(高电平)的脉宽内包含20个标准时钟周期。因此,此脉宽的计数值为20,而脉宽实际时间值=20×0.1us=2us。当一个红外码脉宽里包含非整数个时钟周期时,该计数值就会产生误差,其误差的大小与计数器标准时钟的选取有关。标准时钟频率越高,产生的误差就越小。一般仪器对红外遥控码的误差要求低于1%。若取20MHz作为标准时钟,精度为0.05us,现今所知一个最窄的红外载波为6.25us,其计数值为125,而计数器误差为±1,所以最大的误差为1/125=0.79%。取20MHz作为标准时钟符合要求。由上面红外遥控信号的参数可知,3个八位的计数器足以表示信号中任一个脉宽值。以下是设计红外遥控码采集系统的方案讨论:2.1基于单片机的采集系统系统框图如图2-1。基于单片机是指对红外遥控码的采集和测量由单片机完成。由于单片机工作速度比较慢,只能对经过解调后的红外遥控码进行采集测量,其测量精度也不高。另外,单片机不能得知载波信息,必须通过其它途径获知载波信息,误差较高。因此采集到的红外遥控码可能对某些误差要求较低的设备进行遥控。这说明了此方案具有一定的局限性。2.2基于PLD的采集系统由于PLD具有很高的工作速度,因此考虑使用PLD采集和测量红外遥控码。系统由PLD的内部编程计数器对红外遥控码的载波脉宽进行计数,并将每一个计数值交给单片机,由单片机将计数值存进RAM,最后由单片机完成与PC机的数据通信。PC机对数据处理后,得到红外遥控码和载波的信息,从而还原出已调制的整个红外遥控码。其系统框图如图2-2。但此方案的系统可能会在PLD与单片机的接口出现“瓶颈”效应。现今所知最小的一个红外遥控码的载波脉宽为6.25us,如果要采集一个如此小的脉宽,单片机就要在6.25us的时间内传送此脉宽的计数值。计数值由3个字节表示,而单片机传送3个字节的数据最少需要的6条指令周期,相当于12个机器周期。如果选用89C51单片机外接最高可支持的24MHz的晶振经过12分频,则一个机器周期为0.5us,所以整个指令周期最少需要6us。这样实际操作起来就可能出现单片机还没传送完上一个脉宽的计数值,就必须中断传送下一个脉宽的计数值,从而可能导致数据的流失。这就是单片机速度跟不上而可能出现的“瓶颈”效应。2.3采用DMA方式的采集系统采用DMA方式是指PLD直接将采集到的红外遥控码的脉宽值写进外部RAM,采集完后再从RAM读出数据送给单片机,由单片机完成和PC机通信。系统采集红外遥控码分两次进行,一次采集红外遥控码本身,另一次采集红外遥控码的载波信息。其框图如图2-3。由于PLD和RAM都是高速器件,所以不会在接口上产生“瓶颈”。系统实现起来虽然比上一个方案复杂,但确保了数据的可靠性。由此可知,此方案是相对最好的高速数据采集系统方案,符合方案设计中所突出的“高速”的要求。3.系统规划系统设计的核心是PLD内部编程实现数据采集的功能。3.1PLD内部逻辑功能规划采用DMA方式完成对红外遥控码的采集,PLD内部必须设计三大功能器件:3.1.1脉宽计数器脉宽计数器的作用是测量红外遥控码高低电平的脉宽时间值,并提供控制端选择计数值的其中一个字节作为输出写进RAM。考虑到采集速度的要求,设计两组相同的计数器,每组计数器由3个八位的计数器组成。其中一组固定测量红外遥控信号高电平脉宽(以下本文称之为高电平计数器),另一组固定测量低电平脉宽(以下本文称之低电平计数器)。当高电平计数器测量高电平脉宽时,低电平计数器输出上一个低电平的计数值,然后清零;而当低电平计数器测量低电平时,高电平计数器输出上一个高电平的计数值,然后清零。计数器内还包括两组锁存器和一个选择器。锁存器的功能是将计数结果锁存,保证输出稳定正确的结果。选择器的功能是由读/写控制器控制选择高/低电平计数值三个字节的其中一个作为输出。3.1.2读/写外部RAM控制器读/写外部RAM控制器(以下简称读/写控制器)的作用是控制将红外遥控码的脉宽值写进外部RAM或者从外部RAM中读出数据传送给单片机。3.1.3RAM地址计数器RAM地址计数器(以下简称地址计数器)的作用是产生读写RAM的单元地址信号。由于使用64K的RAM,所以设计一个16位的计数器。计数器的计数时钟信号由读/写控制器产生。根据以上设计规划,PLD内部逻辑功能原理图如下:3.2单片机部分单片机主要负责把测量数据从FPGA送到PC机,同时具有初始化FPGA计数器和通、断脉宽计数器计数时钟的控制作用。4.系统设计和实现4.1PLD内部工作原理PLD内部采集红外遥控码的工作过程如下:①由单片机开启标准时钟信号,当接收到红外遥控信号的首个下降沿时,第一个高电平脉宽由高电平计数器测出脉宽值,经锁存器和选择器把该值输出。②由读/写控制器先选择该值的高字节写进RAM的首个单元,然后将RAM的写控制WR端置回高电平,并且向地址计数器发出地址加1信号,使地址计数器的地址线指向下一个内存单元。然后读/写控制器再选择次高字节,并将WR端置低将此值写进RAM下一个单元。当写完高电平三个字节值后就等待写下一个低电平的三个字节。③如此不断将高低电平值写进RAM,直到地址计数器溢出(即RAM单元写满)或脉宽计数器溢出(即红外遥控码已完),读/写控制器接收到溢出信号转至读RAM状态,同时对发地址计数器清零信号。④读/写控制器通知单片机开始接收数据,然后等待单片机发出接收的响应信号。当接收到此信号后读出RAM首个字节数据,并且向地址计数器发出地址加1信号,使地址计数器的地址线指向下一个内存单元,同时将RAM的OE端恢复为高电平。然后再等待单片机再次发出接收的响应信号。⑤当读完最后一个字节时,地址计数器向读/写控制器发出结束信号,后者再通知单片机结束读数,然后读/写控制器转入空闲状态。从而结束对红外遥控码的采集。4.2PLD内部逻辑功能的实现PLD数据采集部分使用ALTERA公司的FLEXEPF10K10LC84-4芯片,主要考虑到其10K10系列芯片速度快,内部逻辑单元多(576个逻辑单元)方便实现大规模的逻辑编程,而且有利于以后软机升级。对PLD芯片编程的软件工具使用ALTERA公司开发的MAX+PLUSⅡ,主要考虑到与芯片的兼容性和友好的操作界面。编程语言使用MAX+PLUSⅡ所支持的VHDL,主要考虑其描述能力强,覆盖面广,可读性好。下面是PLD内部编程的顶层GDF文件4.2.1脉宽计数器(COUNTER)脉宽计数器由高低电平计数器和六选一选择器组成,即顶层的counter器件。高低电平计数器均由三个八位的计数器和锁存器组成。计数时钟使用20MHz,红外遥控码作为计数器的使能端EN的输入信号,从而使得高电平计数器只对高电平脉宽计数,低电平计数器在红外遥控码接入使能端前多接一个非门,实现低电平计数器只对低电平脉宽计数。由于PC机接收数据格式需要将最高位置‘1’,所以锁存器最高位恒定输出‘1’。下面是计数器COUNTER的顶层GDF文件:选择器控制端组成的六种状态是:SLT&B&A=100、101、110、000、001、010。主要器件的VHDL编程见附录。4.2.2读/写外部RAM控制器(WRITE_READ_CONTROL)控制器主要用状态机编写而编译生成器件,该器件有两大状态:写RAM和读RAM状态。状态之间的转换由标准时钟激发。下面是控制器的状态转移图:写RAM状态:分为写高电平和写低电平两大部分,共包括15个分状态。当控制器接收到单片机START=‘1’信号,就对控制器所有信号初始化,并进入READY状态。当红外信号PULSE=‘1’时,进入PREWRT_H状态,等待红外信号变为低电平。当PULSE=‘0’时,进入WRT_H3状态,将首个高电平数据高字节写进RAM首个单元。再进入FIN_H3状态,此状态将WR端置回高电平,并产生地址加一信号。写完低字节后,进入PREWRT_L状态,等待红外信号变为高电平。以后写低电平的每个状态与写高电平相同。整个写RAM状态中所有写状态和PREWRT_L、PREWRT_H状态都对计数器和RAM地址溢出的或信号OVERFLOW作判断,如果为1立即跳到写RAM状态。读RAM状态:共包括5个状态。先进入READ_STA状态,向地址计数器的溢出位送清零信号,并初始化所有读RAM所需信号。然后进入READ_STA_N状态,给单片机发送开始接收数据信号。再进入READ状态,此时对之前向地址计数器发送的清零信号清零,等待单片机响应SCM_CALL=‘1’就读出数据给单片机,否则等待。读出后进入READ_N状态,产生地址加一信号,同时把OE端恢复高电平,如果未发接收响应信号,则一直处于READ_N状态,否则进入READ状态。READ状态判断地址计数器是否有溢出信号,有就说明读完所有数据,并进入无动作的IDLE状态。读/写控制器的VHDL编程见附录。4.2.3RAM地址计数器(ADDR_COUNTER)地址累加信号由读/写RAM控制器给出。地址计数器内设计一个END_ADDR信号,记录数据写入最后一个单元的地址,初始化时预置为FFFF,如果收到读/写控制器的CNT_OVER信号,说明低电平计数器溢出,此时记下现场地址作为END_ADDR,并将计数器清零,重新开始计数。重新计数相当于读状态地址累加,当累加至END_ADDR地址时,计数器清零。由于读完数据读/写控制器停止发送地址累加信号,地址计数器也就没有时钟信号,因此停止工作。地址计数器的VHDL编程见附录。5.系统仿真数据上图是脉宽计数器(COUNTER)在MAX+PLUSⅡ软件平台上的软件仿真图,图中pulse是红外遥控码输入;slt是高低电平选择端,pulse=1,slt=0输出低电平的计数结果;pulse=0,slt=1输出高电平计数结果。clear是从单片机输出的初始化信号;clock是20MHz(50ns)的标准计数时钟信号;b、a选择输出其中一个字节,a=0,b=0选择低字节数据;a=0,b=1选择次高字节数据;a=1,b=0选择高字节数据。qq[7..0]是脉宽计数器的输出结果值,以十六进制表示,最高位非计数值,固定为“1”;c是脉宽计数器的溢出信号。6.结束语设计时间为六周,最初设计选用的是方案二,初衷是考虑到方案二容易实现,可以与单片机部分配合消除可能出现的“瓶颈”现象。在最后一周
本文标题:电子通信专业几篇本科毕业论文解析
链接地址:https://www.777doc.com/doc-3313306 .html