通用异步收发器UART设计.doc_第1页
通用异步收发器UART设计.doc_第2页
通用异步收发器UART设计.doc_第3页
通用异步收发器UART设计.doc_第4页
通用异步收发器UART设计.doc_第5页
已阅读5页,还剩9页未读 继续免费阅读

下载本文档

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

文档简介

通用异步收发器UART设计 现代电子系统设计一、实验原理:通用异步收发器是一种广泛应用的短距离串行传输接口。常用于短距离,低速,低成本的微机与下位机的通讯中,基本的UART连接通信图如下:RXD 设备二TXDGNDTXD设备一 TXDRXDGNDTXD UART只需两条信号线(RXD,TXD)和一条地线就可以完成全双工传输。由于UART是异步通讯,所以需要对数据进行同步,UART传输一个数据帧的内容如下:UART发送部分的用途是将准备输出的并行数据,按照基本帧格式,转为TXD信号串行输出,这里串行话的时钟信号只要使用对应要求的波特率的本地时钟即可。UART接收部分RXD接收串行信号并将其转化为并行数据,但串并转化的时钟显然同发送器一样处理,收发设备的时钟误差是会累计的,会导致接收数据不正确,这就需要用一个远远高于波特率的本地时钟信号对输入RXD不断取样,以不断让接收器和发送器保持同步,在设计中采用只有波特率时钟周期的1/16的时钟,需要用一个波特率发生器专门产生,因此本设计包含波特率发生器、UART接收器和发送器3个子模块和一个总模块。波特率发生器波特率发生器实际就是一个简单的分频器,可以根据给定的系统时钟频率(晶振时钟)和要求的波特率算出波特率分频因子。已算出的波特率因子作为分频器的分频数。波特率发生器产生的时钟频率不是波特率时钟频率,而是波特率时钟频率的16倍,目的是为在接收时进行精确地采样,以提出异步的串行数据。接收器内部采样时钟blck(波特率发生器产生)是发生或接收波特率时钟频率的16倍。所以需要至少8个连续blck周期的逻辑0被接收到,才认为起始位接收到,接着数据位将每隔16个blck周期被采样一次(即每一个波特率时钟采样一次),如果起始位的确是16个blck周期长,那么接下来的数据将在每个位的中点被采样。 收发器状态图如下: r_tart r_enterr_wart r_sampr_stop r_start:等待起始位。当UART接收器复位后,接收状态机将处于这一状态,在此状态,状态机一直等待RXD的电平跳变,从1变到0,即起始位,这意味着新的一帧UART的开始,一旦起始位被确定,状态将转入r_center 状态。r_center: 求中点。在本状态,就是由起始位求出每位中点,通过对bclk的个数进行计数(rcnt16)计数值不是理想的“1000” ,要经过一个状态,即经过一个bclk周期,所希望的是的到的是采样时的1/2位,另外,对于偶然出现的干扰脉冲,由于其周期很短,所以可以认为当保持逻辑0超过1/4个位时间的信号一定是起始位。r_wait: 等待采样。处于这一状态时,等待计满15个bclk,在第16个bclk是进入r_sample状态进行数据的采样检测,同时也判断是否采集的数据长度已达到数据帧的长度(Framelen),如果达到,说明停止位来临了。本设计中,Frample默认为8,即对应得UART工作在8位数据位,无校验位。r_sample: 数据位采样检测,完成后无条件转入r_wait状态,等待下次数据位的到来。r_stop: 无论停止位是1位还是1.5位,或是2位,状态机载r_stop状态下不具体检测RXD,只是输出帧接收完毕信号(rec_done=1)停止位后状态机转回到r_start状态,等待下一帧的起始位。发送器发送器状态转化图如下:x_Idlee x_startx_waitx_shiftx_stopx_Idle: 空闲状态。当UART被reset复位后,进入这一状态,在此状态中,UART的发送器一直在等待一个数据帧发送命令xmit_cmd。Xmit_cmd_p信号是对xmit_cmd的处理,xmit_cmd_p是一个短脉冲信号。当xmit_cmd_p=1时,进入x_start,准备发送起始位。x_start: 起始位。在此状态下,UART的发送器一个时间宽度的逻辑0信号至TXD,即起始位,紧接着状态机进入x_wait状态,xcnt16时bclk的计数器。x_wait:移位等待。 接收x_wait类似。x_shift: 移位状态。实现待发数据的并串转换。x_stop:停止位。 数据帧发送完毕,转入该状态,并发送16个bclk周期的逻辑1信号,即1位停止位,发送完停止位后回到x_Idle状态,并等待另外一个数据帧的发送命令。总模块 其实相当于UART的外部线路接口,就是成品的引脚图,它的接口一部份连接着其它模块,另一部份连接外部通信设备,其程序就是一些接口间数据的传送和接收。以下是对UART总模块中涉及的外部接口的简要说明。时钟信号clk(输入):UART的系统时钟。复位信号rest(输入)):UART系统总复位。16倍时钟bclk(输出):16倍于波特率时钟。UART发送txd(输出):UART异步串行发送端。发送缓冲xbuf(输入):带发送数据输入。发送命令xmit_cmd(输入):启动发送器发送一个UART帧。发送完成xmit_done(输出):UART帧发送完成,等待新的发送命令。UART接收rxd(输入):UART异步串行接收端。接收缓冲rbuf(输出):接收数据缓冲,在下一个帧数据接收完毕时,数据缓冲rbuf会被更新,需要在此之前取走数据。接收准备rec_ready(输出):接收协调信号,接收完毕后的下一帧接收准备好信号,在rec_ready有效时,rbuf已被更新。二、实验原程序:整体分四个模块,一个顶层模块,三个子模块顶层模块:uart A.:uart/uart.vmodule uart(clk,bclk,reset,rxd,txd,xmit_cmd,xmit_done,rec_ready,xbuf,rbuf);input clk;input reset;input rxd;input xmit_cmd;input 7:0 xbuf;output bclk;output txd;output xmit_done;output rec_ready;output 7:0 rbuf;wire bclk16;baud baud(.clk(clk),.reset(reset),.bclk(bclk),.bclk16(bclk16);u_rec u_rec(.bclk16(bclk16),.reset(reset),.rxd(rxd),.rec_ready(rec_ready),.rbuf(rbuf);u_xmit u_xmit(.bclk(bclk),.reset(reset),.txd(txd),.xmit_cmd(xmit_cmd),.xbuf(xbuf),.xmit_done(xmit_done);endmoduleB./波特率发生子模块:baud/baud.vmodule baud(clk,reset,bclk,bclk16);input clk;input reset;output bclk; /波特率时钟,给发送模块output bclk16; /16倍波特率时钟,给接收模块reg bclk;reg bclk16;reg 7:0 div_16baud;reg 3:0 div_baud;/parameter XTAL=12000000; /(83ns)/parameter BAUD=9600;parameter div_clk=36; /时钟的分频系数=XTAL/(BAUD*16*2)always (negedge clk or negedge reset)beginif(!reset)begindiv_16baud=8d0;bclk16=1b0;bclk=1b0;div_baud=4d1;endelseif(div_16baud=div_clk)begindiv_16baud=8d0;div_baud=div_baud+4d1;bclk16=bclk16;if(div_baud=4d15)begindiv_baud=4d0;bclk=bclk;endendelsediv_16baud=div_16baud+8d1;endendmoduleC./接收子模块:u_rec/u_rec.vmodule u_rec (bclk16,reset,rxd,rec_ready,rbuf);input bclk16;input reset;input rxd;output rec_ready;output 7:0 rbuf;reg rxd_sync; /接收端同步信号reg Shift; /右移使能信号reg 7:0 rbuf; /接收数据缓冲器reg 7:0 rec_shftreg; /接收数据移位寄存器reg 3:0 samplecnt;/采样间隔判断计数器reg center; /采样间隔判断计数器使能信号reg 4:0 datacnt;/数据位长度判断计数器reg datawait; /数据位长度判断计数器使能信号reg 4:0 state; /当前状态位reg rec_ready; /数据接收完毕信号(等待接受信号) 3parameter Framelen=4d8;/数据位长度/状态机状态编码,使用独热码parameter r_Start =5b00001;parameter r_Center=5b00010;parameter r_Wait =5b00100;parameter r_Sample=5b01000;parameter r_Stop =5b10000;/同步信号always (posedge bclk16 or negedge reset)if (!reset)rxd_sync=1d1;elserxd_sync=rxd;/右移寄存器always (posedge bclk16 or negedge reset)if (!reset)beginrec_shftreg=8d0;rbuf=8d0;endelseif(Shift)beginrec_shftreg6:0=rec_shftreg7:1;rec_shftreg7=rxd_sync;endelse rbuf=rec_shftreg;/采样间隔判断计数器always (posedge bclk16 or negedge reset)if (!reset)samplecnt=4d0;elseif(center)samplecnt=samplecnt+4d1;elsesamplecnt=4d0;/*状态机*always (posedge bclk16 or negedge reset)beginif (!reset)beginstate=r_Start;Shift=1b0;center=1b0;datawait=1b0;datacnt=4d0;endelsecase (state)r_Start:beginif(!rxd_sync)state=r_Center;elsebeginstate=r_Start;rec_ready=1b0;endendr_Center:beginif(samplecnt=2h3)begincenter=1b0;if(!rxd_sync)state=r_Wait;elsestate=r_Start;endelsebeginstate=r_Center;center=1b1;endendr_Wait:beginShift=1b0;if(samplecnt=4d13)begincenter=1b0;if(datacnt=Framelen)state=r_Stop;elsebeginstate=r_Sample;datacnt=datacnt+4d1;endendelsebeginstate=r_Wait;center=1b1;endendr_Sample:beginstate=r_Wait;Shift=1b1;datawait=1b0;endr_Stop:beginstate=r_Start;rec_ready=1b1;datacnt=3d0;enddefault:beginrxd_sync=1b1;Shift=1b0;rec_shftreg=8d0;samplecnt=4d0;center=1b0;datacnt=3d0;datawait=1b0;state=r_Start;rec_ready=1b1;endendcaseendendmoduleD./发送子模块:u_ xmit/u_xmit.vmodule u_xmit(bclk,reset,txd,xmit_cmd,xbuf,xmit_done);input bclk;input reset;input xmit_cmd;input 7:0 xbuf;output txd;output xmit_done;reg xmit_cmd_p; /发送命令脉冲reg flag; /发送命令判断标志位reg txd;reg 7:0 xmit_shftreg; /接收数据移位寄存器reg Shift; /右移使能信号reg 2:0 datacnt;/数据位长度判断计数器reg datawait; /数据位长度判断计数器使能信号reg xmit_done;/发送完毕信号reg 4:0 state; /当前状态位reg start; /起始位标志parameter Framelen=3d7; /数据位长度/状态机状态编码,使用独热码parameter x_Idle =5b00001;parameter x_Start=5b00010;parameter x_Wait =5b00100;parameter x_Shift=5b01000;parameter x_Stop =5b10000;/发送命令脉冲发生器always (posedge bclk or negedge reset)if(!reset)beginxmit_cmd_p=1b0;flag=1b0;endelse if(xmit_cmd&(!flag)beginflag=1b1;xmit_cmd_p=1b1;endelse if(!xmit_cmd)beginflag=1b0;xmit_cmd_p=1b0;endelse xmit_cmd_p=1b0;/右移寄存器always (posedge bclk or negedge reset)if(!reset)beginxmit_shftreg=8d0;txd=1b1;endelse if(Shift)begintxd=xmit_shftreg0;xmit_shftreg6:0=xmit_shftreg7:1;xmit_shftreg7=1b1;endelse if(start)begintxd=1b0;xmit_shftreg=xbuf;endelsebeginxmit_shftreg=xbuf;txd=1b1;end/数据位长度判断计数器always (posedge bclk or negedge reset)if (!reset)datacnt=3d0;elseif(datawait)datacnt=datacnt+3d1;elsedatacnt=3d0;/*状态机*always (posedge bclk or negedge reset)beginif (!reset)beginstate=x_Idle;Shift=1b0;datawait=1b0;start=1b0;endelsecase (state)x_Idle:beginif(xmit_cmd_p)state=x_Start;elsebeginstate=x_Idle;xmit_done=1b1;endendx_Start:beginstart=1b1;xmit_done=1b0;state=x_Wait;endx_Wait:beginstart=1b0;if(datacnt=Framelen)beginstate=x_Stop;datawait=1b0;Shift=1b0;endelsebeginstate=x

温馨提示

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

评论

0/150

提交评论