基于FPGA的串行通信设计王海涛一项目简要介绍二串行通信三UART发送器的设计四UART接收器简介五总结图1火箭发射系统组成框图发射控制信号或串行功率脉冲火箭控制盒余弹信号点火脉冲余弹信息发送火控任务机火箭发射器余弹监测装置1.项目简要介绍1.1系统框图火箭发射控制系统是火控武器系统的重要机载设备,目前的火箭发射控制系统不能自行检测火箭弹装载情况,只能由飞行员根据地面装弹情况,自行进行火箭弹发射模式选择,而且在火箭弹的发射过程中,余弹的数量只能由火控任务机根据发射指令信号进行虚拟余弹数量的统计,飞行员不能实时了解火箭弹是否按照发射模式完成火箭弹的发射。智能余弹监测型机载火箭发射系统正是为了满足上述要求,使各型战斗机在火箭弹发射时具有实时智能余弹监测的功能,提升飞机的自检测性能。1.2系统功能简介1.3产品的用途2.1串行通信概念UART(UniversalAsynchronousReceiverTransmitter通用异步收发器)是一种应用广泛的短距离串行传输接口。常常用于短距离、低速、低成本的通讯中。基本的UART通信只需要两条信号线(RXD、TXD)就可以完成数据的相互通信,接收与发送是全双工形式。TXD是UART发送端,为输出;RXD是UART接收端,为输入。2串行通信2.2串行通信特点(1)在信号线上共有两种状态,可分别用逻辑1(高电平)和逻辑0(低电平)来区分。在发送器空闲时,数据线应该保持在逻辑高电平状态。(2)起始位(StartBit):发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接受器数据传输即将开始。(3)数据位(DataBits):起始位之后就是传送数据位。数据位一般为8位一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后。(4)校验位(parityBit):可以认为是一个特殊的数据位。校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。(5)停止位:停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态。(6)帧:从起始位开始到停止位结束的时间间隔称之为一帧。(7)波特率:UART的传送速率,用于说明数据传送的快慢。在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。如波特率9600=9600bps(位/秒)。UART的数据帧格式为:STARTD0D1D2D3D4D5D6D7PSTOP起始位数据位校验位停止位3.1顶层模块异步收发器的顶层模块由波特率发生器、发送数据传输、UART接收器和UART发送器构成。UART发送器的用途是将准备输出的并行数据按照基本UART帧格式转为TXD信号串行输出。UART接收器接收RXD串行信号,并将其转化为并行数据。波特率发生器就是专门产生一个远远高于波特率的本地时钟信号对输入RXD不断采样。3UART发送器的设计图2顶层模块电路图3顶层模块仿真波形3.2波特率发生器--将32MHz的输入信号分频为153600HzlibraryIEEE;useIEEE.STD_LOGIC_1164.ALL;useIEEE.STD_LOGIC_ARITH.ALL;useIEEE.STD_LOGIC_UNSIGNED.ALL;entitybaudisPort(clk,resetb:instd_logic;bclk:outstd_logic);endbaud;architectureBehavioralofbaudisbeginprocess(clk,resetb)variablecnt:integer;beginifreserb=‘1’thencnt:=0;bclk=‘0’;--复位elsifrising_edge(clk)thenifcnt=208thencnt:=0;bclk='1';--设置分频系数elsecnt:=cnt+1;bclk='0';endif;endif;endprocess;endBehavioral;图4波特率发生器仿真波形3.3UART发送器采用状态机进行设计,UART发送器共有5个状态x_idle(空闲),x_start(起始位),x_wait(移位等待),x_shift(移位),x_stop(停止)。x_idle状态当UART被复位信号复位后,状态机将立刻进入这一状态。在这个状态下,UART的发送器一直在等待一个数据帧发送命令xmit_cmd_p。当XMIT_CMD_P=‘1’,状态机转入X_START,准备发送起始位。3.3.1UART发送状态机x_start状态在这个状态下,UART的发送器一个位时间宽度的逻辑0信号至TXD,即起始位。紧接着状态机转入x_wait状态。xcnt16是bclk的计数器。x_wait状态等待是否计满15个bclk,同时判断采集的数据位的长度是否已达到数据帧的长度。x_shift状态当状态机处于这一状态时,实现待发数据的并串转换。转换完成立即回到x_wait状态。x_stop状态停止位发送状态,当数据帧发送完毕,状态机转入该状态,并发送16个bclk周期的逻辑1信号,即1位停止位。状态机送完停止位后回到x_idle状态,并等待另一个数据帧的发送命令。3.3.2UART发送器程序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;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=01111thenstate=x_wait;xcnt16:=00000;elsexcnt16:=xcnt16+1;txds:='0';state=x_start;endif;whenx_wait=--状态3,等待状态ifxcnt16=01110thenifxbitcnt=framlentthenstate=x_stop;xbitcnt:=0;xcnt16:=00000;elsestate=x_shift;endif;elsexcnt16:=xcnt16+1;state=x_waitendif;whenx_shift=txds:=txdbuf(xbitcnt);xbitcnt:=xbitcnt+1;state=x_wait;--状态4,将待发数据进行并串转换whenx_stop=--状态5,停止位发送状态ifxcnt16=01111thenifxmit_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;endif;whenothers=state=x_idle;endcase;endif;txd=txds;endprocess;endBehavioral;图5UART发送器的仿真波形四UART接收器简介1由逻辑1转化为逻辑0可以认为是一个数据帧的起始位。2为了避免毛刺影响,能够得到正确的起始位信号,必须要求接收到的起始位在波特率时钟采样的过程中至少有一半都是属于逻辑0才可认定接收到的是起始位。由于内部采样时钟bclk周期(由波特率发生器产生)是发送或接收波特率时钟频率的16倍,所以起始位需要至少8个连续bclk周期的逻辑0被接收到,才认为起始位接收到,接着数据位和奇偶校验位将每隔16个bclk周期被采样一次(即每一个波特率时钟被采样一次)。3如果起始位是16个bclk周期长,那么接下来的数据将在每个位的中点处被采样。4UART发送器是完成并串转换,UART接收器是完成串并转换。五结论1串行通信的设计中,波特率的分频因子可以根据不同的需要而更改。2设计中没有加入校验位,只要改变UART发送器中的Generic参数FrameLen即可以加入校验位。谢谢!