Login
升级VIP 登录 注册 安全退出
当前位置: 首页 > word文档 > 标准规范 > UART的设计,uart发送器设计

UART的设计,uart发送器设计

收藏

本作品内容为UART的设计,格式为 doc ,大小 5333504 KB ,页数为 24页

UART的设计


('摘要通用串口是远程通信接口,在数字系统使用很普遍,是一个很重要的部件。本论文使用VerilogHDL语言描述硬件功能,利用QuartusII5.0在FPGA芯片上的综合描述,采用模块化设计方法设计UART(通用异步收发器)的各个模块。其中包括波特发生器,程序控制器,UART数据接收器和UART数据发送器,本文采用的外部时钟为48MHZ,波特率为9600。在QuartusII5.0和Modelsim6.0环境下进行设计、编译和仿真。最后的程序编译仿真表明系统数据完全正确。关键词:VerilogHDL,UART,帧格式,FPGA;IAbstractInthispaper,theuseofhardwaredescriptionlanguagesVerilogVHDLfunction,theuseofAltera\'sFPGAchips,thedesignofmodulardesignmethodofUART(UniversalAsynchronousReceiverTransmitter)ofeachmodule,includingPorter,generators,processcontrollers,UARTreceiverdataandtheUARTtransmitterdata.QuartusII5.0andModelsim6.0inenvironmentdesign,compilation,simulationanddownloading.Finally,simulationresultsshowthattheproceduresforcompilingdataentirelycorrect.Keywords:VerilogHDL,UART,frameformat,FPGAII目录1绪论.............................................................................................................................................11.1UART通信理论基础.............................................................................................................................11.2UART模块介绍.....................................................................................................................................22UART相关理论与技术..............................................................................................................42.1复杂可编程逻辑器件FPGA简介.........................................................................................................42.2RS-232介绍...........................................................................................................................................42.3硬件结构设计........................................................................................................................................42.4软件设计................................................................................................................................................43UART设计..................................................................................................................................63.1UART的整体设计.................................................................................................................................63.2UART的实现.........................................................................................................................................73.3波特率发生器模块的实现....................................................................................................................73.4接收模块的实现....................................................................................................................................93.5发送模块的实现.................................................................................................................................113.6UART各子模块的整合.....................................................................................................................13参考文献.......................................................................................................................................16III1绪论UART是一个并行输入变为串行输出的芯片.在微机所连接的的设备中,既有并行设备,也有串行设备,因此,接口也相应的分为并行接口和串行接口。而CPU只能接受和发送并行数据,那么对于只能接受和发送串行数据的外设通信,就需要在CPU和外部设备之间有一个将CPU发送的并行数据转化为串行数据以发送给外部设备和将接收到外部设备发送来的串行数据转换为并行数据送给CPU的接口,这种接口主要起到并行和串行间的格式转换功能,也就是串行接口。本论文所进行研究设计的通用异步通讯接收发送器UART就是一种常用的串行接口。1.1UART通信理论基础串行通信是指外部设备和计算机间使用一根数据线进行数据传输的方式。数据在一根数据线上一位一位传输,每一位数据都占据一个固定的时间长度。与并行通信方式相比,串行通信方式的传输速度较慢,但这种通信方式使用的数据线少,在远距离通信中可以节约通信成本,因此得到了广泛的应用。1串行异步通讯数据格式基本的UART只需要发送和接收两条数据线就可以完成数据的全部通信,其基本功能是在发送端将控制器通过总线传过来的并行数据,以设定的格式,设定的频率串行地传输出去,并同时在接收端将串行接收到的数据,转换成相应的并行数据发送出去。UART的基本帧格式如图1所示。其中,起始位总是逻辑0状态,停止位总是逻辑l状态,其持续时间可选为1位、1.5位或2位,其数据位可为5、6、7、8位,校验位可根据需要选择奇校验位,偶校验位或无校验位。图1UART数据帧格式2起始位和停止位作用起始位是作为同步信号而附加进来的,当它变为低电平时,告诉接收方传送开始,1准备接收数据位。而停止位为高电平,标志一个字符的结束。这样就为通信双方提供了何时开始收发,何时结束的标志。3发送和接收时钟在UART通信协议中,发送模块和接收模块不使用共同的时钟信号,也就是在串行通信中发送数据的同时不会把时钟信号从一个UART接口送到另一个UART接口。两者的时钟频率可以在一定的误差范围内近似相等,为了使接收方能够进行同步监测,接收器采用比波特率更高频率的时钟来提高定位采样的分辨能力和抗干扰能力。4奇偶检验它的基本原理是在传输的有效数据中附加一个检验位,利用这个校验位的存在,使得数据信息位(包括有效数据位和检验位)中1的个数为偶数或者奇数。如果整个信息位1的个数为偶数的话称为偶检验,为奇数的话则称为为奇检验。1.2UART模块介绍UART主要用来实现串行和并行数据流间的变换:从CPU接收并行数据,转换成串行数据输出,或者是,从串口读入外部数据,将其转换为并行数据,送往CPU。我们将UART系统按功能进行模块划分,结构如图2。顶层模块划分包括:发送模块、接收模块、波特率发生器模块、Modem控制模块。其中发送模块包括发送器和发送FIFO,接收模块包括接收器和接收FIFO。图2UART功能模块1.波特率发生器:用来提供UART通信时所需要的时钟,可以对主时钟进行任意数分频。2.发送器:主要由发送移位寄存器以及发送控制逻辑等组成。主要功能是将发送FIFO发过来的并行数据转换成串行数据,并送往外设。23.接收器:主要由接收移位接收寄存器和接收控制逻辑构成。接收器将外部串行数据转换成并行数据,发送给接收FIFO。4.同步FIFO模块:包括接收FIFO和发送FIFO,分别用来缓存UART接收到的数据或者缓存CPU待发送的数据。5.Modem模块:由Modem控制寄存器(MCR)、Modem状态寄存器(MSR)组成。主要通过UART完成计算机与Modem之间的通信功能。6.接口模块:UART与外界通信的接口模块。处理器通过它对UART进行控制,对各个控制器写入控制字和需要发送的数据,以及从寄存器读出各个模块的状态和接收到的数据。32UART相关理论与技术2.1复杂可编程逻辑器件FPGA简介FPGA(Field-ProgrammableGateArray),即现场可编程门阵列,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它是作为专用集成电路(ASIC)领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。FPGA采用了逻辑单元阵列LCA(LogicCellArray)这样一个概念,内部包括可配置逻辑模块CLB(ConfigurableLogicBlock)、输出输入模块IOB(InputOutputBlock)和内部连线(Interconnect)三个部分。2.2RS-232介绍RS232接口,就是普通电脑后面那个串口。一般为9针的,也有25针的。是1970年由美国电子工业协会(EIA)联合贝尔系统、调制解调器厂家及计算机终端生产厂家共同制定的用于串行通讯的标准。它的全名是“数据终端设备(DTE)和数据通讯设备(DCE)之间串行二进制数据交换接口技术标准”(RS-232C,其中C表示此标准修改了三次).标准中包括了电气和机械方面的规定.该标准规定采用一个25个脚的DB25连接器,对连接器的每个引脚的信号内容加以规定,还对各种信号的电平加以规定.后来随着设备的不断改进,成了目前大家普遍见到的9脚。在不使用传输控制信号的情况下,用3根线就可以传输了,9芯的是2收3发5地,25芯的是2发3收7地。两设备用RS232相连的时候为收——发,发——收,地——地。2.3硬件结构设计UART处理的是并行数据转为串行信号和串行数据转为并行,但并不是简单的转换。分析UART的结构,可以看出UART主要由数据总线接口、控制逻辑接口、波特率发生器、发送逻辑和结束逻辑等部分组成,各部分间的关系如图1所示。42.4软件设计软件采用Altera公司的MAX+PLUSⅡ设计逻辑结构,设计的内容包括通用I/O地址译码器、各个寄存器以及UART核。UART核主要包括3个部分:波特率发生器、数据发送部分和数据接收部分。I/O地址译码器和UART核使用硬件描述语言VHDL来编写实现。图1UART通信接口结构图53UART设计3.1UART的整体设计一般UART通信通过两条信号线完成数据的全双工通信任务。其中,TxD是UART发送端,为输出;RxD是UART接收端,为输入。波特率发生器、接收器和发送器是UART的三个核心功能模块。我们所做的设计主要为数据接收模块。如图1所示的即为接收器的硬件连接示意图,数据从计算机的串口TxD端传送给FPGA的RxD端,最后由LED显示出数据。我们采用状态机的方式来实现串口通讯功能,用一个接收状态寄存器state_rec来表示当前状态。空闲时state_rec=0,此时不断监测接收端口的电平,如果低电平连续保持两个时隙,则转向接受数据状态,state_rec的值从1-8跳转,接受8bit数据。如果低电平没有保持两个时隙,则重新回到空闲状态,state_rec=0。当八位数据接收完毕,则跳转到停止状态,state_rec=9,此时无论接收端口电平高低,均在下一个状态周期跳转回空闲状态,准备接受下一位数据。若在较复杂的环境下通讯,则可以考虑增加一个通讯失败状态,若检测到停止位为低电平,或者校验位不满足要求,则跳转到失败状态。UART(UniversalAsynchronousReceiverTransmitter)协议是一种串行数据传输协议。UART允许在串行链路上进行全双工通信,在数据通信及控制系统中得到了广泛的应用。8250、NS16450等芯片都是常见的UART器件,这类芯片具有多种功能,还有许多辅助模块(FIFO),但在实际应用中有时只需要使用UART的部分功能,因而会造成一定的资源浪费。UART的核心功能集成到FPGA/CPLD内部,就可以实现紧凑、稳定且可靠的UART数据传输。基本的UART通信只需要两条信号线(RxD,TxD)就可以完成数据的全双工通信任务。TxD是UART发送端,为输出;RxD是UART接收端,为输入。UART的基本特点是:在信号线上共有两种状态,分别用逻辑1(高电平)和逻辑0(低电平)来区分。例如,在发送器空闲时,数据线保持在逻辑高电平状态,发送器是通过发送起始位来开始一个数据帧的6时钟LED计算机的串口TxDCLKD11~D0FPGARxD图1硬件连接示意图传送,起始位使数据线处于逻辑0状态,提示接收器数据传输即将开始。接着发送数据位,数据位一般为8位一个字节的数据(也有5位、6位或7位的情况),低位(LSB)在前,高位(MSB)在后。然后发送校验位,校验位一般用来判断传输的数据位有无错误,一般是奇偶校验。在使用中,该位常取消。停止位在最后,用以标识数据传送的结束,它对应于逻辑1状态。UART的帧格式包括起始位(startbit,低电平、5~8位数据位(databits)、校验位(paritybit,可选)和停止位(stopbit,位数可为1、1.5、2位)。这种格式是由起始位和停止位来实现字符的同步,如图2所示。图2UART的帧格式3.2UART的实现比较复杂的数字电子系统的设计往往采用自顶向下(Top-Down)的方法,即首先把设计任务划分成几个模块,然后分模块进行设计。本文所介绍的UART串行通讯模块由3个子模块组成:波特率发生器、接收模块和发送模块,如图3所示。所以对UART通讯模块的实现就是对组成UART的三个子模块(即:波特率发生器、接收模块及发送模块)的实现。波特率发生器专门产生一个本地时钟信号来控制UART的接收与发送;UART接收模块的用途是接收RxD端的串行信号,并将其转化为并行数据;UART发送模块的用途是将准备输出的并行数据按照基本UART帧格式转为串行数据从TxD端串行输出。图3UART的三个子模块3.3波特率发生器模块的实现1.波特率发生器模块的实现原理。波特率发生器实际上就是分频器,可以根据给定的系统时钟频率(晶振时钟)和要求的波特率算出波特率分频因子,把算出的波特率分频因子作为分频器的分频系数。假设7系统的时钟频率为10MHz,而要求的波特率为9600bps,因此要设计分频模块,把10MHz的时钟脉冲变为9600Hz的时钟脉冲。故设要求的波特率因子为M,则2.波特率发生器模块实现的流程。波特率发生器模块实现的流程如图4所示。波特率发生器模块实现的源代码。ModuleCNT(CLK,DIV_CLK,reset);inputCLK,reset;//输入信号:时钟信号CLK与复位信号resetreg[10:0]H;//计数器H,用来记录输入时钟信号的跳变数regnum;//寄存器num,用来存放将要输出的电平信号outputDIV_CLK;//输出信号always@(posedgeCLKorposedgereset)beginif(reset)//复位信号到来,进行模块初始化beginH<=0;Num<=0;EndElseif(H==1041)H<=0;Else图4波特率发生器模beginif(H<521)//当计数器的值小于521时,输出为低电平num<=0;else//当计数器的值大于521时,输出为高电平num<=1;H<=H+1;endendassignDIV_CLK=num;endmodule3.波特率发生器模块实现的仿真结果。8波特率发生器模块实现的仿真结果如图5所示图5波特率发生器模块实现的仿真结果3.4接收模块的实现1.接收模块的实现原理UART通讯模块是从RxD端接收数据的,RxD端由逻辑1跳变为逻辑0可视为一个数据帧的开始,所以接收模块首先要判断起始位。当UART接收模块复位后,接收模块一直在等待RxD的电平跳转。当RxD电平从逻辑1变为逻辑0,即当起始位到来,就意味着新的UART数据帧的开始,一旦检测到起始位,就从起始位的下一位开始对UART通讯所要求的波特率时钟DIV_CLK的上升沿,每计一次数就对RxD进行一次采样,把每次采样获得的逻辑电平值按先后顺序存入寄存器Q中,也就是确保接收了所有的数据位,8位串行数据也被转换为8位并行数据。2.接收模块实现的流程。接收模块实现的流程如图6所示3.接收模块实现的源代码。moduleUART(N,CLK_10MHz,Q,reset);inputCLK_10MHz,N,reset;//输入信号:时钟信号CLK_10MHz,输入的串行信号N,复位信号resetoutput[7:0]Q;//输出的并行信号reg[7:0]P;//寄存器P,存放接收到的串行数据值reg[3:0]i;//计数器i,用来记录接收到的数据位的数目rega;//寄存器a,用来判断是否开始接收数据regk;//寄存器k,用来判断模块是否完成数据接收CNTCNT(CLK_10MHz,CLK_9600Hz,reset);//分频器进行分频always@(posedgeCLK_9600Hzorposedgereset)Beginif(reset)i<=0;9a<=1;endif(N==0&&a==1)a<=0;if(a==0)beginif(i<8&&k==1)beginP[i]<=N;i<=i+1;endelsek<=0;end图6接收模块实现的流程图assignQ=P;endmodule4.接收模块实现的仿真结果。5.接收模块实现的仿真结果如图7所示。图7接收模块实现的仿真结果图接收时的输入信号为N,其输入的位序列为00110110001,此序列中已包含了起始位0、校验位0和停止位1。接收到的数据位存放到寄存器[7:0]Q中,可以看到图中Q为接收到的数据位,此数据由高位到低位依次为00110110,正是UART帧中的数据位部分。3.5发送模块的实现1.发送模块的实现原理。发送模块实现的功能是将要发送的8位并行数据变为串行数据,同时在数据头部加起10始位,在数据位尾部加奇偶校验位和停止位。即当UART发送模块被复位信号复位以后,发送模块将立刻进入准备发送状态,在该状态下读8位并行数据到寄存器[7:0]NSend中,之后输出逻辑0作为起始位,从起始位的下一位开始对UART串行通讯所要求的波特率时钟DIV_CLK的上升沿计数,每计一次数从寄存器[7:0]NSend中按照由低位到高位的顺序取出一位数据送到TxD端,当计数为8时,也就是确保发送了所有的数据位,同时也将8位并行数据转换为8位串行数据。根据8位数据位中逻辑1的个数确定校验位,然后输出校验位,最后输出逻辑1作为停止位。2.发送模块实现的流程。发送模块实现的流程如图8所示。3.发送模块实现的源代码。moduleUART(CLK_10MHz,NSend,QSend,resetSend);input[7:0]NSend;//输入的并行信号inputresetSend;//复位信号outputQSend;//输出的串行信号regack;//寄存器ack,用来判断发送模块是否已经复位regstartBit;//寄存器startBit,用来判断数据起始位是否已经发送reg[3:0]iSend;//计数器iSend,用来记录已经发送的数据位的数目regtt;//寄存器tt,用来存放待发送的数据位regcheck;//寄存器check,用来存放将要发送的数据校验位CNTCNT(CLK_10MHz,CLK_9600Hz,resetSend);//分频器进行分频always@(posedgeCLK_9600HzorposedgeresetSend)beginif(resetSend)//如果复位信号到来,则进行模块初始化beginack<=1;startBit<=0;endelsebeginif(ack==1)beginif(startBit==0)11begintt<=0;startBit<=1;iSend<=0;check<=0;endelsebegin图8发送模块实现的流程图if(startBit==1&&iSend<8)beginif(NSend[iSend]==1)//校验位的计算check<=check^INSend[iSend];tt<=NSend[iSend];iSend<=iSend+1;//发送一位数据,则计数器加1endElseif(iSend==8)//如果数据位发送完毕,则发送校验位begintt<=check;iSend<=iSend+1;endelsett<=1;//发送停止位endassignQSend=tt;4.发送模块实现的仿真结果。发送模块实现的仿真结果如图9所示。图9发送模块实现的仿真结果图准备发送的数据由高位到低位依次为00110110,QSend为数据发送端,可以看到发送的12串行位序列为00110110001,符合UART帧格式的要求。3.6UART各子模块的整合1.各子模块的整合原理。在各模块功能实现的基础上,把它们有机地整合在一起,使波特率发生器能够按照UART通讯的要求正常工作,接收模块和发送模块能够根据各自的复位信号使整合模块具有发送或接收功能。2.各子模块的整合流程。各子模块的整合流程如图10所示。各子模块的整合仿真结果如图11所示。图10各子模块的整合流程图图11各子模块的整合仿真图仿真是以接收和发送“6”为例的。图10中N信号为接收时的输入信号,接收完成后数据存放到寄存器[7:0]Q中,可以看到Q中存放的8位数据是00110110,正是“6”的ASCII码。NSend寄存器中存放的是发送时待发送的数据,数据的值为00110110,即“6”的ASCII码,QSend为发送输出信号,可以看发送出去的串行数据依次为00110110001,其中已经包含了起始位0,校验位0和停止位1。实验结果:1、引脚锁定:132、用quartusп仿真波形如下:图11接收模块的时序仿真图:当发送aabbcc时接收到aabbcc,对应的开发板上的8个LED灯只有4个亮(101010)。143.主要问题及措施问题1:在仿真过程中经常遇到一些寄存器没有被初始化,导致仿真结果不正确,这是因为if语句嵌套太复杂或循环语句使用不恰当使得寄存器初始化语句未能执行。措施:尽量减少if语句的嵌套层数,这样可以减少阅读程序的复杂度和程序调试的复杂度,能够更容易发现错误以便及时寻找到解决方案。问题2:在程序中使用initial过程块进行寄存器的初始化,会使源程序在下载到目标板的整合过程时不能通过。措施:可以外接一个输入信号进行各寄存器的初始化,这样做既可以使源程序顺利下载到目标板中,又可以从通讯模块的外部对通讯模块进行控制。问题3:在程序中如果在两个always过程块中对同一个变量进行赋值,程序将不能下载到目标板中,因为当两个always过程块中的敏感事件列表中的事件同时满足时,就会引发在两个always语句中对相同变量同时赋值而导致冲突。措施:合并always语句块,即把引发同一变量改变的过程敏感事件用or连接起来放在一个always语句块中。参考文献[1]夏宇闻.Verilog数字系统设计教程[M].北京:北京航空航天大学出版社,2003[2]BhaskerJ.VerilogHDLSynthesisAPracticalprimer[M].London,UK:StarGalaxy;1998.[3]LiakotAli,RoslinaSidek,IshakAris,AlauddinMohd.Ali,BambangSunaryoSuparjo.Designofamicro-UARTforSoCapplication[J].In:ComputersandElectricalEngineering30(2004)257–268.[4]WilfriedElmenreich,MartinDelvaio"Time-TriggeredCommunicationwithUARTS"[J]4thIEEEInternationalWorkshoponFactoryCommunicationSystems,Vasteras,Sweden,August28-30,2002.[5]MartinS.Michael,"AComparisonoftheINS8250,NS16450anNS16550AFSeriesofUARTs"[J]NationalSeiniconductorApplicationNote493,April1989.[6]潘松,王国栋.VHDL实用教程「M].成都:电子科技大学出版社,2003.15[7]赵尔宁,邵高平.用内建自测试(BIST)方法测试IP核阴.微计算机信息,2005,4:134-135.[8]1K杰,杨建宁.基于FPGA的UART控制器的设计和实现[J].微计算机信息,2005,8-2:111-11316附件:UART的RTL级图总程序:171、波特率发生器模块实现的源代码。ModuleCNT(CLK,DIV_CLK,reset);inputCLK,reset;//输入信号:时钟信号CLK与复位信号resetreg[10:0]H;//计数器H,用来记录输入时钟信号的跳变数regnum;//寄存器num,用来存放将要输出的电平信号outputDIV_CLK;//输出信号always@(posedgeCLKorposedgereset)beginif(reset)//复位信号到来,进行模块初始化beginH<=0;Num<=0;endelseif(H==1041)//当计数器计数值为1041时,计数器清0,准备进行新一次的计数H<=0;elsebeginif(H<521)//当计数器的值小于521时,输出为低电平num<=0;else//当计数器的值大于521时,输出为高电平num<=1;H<=H+1;endendassignDIV_CLK=num;Endmodule2、.接收模块实现的源代码。moduleUART(N,CLK_10MHz,Q,reset);inputCLK_10MHz,N,reset;//输入信号:时钟信号CLK_10MHz,输入的串行信号N,复位信号resetoutput[7:0]Q;//输出的并行信号18reg[7:0]P;//寄存器P,存放接收到的串行数据值reg[3:0]i;//计数器i,用来记录接收到的数据位的数目rega;//寄存器a,用来判断是否开始接收数据regk;//寄存器k,用来判断模块是否完成数据接收CNTCNT(CLK_10MHz,CLK_9600Hz,reset);//分频器进行分频always@(posedgeCLK_9600Hzorposedgereset)Beginif(reset)//如果复位信号到来,则进行模块初始化i<=0;a<=1;endif(N==0&&a==1)//如果数据起始位到来,则准备接收数据a<=0;if(a==0)//如果接收控制寄存器a表明可以接收数据,则开始接收数据beginif(i<8&&k==1)//如果接收到的数据位小于8位,则继续进行接收beginP[i]<=N;i<=i+1;//接收一位数据,则计数器加1endelse//如果接收到的数据位大于8位,则停止接收数据k<=0;endendassignQ=P;Endmodule3.发送模块实现的源代码。moduleUART(CLK_10MHz,NSend,QSend,resetSend);input[7:0]NSend;//输入的并行信号inputresetSend;//复位信号outputQSend;//输出的串行信号regack;//寄存器ack,用来判断发送模块是否已经复位regstartBit;//寄存器startBit,用来判断数据起始位是否已经发送19reg[3:0]iSend;//计数器iSend,用来记录已经发送的数据位的数目regtt;//寄存器tt,用来存放待发送的数据位regcheck;//寄存器check,用来存放将要发送的数据校验位CNTCNT(CLK_10MHz,CLK_9600Hz,resetSend);//分频器进行分频always@(posedgeCLK_9600HzorposedgeresetSend)beginif(resetSend)//如果复位信号到来,则进行模块初始化beginack<=1;startBit<=0;endelsebeginif(ack==1)//如果模块初始化完毕,则准备发送数据beginif(startBit==0)//如果没有发送起始位,则发送起始位begintt<=0;startBit<=1;iSend<=0;check<=0;endelsebeginif(startBit==1&&iSend<8)//如果起始位已经发送,则开始发送数据位beginif(NSend[iSend]==1)//校验位的计算check<=check^INSend[iSend];tt<=NSend[iSend];iSend<=iSend+1;//发送一位数据,则计数器加1endelseif(iSend==8)//如果数据位发送完毕,则发送校验位20begintt<=check;iSend<=iSend+1;endelsett<=1;//发送停止位endendendendassignQSend=tt;endmodule21',)


  • 编号:1700877763
  • 分类:标准规范
  • 软件: wps,office word
  • 大小:24页
  • 格式:docx
  • 风格:商务
  • PPT页数:5333504 KB
  • 标签:

广告位推荐

相关标准规范更多>