毕设论文 于基fpga的串口设计 .doc

毕设论文 于基fpga的串口设计 .doc

ID:13875787

大小:708.50 KB

页数:37页

时间:2018-07-24

上传者:zhaojunhui
毕设论文 于基fpga的串口设计 .doc_第1页
毕设论文 于基fpga的串口设计 .doc_第2页
毕设论文 于基fpga的串口设计 .doc_第3页
毕设论文 于基fpga的串口设计 .doc_第4页
毕设论文 于基fpga的串口设计 .doc_第5页
资源描述:

《毕设论文 于基fpga的串口设计 .doc》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库

目录目录前言11引言11.1课题来源11.2课题研究的研究背景11.3国内外的发展现状、发展趋势及存在的主要问题21.4课题研究的指导思想与技术路线31.5基于FPGA串口设计的技术要求42UART原理介绍52.1UART结构和工作原理53方案选择63.1设计语言的选择63.2电平转换方式的选择73.3FPGA核心芯片的选择74系统硬件设计94.1器件芯片介绍94.2系统硬件框图144.3主要组成电路分析144.4总电路图设计175系统软件设计175.1主程序流程图175.2中断子程序流程图195.3DDS控制软件设计195.4AD7886软件驱动设计205.5系统源程序216制作位移测量装置的步骤217总结22参考文献23致谢24附录125附录226附录327 前言前言随着FPGA/CPLD器件在控制领域的广泛使用,开发嵌于FPGA/CPLD器件内部的通用异步收发器,以实现FPGA/CPLD开发系统与PC机之间的数据通信是很有实际意义的。FPGA/CPLD器件与单片机、ARM等器件不同,内部没有集成UART,因此要实现串行通信,必须要独立开发UART模块。本设计对于深入理解串口的工作原理和理解FPGA的工作流程具有启示意义,并通过设计的过程FPGA的应用能力和系统综合设计能力将得到加强。1引言1.1课题来源结合科研1.2课题研究的研究背景当今社会是数字化的社会,是数字集成电路广泛应用的社会。数字集成电路本身在不断地进行更新换代。它由早期的电子管、晶体管、小中规模集成电路、发展到超大规模集成电路(VLSIC,几万门以上)以及许多具有特定功能的专用集成电路。但是,随着微电子技术的发展,设计与制造集成电路的任务已不完全由半导体厂商来独立承担。系统设计师们更愿意自己设计专用集成电路(ASIC)芯片,而且希望ASIC的设计周期尽可能短,最好是在实验室里就能设计出合适的ASIC芯片,并且立即投入实际应用之中,因而出现了现场可编程逻辑器件(FPLD),其中应用最广泛的当属现场可编程门阵列(FPGA)和复杂可编程逻辑器件(CPLD)。通用异步收发器(UniversalAsynchronousReceiver/Transmitter),简称为UART)由于具有数据通信时需要的连线少,具有相关工业标准提供的标准的接口电平规范等优点,在工业控制领域被广泛采用.近年来,随着FPGA/CPLD器件在控制领域的广泛使用,开发嵌于FPGA/CPLD器件内部的通用异步收发器,以实现FPGA/CPLD开发系统与PC机之间的数据通信引起了FPGA/CPLD领域研究人员的关注.为此,本设计基于FPGA器件设计了符合RS-232标准的UART,便于实现FPGA/CPLD开发系统与PC机之间的串口数据交换。第35页(共37页) 前言1.3国内外的发展现状、发展趋势及存在的主要问题 通用异步收发器(UniversalAsychronousReceiverTransmitter,UART)是雷达中常用的器件类型,多用于全机监测、指令发送接收、状态传递、键盘显示操作以及控制等等。由于许多大的器件供应商不再生产此类军品级产品,因此,就必须另寻途径解决其在雷达中的应用问题。利用可编程器件实现UART功能模块,既可以满足产品类别的需求又可以在使用中根据实际情况增减配置,是我们在设计中值得考虑的一种方法。在嵌入式系统中,嵌入式CPU往往要通过各种串行数据总线与“外界”进行通信。在应用中,异步的串行数据通信用得较多,而通用异步收发器在其中扮演着重要角色:完成数据的串并转换,即把并行数据按照通信波特率转化为通信协议中规定的串行数据流,也可从串行数据流中取出有用数据转变为并行数据。FPGA是英文FieldProgrammableGateArray的缩写,即现场可编程门阵列,它是在PAL、GAL、EPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个新概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输出输入模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。FPGA的基本特点主要有:1)采用FPGA设计ASIC电路,用户不需要投片生产,就能得到合用的芯片。2)FPGA可做其它全定制或半定制ASIC电路的中试样片。3)FPGA内部有丰富的触发器和I/O引脚。4)FPGA是ASIC电路中设计周期最短、开发费用最低、风险最小的器件之一。5)FPGA采用高速CHMOS工艺,功耗低,可以与CMOS、TTL电平兼容。  第35页(共37页) 前言可以说,FPGA芯片是小批量系统提高系统集成度、可靠性的最佳选择之一。目前FPGA的品种很多,有XILINX的XC系列,TI公司的TPC系列、ALTERA公司的FIEX系等。FPGA是由存放在片内RAM中的程序来设置其工作状态的,因此,工作时需要对片内的RAM进行编程。用户可以根据不同的配置模式,采用不同的编程方式。加电时,FPGA芯片将EPROM中数据读入片内编程RAM中,配置完成后,FPGA进入工作状态。掉电后,FPGA恢复成白片,内部逻辑关系消失,因此,FPGA能够反复使用。FPGA的编程无须专用的FPGA编程器,只须用通用的EPROM、PROM编程器即可。当需要修改FPGA功能时,只需换一片EPROM即可。这样,同一片FPGA,不同的编程数据,可以产生不同的电路功能。因此,FPGA的使用非常灵活。FPGA有多种配置模式:并行主模式为一片FPGA加一片EPROM的方式;主从模式可以支持一片PROM编程多片FPGA;串行模式可以采用串行PROM编程FPGA;外设模式可以将FPGA作为微处理器的外设,由微处理器对其编程。FPGA的设计难点:1)不同时钟域转换2)高速电路设计,信号完整性3)降低功耗1.4课题研究的指导思想与技术路线UART(即UniversalAsynchronousReceiverTransmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。UART允许在串行链路上进行全双工的通信。串行外设用到的RS232-C异步串行接口,一般采用专用的集成电路即UART实现。如8250、8251、NS16450等芯片都是常见的UART器件,这类芯片已经相当复杂,有的含有许多辅助的模块(如FIFO),有时我们不需要使用完整的UART的功能和这些辅助功能。或者设计上用到了FPGA/CPLD器件,那么我们就可以将所需要的UART功能集成到FPGA内部。使用Verilog将UART的核心功能集成,从而使整个设计更加紧凑、稳定且可靠。本文设计一利用FPGA实现的通用异步收发器UART,能实现与PC机之间的串口通信。1.5基于FPGA串口设计的技术要求(1)设计出能完成串行数据发送和接收的的串口,可实现与PC机的通讯。(2)设计波特率为9600bit/s(3)收发数据帧格式定义为:1位起始位,8位数据位和1位停止位。(4)用modelsim仿真第35页(共37页) 总结2UART原理介绍2.1UART结构和工作原理2.1.1UART介绍UART:UniversalAsynchronousReceiver/Transmitter,通用异步接收/发送装置,UART是一个并行输入成为串行输出的芯片,通常集成在主板上,多数是16550AFN芯片。因为计算机内部采用并行数据,不能直接把数据发到Modem,必须经过UART整理才能进行异步传输,其过程为:CPU先把准备写入串行设备的数据放到UART的寄存器(临时内存块)中,再通过FIFO(FirstInputFirstOutput,先入先出队列)传送到串行设备,若是没有FIFO,信息将变得杂乱无章,不可能传送到Modem。  UART是用于控制计算机与串行设备的芯片。有一点要注意的是,它提供了RS-232C数据终端设备接口,这样计算机就可以和调制解调器或其它使用RS-232C接口的串行设备通信了。作为接口的一部分,UART还提供以下功能:将由计算机内部传送过来的并行数据转换为输出的串行数据流。将计算机外部来的串行数据转换为字节,供计算机内部使用并行数据的器件使用。在输出的串行数据流中加入奇偶校验位,并对从外部接收的数据流进行奇偶校验。在输出数据流中加入启停标记,并从接收数据流中删除启停标记。处理由键盘或鼠标发出的中断信号(键盘和鼠标也是串行设备)。可以处理计算机与外部串行设备的同步管理问题。图1UART数据传输结构图2.1.2UART帧的格式UART帧的格式包括线路空闲状态(idle,高电平有效)、起始位(startbit,低电平有效)、5~8位数据位(databits)、校验位(paritybit,可选)和1位停止位(stopbit)。字符的同步由起始位和停止位来实现。UART内部配置有寄存器,可以配置实现数据位数(5~8位)可选、是否有校验位和校验的类型等设置。第35页(共37页) 总结.图2UART数据帖格式2.1.3UART工作原理UART接收器在工作时,信号检测器一直监视RxD线上的电平,当RxD线上出现低电平时,通知串行接收控制器有数据需要接收,此时接收控制器启动移位寄存器、波特率发生器和数据位计数器.在波特率时钟的驱动下移位寄存器将RxD线上的电平值依次移入内部寄存器,当计数器的计数值达到10时表示一帧数据接收完成,这时接收控制器产生数据接收完成中断,并从接收的数据帧中提取出数据并锁存,供后续模块使用.UART发送器在工作时,发送信号检测器一直监视发送请求信号是否有效,若检测发送请求信号有效,则发送信号检测器停止接收发送请求.发送请求信号传到串行发送控制器后,控制器启动发送移位寄存器、波特率发生器和数据位计数器,在波特率时钟的驱动下,发送移位寄存器先发送一位起始位(逻辑0),然后将待发送的并行数据从最低位开始逐位发出,数据发送完后,再发送一位停止位(逻辑1)。在移位寄存器移出一位逻辑值后数据位计数器加1,当数据位计数器记满10表示一帖数据发送完成,此时控制器停止各个辅助部件并且再次启动发送信号检测器,开始监视下一次发送请求.3方案选择3.1设计语言选择本次设计用的硬件描述语言是VHDL,主要原因是以前学过该语言和它具有如下优势:(1)与其他的硬件描述语言相比,VHDL具有更强的行为描述能力,从而决定了他成为系统设计领域最佳的硬件描述语言。强大的行为描述能力是避开具体的器件结构,从逻辑行为上描述和设计大规模电子系统的重要保证。 (2)VHDL丰富的仿真语句和库函数,使得在任何大系统的设计早期就能查验设计系统的功能可行性,随时可对设计进行仿真模拟。 (3)VHDL语句的行为描述能力和程序结构决定了他具有支持大规模设计的分解和已有设计的再利用功能。符合市场需求的大规模系统高效,高速的完成必须有多人甚至多个代发组共同并行工作才能实现。(4)VHDL对设计的描述具有相对独立性,设计者可以不懂硬件的结构,也不必管理最终设计实现的目标器件是什么,而进行独立的设计。第35页(共37页) 总结3.2电平转换方式选择RS─232C是与RS499、RS423、RS422和RS485并列的一种UART(universalasynchronousreceiver/transmitter)接口标准规范和总线标准规范.这些规范虽然规定了不同的通信接口电气特性、传输速率、连接特性和接口的机械特性等内容,但是都对应异步串行通信协议.由于实际中PC的外部接口配置为RS─232C已经成为事实标准,所以文章以RS─232C为基础编写FPGA串口驱动程序。而MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,所以电平转换部分就是用MAX232实现的。3.3FPGA核心芯片的选择本系统用的主芯片是EP1C12Q240C8,该系列的芯片采用324引脚、BGA封装的EP1C12FPGA,它拥有12060个LE,52个M4K片上RAM(共计239616bits),2个高性能PLL以及多达249个用户自定义IO。同时,系统还可以根据用户不同的设计需求来更换其它不同系列的核心板,如:EP1C6、EP2C20、EP3C25等。所以,不管从性能上而言,还是从系统灵活性上而言,它都会成为我们的好帮手。EP1C12核心板具有JTAG调试接口、50MHz高精度时钟源等可用资源,因此对于设计和仿真都提供了较好的条件。3.4总体设计框图FPGARS232电平转换PC机图3总体设置框图第35页(共37页) 总结4系统硬件设计4.1器件芯片介绍4.1.1FPGA核心板EP1C12介绍EP1C12核心板为基于AlteraCyclone器件的嵌入式系统开发提供了一个很好的硬件平台,它可以为开发人员提供以下资源:1主芯片采用AlteraCyclone器件EP1C12F324C82EPCS4I8配置芯片34个用户自定义按键44个用户自定义LED51个七段码LED6标准AS编程接口和JTAG调试接口740MHz高精度时钟源8三个高密度扩展接口9系统上电复位电路10支持+5V直接输入,板上电源管理模块系统主芯片采用324引脚、BGA封装的E1C12FPGA,它拥有12060个LE,52个M4K片上RAM(共计239616bits),2个高性能PLL以及多达249个用户自定义IO。同时,系统还可以根据用户不同的设计需求来更换其它不同系列的核心板,如:EP1C6、EP2C20、EP3C25等。第35页(共37页) 总结图4EP1C12核心板系统功能框图FPGA开发平台提供了丰富的资源供学生或开发人员学习使用,资源包括接口通信、控制、存储、数据转换以及人机交互显示等几大模块,接口通信模块包括SPI接口、IIC接口、VGA接口、RS232接口、USB接口、PS2键盘/鼠标接口、1-Wire接口等;存储模块包括EEPROM存储器模块等;数据转换模块包括串行ADC、DAC以及音频CODE等;人机交互显示模块包括8个按键、16个LED发光二极管显示、1602字符型点阵LCD、8位动态7段码管、实时时钟、SD卡等。上述的这些资源模块既可以满足初学者入门的要求,也可以满足开发人员进行二次开发的要求。EDA/SOPC实验开发平台提供的资源有:1、标准配置核心板为EP1C12核心板(核心芯片为EP1C12F324C8)。可更换EP2C20F484C8等其它核心板。2、1602字符型液晶点阵。3、RTC,提供系统实时时钟。4、1个256色VGA接口。第35页(共37页) 总结5、1个标准串行接口。6、1个USB设备接口,利用PDIUSBD12芯片实现USB协议转换。7、基于SPI或IIC接口的音频CODEC模块。8、1个蜂鸣器输出模块。9、2个PS2键盘/鼠标接口。10、串行ADC和串行DAC模块。11、IIC接口的EEPROM存储器模块。12、基于1-Wire接口的数字温度传感器。13、8位动态七段码管LED显示。14、16个用户自定义LED显示,8个用户自定义按键输出。15、一个SD卡接口模块。16、扩展接口,供用户高速稳定的自由扩展。图5FPGA系统平台功能框图JTAG调试接口在FPGA开发过程中,JTAG是一个比不可少的接口,因为开发人员需要下载配置数据到FPGA。在NiosII开发过程中,JTAG更是起着举足轻重的作用,因为通过JTAG接口,开发人员不仅可以对NiosII系统进行在线仿真调试,而且还可以下载代码或用户数据到CFIFlash中。开发板上提供如图2-6所示的10针插座,其每个插针的信号定义见表1。第35页(共37页) 总结图6开发板上的JTAG调试插座JP1插座信号定义1TCK2GND3TDO4Vcc(3.3V)5TMS6/7/8/9TDI10GND表1JTAG插座信号定义注:‘/’表示该插针没有任何信号。晶振核心板上提供了高精度、高稳定性50MHz的有源晶振,晶振所输出的脉冲信号直接与FPGA的时钟输入引脚相连。如果设计人员需要其它频率时钟源,可以在FPGA内部进行分频或利用FPGA内部PLL倍频等途径来得到。有源晶振的输出端与FPGA的IO接口对应关系如表2所示。40M时钟信号EP1C12引脚40MHZJ3表3时钟信号与FPGAIO接口对应表-4.1.2MAX232MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。第35页(共37页) 总结图7MAX232芯片引脚介绍第一部分是电荷泵电路。由1、2、3、4、5、6脚和4只电容构成。功能是产生+12v和-12v两个电源,提供给RS-232串口电平的需要。  第二部分是数据转换通道。由7、8、9、10、11、12、13、14脚构成两个数据通道。  其中13脚(R1IN)、12脚(R1OUT)、11脚(T1IN)、14脚(T1OUT)为第一数据通道。  8脚(R2IN)、9脚(R2OUT)、10脚(T2IN)、7脚(T2OUT)为第二数据通道。  TTL/CMOS数据从T1IN、T2IN输入转换成RS-232数据从T1OUT、T2OUT送到电脑DB9插头;DB9插头的RS-232数据从R1IN、R2IN输入转换成TTL/CMOS数据后从R1OUT、R2OUT输出。  第三部分是供电。15脚GND、16脚VCC(+5v)。主要特点1、符合所有的RS-232C技术标准  2、只需要单一+5V电源供电  3、片载电荷泵具有升压、电压极性反转能力,能够产生+10V和-10V电压V+、V-  4、功耗低,典型供电电流5mA  5、内部集成2个RS-232C驱动器  6、内部集成两个RS-232C接收器  7、高集成度,片外最低只需4个电容即可工作。4.1.3RS232RS232接口是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”。第35页(共37页) 总结该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定。随着设备的不断改进,出现了代替DB25的DB9接口,现在都把RS232接口叫做DB9。RS-232C的接口信号:RS-232C的功能特性定义了25芯标准连接器中的20根信号线,其中2条地线、4条数据线、11条控制线、3条定时信号线,剩下的5根线作备用或未定义。常用的只有10根,它们是:(1)联络控制信号线:  数据发送准备好(Datasetready-DSR)——有效时(ON)状态,表明MODEM处于可以使用的状态。  数据终端准备好(Dataterminalready-DTR)——有效时(ON)状态,表明数据终端可以使用。  这两个信号有时连到电源上,一上电就立即有效。这两个设备状态信号有效,只表示设备本身可用,并不说明通信链路可以开始进行通信了,能否开始进行通信要由下面的控制信号决定。  请求发送(Requesttosend-RTS)——用来表示DTE请求DCE发送数据,即当终端要发送数据时,使该信号有效(ON状态),向MODEM请求发送。它用来控制MODEM是否要进入发送状态。  允许发送(Cleartosend-CTS)——用来表示DCE准备好接收DTE发来的数据,是对请求发送信号RTS的响应信号。当MODEM已准备好接收终端传来的数据,并向前发送时,使该信号有效,通知终端开始沿发送数据线TxD发送数据。  这对RTS/CTS请求应答联络信号是用于半双工MODEM系统中发送方式和接收方式之间的切换。在全双工系统中,因配置双向通道,故不需要RTS/CTS联络信号,使其变高。  接收线信号检出(ReceivedLinedetection-RLSD)——用来表示DCE已接通通信链路,告知DTE准备接收数据。当本地的MODEM收到由通信链路另一端(远地)的MODEM送来的载波信号时,使RLSD信号有效,通知终端准备接收,并且由MODEM将接收下来的载波信号解调成数字两数据后,沿接收数据线RxD送到终端。此线也叫做数据载波检出(DataCarrierdectection-DCD)线。  振铃指示(Ringing-RI)——当MODEM收到交换台送来的振铃呼叫信号时,使该信号有效(ON状态),通知终端,已被呼叫。  (2)数据发送与接收线:  发送数据(Transmitteddata-TxD)——通过TxD终端将串行数据发送到MODEM,(DTE→DCE)。  接收数据(Receiveddata-RxD)——通过RxD线终端接收从MODEM发来的串行数据,(DCE→DTE)。  (3)地线:   GND、Sig.GND——保护地和信号地,无方向。第35页(共37页) 总结  上述控制信号线何时有效,何时无效的顺序表示了接口信号的传送过程。例如,只有当DSR和DTR都处于有效(ON)状态时,才能在DTE和DCE之间进行传送操作。若DTE要发送数据,则预先将DTR线置成有效(ON)状态,等CTS线上收到有效(ON)状态的回答后,才能在TxD线上发送串行数据。这种顺序的规定对半双工的通信线路特别有用,因为半双工的通信才能确定DCE已由接收方向改为发送方向,这时线路才能开始发送。  2个数据信号:发送TXD;接收RXD。  1个信号地线:SG。  6个控制信号:  DSR数传发送准备好,DataSetReady。  DTR数据终端准备好,DataTerminalReady。  RTSDTE请求DCE发送(RequestToSend)。  CTSDCE允许DTE发送(ClearToSend),该信号是对RTS信号的回答。  DCD数据载波检测(DataCarrierDetection),当本地DCE设备(Modem)收到对方的DCE设备送来的载波信号时,使DCD有效,通知DTE准备接收,并且由DCE将接收到的载波信号解调为数字信号,经RXD线送给DTE。  RI振铃信号(Ringing),当DCE收到对方的DCE设备送来的振铃呼叫信号时,使该信号有效,通知DTE已被呼叫。  由于RS232接口标准出现较早,难免有不足之处,主要有以下四点:  (1)接口的信号电平值较高,易损坏接口电路的芯片,又因为与TTL电平不兼容故需使用电平转换电路方能与TTL电路连接。  (2)传输速率较低,在异步传输时,波特率≤20Kbps。  (3)接口使用一根信号线和一根信号返回线而构成共地的传输形式,这种共地传输容易产生共模干扰,所以抗噪声干扰性弱。(4)传输距离有限,最大传输距离标准值为50英尺(实际≤15米)。RS232(DB9)接口定义图8接口说明1DCD载波检测  2RXD接收数据3TXD发送数据  4DTR数据终端准备好  5SG信号地第35页(共37页) 总结  6DSR数据准备好  7RTS请求发送8CTS允许发送9RI振铃提示4.2系统硬件框图FPGAAS下载方式JTAG接口MAX232PC终端电源时钟晶振图9系统硬件图4.3主要组成电路分析本系统设计目标主要包括两个部分:FPGA模块、电平转换模块。。4.3.1FPGA模块FPGA模块主要由波特率产生模块、数据发送模块、数据接收模块三部分组成。下图为FPGA的顶层原理图。第35页(共37页) 总结图10.顶层模块的电路图波特率产生模块:波特率发生器实际上就是一个分频器。可以根据给定的系统时钟(晶振时钟)和要求的波特率算出波特率分频因子,算出的波特率分频器的分频数。即分频数=系统时钟/(16×波特率),波特率分频数可以根据不同的应用需要更改。题目要求波特率为9600bit/s,由于FPGA的EP1C12核心板提供了高精度、高稳定性的40MHz时钟源。波特率发生器模块图如下所示图11波特率发生器模块图波特率发生器的仿真结果如图:第35页(共37页) 总结Clk:时钟信号周期Resetb:复位信号Bclk:输出波特率时钟信号周期图12波特率发生器的仿真波形UART接收器模块:由于串行数据帧和接收时钟是异步的,由逻辑1转为逻辑0可以被视为一个数据帧的起始位。然而,为了避免毛刺影响,能够得到正确的起始位信号,必须要求接收到的起始位在波特率时钟采样的过程中至少有一半都是属于逻辑0才可认定接收到的是起始位。由于内部采样时钟bclk周期(由波特率发生器产生)是发送或接收波特率时钟频率的16倍,所以起始位需要至少8个连续bclk周期的逻辑0被接收到,才认为起始位接收到,接着数据位和奇偶校验位将每隔16个bclk周期被采样一次(即每一个波特率时钟被采样一次)。如果起始位的确是16个bclk周期长,那么接下来的数据将在每个位的中点处被采样。1、R_START状态:当UART接收器复位后,接收状态机将处于这一状态。在此状态,状态机一直在等待RXD的电平跳转,从逻辑1变为逻辑0,即起始位,这意味着新的一帧UART数据帧的开始,一旦起始位被确定,状态机将转入R_CENTER状态。图6中的RXD_SYNC信号是RXD的同步信号,因为在进行逻辑1或逻辑0判断时,不希望检测的信号是不稳定的,所以不直接检测RXD信号,而是检测经过同步后的RXD_SYNC信号。2、R_CENTER状态:对于异步串行信号,为了使每一次都检测到正确的位信号,而是在较后的数据位检测时累计误差较小,显然在每位的中点检测是最为理想的。在本状态,就是由起始位求出每位的中点,通过对bclk的个数进行计数(RCNT16),但计数值不是想当然的“1000”,要考虑经过一个状态,也即经过了一个bclk周期,所希望得到的是在采样时1/2位。另外,可能在R_START状态检测到的起始位不是真正的起始位,可能是一个偶然出现的干扰尖脉冲(负脉冲)。这种干扰脉冲的周期是很短的,所以可以认为保持逻辑0超过1/4个位时间的信号一定是起始位。第35页(共37页) 总结图13UART接收器的接收状态机注:状态机一共有5个状态:R_START(等待起始位)、R_CENTER(求中点)、R_WAIT(等待采样)、R_SAMPLE(采样)和R_STOP(停止位接收)。3、R_WAIT状态:当状态机处于这一状态,等待计满15个bclk,在第16个bclk是进入R_SAMPLE状态进行数据位的采样检测,同时也判断是否采集的数据位长度已达到数据帧的长度,如果到来,就说明停止位来临了。在本设计中默认为8,即对应的UART工作在8位数据位、无校验位格式。4、R_SAMPLE状态:即数据位采样检测,完成后无条件状态机转入R_WAIT状态,等待下次数据位的到来。5、R_STOP状态:无论停止位是1还是1.5位,或是2位,状态机在R_STOP不具体检测RXD,只是输出帧接收完毕信号(REC_DONE<’1’),停止位后状态机转回到R_START状态,等待下一个帧的起始位。第35页(共37页) 总结图14UART接收器的模块图UART接收器的仿真波形结果Bclkr:波特率时钟信号周期Resetr:复位信号Rxdr:电平触发信号,从逻辑1变为逻辑0R_ready:数据帧Rbuf:并行数据图15UART接收器的仿真波形UART发送器模块:发送器只要每隔16个bclk周期输出一个数据即可,次序遵循第一位是起始位,第8位是停止位。在本设计中没有校验位,但只要改变Generic参数Frameelen,也可以加入校验位,停止位是固定的1位格式[6]。图4..4.3.1是发送状态机的状态图。此状态机一共有5个状态:X_IDLE(空闲)、X_START(起始位)、X_WAIT(移位等待)、X_SHIFT(移位)和X_STOP(停止位)。1、X_IDLE状态:当UART被复位信号RESETL复位后,状态机将立刻进入这一状态。在这个状态中,UART的发送器一直在等待一个数据帧发送命令XMIT_CMD第35页(共37页) 总结。这时由于XMIT_CMD是一个外加信号,在FPGA之外,不可能对XMIT_CMD的脉冲宽带进行限制,如果XMIT_CMD有效在UART发完一个数据帧依然有效,那么就会错误地被认为,一个新的数据发送命令又到来了,UART发送器就会再次启动UART帧的发送,显然该帧的发送是错误的。在此对XMIT_CMD进行了脉冲宽度的限定,用XMIT_CMD_P代替XMIT_CMD信号,XMIT_CMD_P是一个短脉冲信号。当XMIT_CMD_P=‘1’,状态机转入X_START,准备发送起始位。2、X_START状态:在这个状态下,UART的发送器一个时间宽度的逻辑0信号至TXD,即起始位。紧接着状态机转入X_WAIT状态。XCNT16是bclk的计数器。3、X_WAIT状态:同UART接收状态机中的R_WAIT状态类似。4、X_SHIFT状态:当状态机处于这一状态时,实现待发数器的并串转换。转换完成立即回到X_WAIT状态。5、X_STOP:停止位发送状态,当数据帧发送完毕,状态机转入该状态,并发送16个bclk周期的逻辑1信号,即1位停止位。状态机送完停止位后回到X_IDLE状态,并等待另一个数据帧的发送命令。第35页(共37页) 总结图16发送状态机的状态图图17UART发送器的模块图UART发送器的仿真波形结果如图4.4.3.3第35页(共37页) 总结Bclkt:波特率时钟信号周期Resett:复位信号Xmit_cmd_p:短脉冲信号Txddone:串行数据Txd:数据帧图18UART发送器的仿真波形4.3.2电平转换模块电平转换是由MAX232芯片实现的。MAX232芯片是美信公司专门为电脑的RS-232标准串口设计的单电源电平转换芯片,使用+5v单电源供电。该模块的作用就是实现电平转换后于PC机相连。图19MAX232电平转换电路4.4总电路图设计见附录1和附录2。第35页(共37页) 总结5系统软件设计软件设计概述:本设计使用的软件主要是ModelSimSE6.2b和QuartusII9.0两个软件,用QuartusII9.0主要是用来程序仿真﹑画顶层原理图和生成子模块图。ModelSimSE6.2b主要用来波形仿真。5.1发送数据程序流程图Y开始波特率设置(9600bit/s)复位信号为0Y准备发送(等待发送脉冲信号)发送数据起始位移位等待数据转换?换?发送停止位发送完成准备发送下一帖数据完成N图20数据发送模块流程图第35页(共37页) 总结5.2接收数据程序流程图开始波特率设置(9600bit/s)复位信号为0Y准备接收接收起始位(逻辑0超过1/4个位时间为起始位)RXD_SYNC=0RXD_SYNC=1数据位是否为8位?YN接收停止位接收完成结束准备接收下一帖数据图21数据介绍模块流程图第35页(共37页) 总结5.5系统源程序系统程序见附录3。6制作步骤本课题的制作是分这几个步骤完成的:⑴、查阅大量的资料,完成开题报告。在这个过程中我经常到图书馆查阅FPGA以及UART的相关资料,同时我也经常上网搜索这方面的资料,知识总是在不断积累的过程中了解和掌握的。因此,一段时间下来,我对位FPGA和UART的国内外研究状况、发展趋势、工作原理和制作方法都有了比较清晰的了解。⑵、确定方案。通过一段时间的学习和查阅资料确定了设计的主要流程和主要器件。⑶、硬件设计。硬件设计主要是指画硬件电路,在这里要用到一个画图软件Protel。画硬件电路不仅可以体现一个人的基础知识掌握这样不仅看的时候好看,也以节约资源。⑸、软件设计。本课题的软件部分是用VHDL语言设计而成的。系统软件的设计采用了模块化的结构方式,将各个功能分成独立模块,由系统的监控程序统一管理执行。编写完程序后,要编译,编译通过后生成VHDL文件。文件编译成功后将由QuartusII9.0生成子模块和状态转换图,再在ModelSim里面运行程序观察波形。第35页(共37页)结束语7总结本文对以FPGA为核心实现UART与PC机之间的串口通信的整体结构、性能功用及各组成模块的设计方法都做了较为详细的研究。通过波特率发生器、发送器和接收器模块的设计与仿真,能较容易地实现通用异步收发器总模块,。本设计完全采用VHDL语言进行描述。实现的UART设置了时钟输入clk,复位输入reset,串行数据输入rxd,读写信号输入rd和wr、片选输入cs、传送数据位数选择输入a1和a0、定时器初值输入count,串行发送数据输入txd,接收寄存器状态输出rdfull、发送寄存器状态输出tdempty以及数据总线data。并详细讨论了采用VHDL对异步通信接口UART的设计流程,对设计进了功能仿真、综合,以及静态时序分析和时序仿真,第35页(共37页) 结束语完成了在FAGA上实现UART的全过程,再通过电平转换与PC机相连,就实现了与PC机的通信。通过本次毕业设计,我完成了基于FPGA串口设计。在这次毕业设计中使我对FPGA技术有了进一步的认识,FPGA技术注重培养学生的自主创新的意识和能力,侧重使用电子系统的设计。在整个设计中最难点和学习费时在于硬件描述语言VHDL语言,在利用硬件描述语言完成电路设计后,必须基于QuartusII6.0软件的文本输入设计流程和ModelSimSE6.2b波形仿真。首先得学习软件的安装和使用,尤其在编译成功后的仿真波形的测试。通过系统的学习使用对软件的使用和对设计的编程都有了进一步的提升。在整个设计阶段感受最为深刻的是掌握学习的方式和解决问题的方法。首先是解决问题的方式,在面临的大量的信息中如何筛选出所需的信息,才是解决问题的关键。毕业中出现的困难我通过和老师的沟通、查阅相关书籍、网上搜索以及同学的帮助,最终得到了解决。由于本人水平有限,文中难免存在不足之处,敬请各位老师和同学批评指正。第35页(共37页)附录2第35页(共37页) 附录2参考文献(1)陈永刚.基于FPGA的通用异步收发器的设计兰州交通大学学报2010年2月(2)王敬美.基于FPGA和UART的数据采集器设计电子器件2009年4月(3)方喜波.基于FPGA串口通讯开发计算机与信息技术(4)黄智伟.FPGA系统设计与实践.电子工业出版社,2005·(5)廖日坤.CPLD/FPGA嵌入式应用开发技术白金手册.中国电力出版社;2005·(6)王振红.VHDL数字电路设计与应用实践教程.北京:机械工业出版社,2003·(7)张凯.林伟.VHDL实例剖析.北京:国防工业出版社,2004·(8)徐光辉.徐志军.CPLD/FPGA的开发与应用.北京:电子工业出版社,2002·第35页(共37页) 致谢致谢本文是在我的指导老师陈晓静讲师的悉心指导下完成的,从论文的选题到最后的定稿都凝聚着陈老师的心血。四年来,学校各位老师高超的学术思想、渊博的学术知识、丰富的学术经验、严谨的治学态度、豁达的为人风格和不断开拓进取的科学研究风尚都直接、间接和潜移默化地影响着我,使我始终充满不断求知求新和拓展学术领域的热情。在学业即将完成之际,谨向各位恩师表示我最衷心的感谢!除此以外,还要感谢各位同学的热情帮助和鼓励,四年的学习生活,我们结下了深厚的友谊。当我在学习生活中遇到一些问题和烦恼时,是他们给予我及时的帮助和热心的鼓励,我会加倍珍惜同学之间的这种友谊。我还要深深的感谢支持和鼓励我的家人,是他们默默的付出,使我能够无牵挂的学习,我只有更加努力的学习与工作,才能回报他们的关爱。最后,谨向所有关心、帮助和支持过我的老师、同学和家人们表示衷心的感谢!第35页(共37页) 致谢附录1第35页(共37页) 附录附录2第35页(共37页) 附录附录33主要程序(1)主程序libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitytopisport(clk32mhz,reset,rxd,xmit_cmd_p_in:instd_logic;—总的输入输出信号的定义rec_ready,txd_out,txd_done_out:outstd_logic;txdbuf_in:instd_logic_vector(7downto0);—待发送数据输入rec_buf:outstd_logic_vector(7downto0));—接收数据缓冲endtop;architectureBehavioraloftopiscomponentrecieverport(bclkr,resetr,rxdr:instd_logic;r_ready:outstd_logic;rbuf:outstd_logic_vector(7downto0));endcomponent;componenttransferport(bclkt,resett,xmit_cmd_p:instd_logic;txdbuf:std_logic_vector(7downto0);txd:outstd_logic;txd_done:outstd_logic);endcomponent;componentbaudPort(clk,resetb:instd_logic;bclk:outstd_logic);endcomponent;第35页(共37页) 附录signalb:std_logic;beginu1:baudportmap(clk=>clk32mhz,resetb=>reset,bclk=>b);—顶层映射u2:recieverportmap(bclkr=>b,resetr=>reset,rxdr=>rxd,r_ready=>rec_ready,rbuf=>rec_buf);u3:transferportmap(bclkt=>b,resett=>reset,xmit_cmd_p=>xmit_cmd_p_in,txdbuf=>txdbuf_in,txd=>txd_out,txd_done=>txd_done_out);endBehavioral;(2)波特率发生器模块(baud.vhd)libraryieee;useieee.std_logic_1164.all;useieee.numeric_std.all;useieee.std_logic_unsigned.all;entitylastisport(resetb:instd_logic;clk:instd_logic;bclk:outstd_logic);endlast;architectureccoflastissignalclk_cnt:unsigned(3downto0);signalclk_bit:std_logic;beginprocess(clk,resetb)beginif(resetb='1')thenclk_cnt<="0000";clk_bit<='0';elsifrising_edge(clk)thenif(clk_cnt=4)thenclk_cnt<="0000";clk_bit<=notclk_bit;elseclk_cnt<=clk_cnt+1;endif;endif;endprocess;bclk<=clk_bit;endcc;第35页(共37页) 附录(3)UART接收器(receiver.Vhd)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entityrecieverisgeneric(framlenr:integer:=8);port(bclkr,resetr,rxdr:instd_logic;—定义输入输出信号r_ready:outstd_logic;rbuf:outstd_logic_vector(7downto0));endreciever;architectureBehavioralofrecieveristypestatesis(r_start,r_center,r_wait,r_sample,r_stop);—定义各个状态signalstate:states:=r_start;signalrxd_sync:std_logic;beginprol:process(rxdr)beginifrxdr='0'thenrxd_sync<='0';elserxd_sync<='1';endif;endprocess;pro2:process(bclkr,resetr,rxd_sync)—主控时序、组合进程variablecount:std_logic_vector(3downto0);—定义中间变量variablercnt:integer:=0;variablerbufs:std_logic_vector(7downto0);beginifresetr='1'thenstate<=r_start;count:="0000";—复位elsifrising_edge(bclkr)thencasestateiswhenr_start=>—状态1,等待起始位ifrxd_sync='0'thenstate<=r_center;r_ready<='0';rcnt:=0;elsestate<=r_start;r_ready<='0';endif;whenr_center=>—状态2,求出每位的中点ifrxd_sync='0'thenifcount="0100"thenstate<=r_wait;count:="0000";elsecount:=count+1;state<=r_center;endif;elsestate<=r_start;endif;whenr_wait=>—状态3,等待状态ifcount>="1101"then第35页(共37页) 附录ifrcnt=framlenrthenstate<=r_stop;elsestate<=r_sample;endif;count:="0000";elsecount:=count+1;state<=r_wait;endif;whenr_sample=>rbufs(rcnt):=rxd_sync;rcnt:=rcnt+1;state<=r_wait;—状态4,数据采样检测whenr_stop=>r_ready<='1';rbuf<=rbufs;state<=r_start;—状态4,输出帧接收完毕信号whenothers=>state<=r_start;endcase;endif;endprocess;endBehavioral;(4):UART发送器(transfer.Vhd)libraryieee;useieee.std_logic_1164.all;useieee.std_logic_arith.all;useieee.std_logic_unsigned.all;entitytransferisgeneric(framlent:integer:=8);port(bclkt,resett,xmit_cmd_p:instd_logic;—定义输入输出信号txdbuf:instd_logic_vector(7downto0):="11001010";txd:outstd_logic;txd_done:outstd_logic);endtransfer;architectureBehavioraloftransferistypestatesis(x_idle,x_start,x_wait,x_shift,x_stop);—定义各个子状态signalstate:states:=x_idle;signaltcnt:integer:=0;beginprocess(bclkt,resett,xmit_cmd_p,txdbuf)—主控时序、组合进程variablexcnt16:std_logic_vector(4downto0):="00000";—定义中间变量variablexbitcnt:integer:=0;第35页(共37页) 附录variabletxds:std_logic;beginifresett='1'thenstate<=x_idle;txd_done<='0';txds:='1';—复位elsifrising_edge(bclkt)thencasestateiswhenx_idle=>—状态1,等待数据帧发送命令ifxmit_cmd_p='1'thenstate<=x_start;txd_done<='0';elsestate<=x_idle;endif;whenx_start=>—状态2,发送信号至起始位ifxcnt16>="01111"thenstate<=x_wait;xcnt16:="00000";elsexcnt16:=xcnt16+1;txds:='0';state<=x_start;endif;whenx_wait=>—状态3,等待状态ifxcnt16>="01110"thenifxbitcnt=framlentthenstate<=x_stop;xbitcnt:=0;elsestate<=x_shift;endif;xcnt16:="00000";elsexcnt16:=xcnt16+1;state<=x_wait;endif;whenx_shift=>txds:=txdbuf(xbitcnt);xbitcnt:=xbitcnt+1;state<=x_wait;—状态4,将待发数据进行并串转换whenx_stop=>—状态5,停止发送状态ifxcnt16>="01111"thenifxmit_cmd_p='0'thenstate<=x_idle;xcnt16:="00000";elsexcnt16:=xcnt16;state<=x_stop;endif;txd_done<='1';elsexcnt16:=xcnt16+1;txds:='1';state<=x_stop;第35页(共37页) 附录endif;whenothers=>state<=x_idle;endcase;endif;txd<=txds;endprocess;endBehavioral;第35页(共37页)

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭