通用异步收发器UART设计.doc

上传人:美****子 文档编号:58051920 上传时间:2022-11-06 格式:DOC 页数:15 大小:911.50KB
返回 下载 相关 举报
通用异步收发器UART设计.doc_第1页
第1页 / 共15页
通用异步收发器UART设计.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《通用异步收发器UART设计.doc》由会员分享,可在线阅读,更多相关《通用异步收发器UART设计.doc(15页珍藏版)》请在得力文库 - 分享文档赚钱的网站上搜索。

1、通用异步收发器UART设计 现代电子系统设计一、实验原理:通用异步收发器是一种广泛应用的短距离串行传输接口。常用于短距离,低速,低本钱的微机与下位机的通讯中,根本的UART连接通信图如下:RXD 设备二TXDGNDTXD设备一 TXDRXDGNDTXD UART只需两条信号线RXD,TXD与一条地线就可以完成全双工传输。由于UART是异步通讯,所以需要对数据进展同步,UART传输一个数据帧的内容如下:UART发送局部的用途是将准备输出的并行数据,按照根本帧格式,转为TXD信号串行输出,这里串行话的时钟信号只要使用对应要求的波特率的本地时钟即可。UART接收局部RXD接收串行信号并将其转化为并行

2、数据,但串并转化的时钟显然同发送器一样处理,收发设备的时钟误差是会累计的,会导致接收数据不正确,这就需要用一个远远高于波特率的本地时钟信号对输入RXD不断取样,以不断让接收器与发送器保持同步,在设计中采用只有波特率时钟周期的1/16的时钟,需要用一个波特率发生器专门产生,因此本设计包含波特率发生器、UART接收器与发送器3个子模块与一个总模块。波特率发生器波特率发生器实际就是一个简单的分频器,可以根据给定的系统时钟频率晶振时钟与要求的波特率算出波特率分频因子。已算出的波特率因子作为分频器的分频数。波特率发生器产生的时钟频率不是波特率时钟频率,而是波特率时钟频率的16倍,目的是为在接收时进展准确

3、地采样,以提出异步的串行数据。接收器内部采样时钟blck波特率发生器产生是发生或接收波特率时钟频率的16倍。所以需要至少8个连续blck周期的逻辑0被接收到,才认为起始位接收到,接着数据位将每隔16个blck周期被采样一次即每一个波特率时钟采样一次,如果起始位确实是16个blck周期长,那么接下来的数据将在每个位的中点被采样。 收发器状态图如下:r_tart r_enterr_wart r_sampr_stopr_start:等待起始位。当UART接收器复位后,接收状态机将处于这一状态,在此状态,状态机一直等待RXD的电平跳变,从1变到0,即起始位,这意味着新的一帧UART的开场,一旦起始位被

4、确定,状态将转入r_center 状态。r_center: 求中点。在本状态,就是由起始位求出每位中点,通过对bclk的个数进展计数rcnt16计数值不是理想的“1000” ,要经过一个状态,即经过一个bclk周期,所希望的是的到的是采样时的1/2位,另外,对于偶然出现的干扰脉冲,由于其周期很短,所以可以认为当保持逻辑0超过1/4个位时间的信号一定是起始位。r_wait: 等待采样。处于这一状态时,等待计满15个bclk,在第16个bclk是进入r_sample状态进展数据的采样检测,同时也判断是否采集的数据长度已到达数据帧的长度Framelen,如果到达,说明停顿位降临了。本设计中,Fram

5、ple默认为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。Xmi

6、t_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状态,并等待另外一个数据帧的发送命令。总模块 其实相

7、当于UART的外部线路接口,就是成品的引脚图,它的接口一部份连接着其它模块,另一部份连接外部通信设备,其程序就是一些接口间数据的传送与接收。以下是对UART总模块中涉及的外部接口的简要说明。时钟信号clk输入:UART的系统时钟。复位信号rest(输入):UART系统总复位。16倍时钟bclk输出:16倍于波特率时钟。UART发送txd输出:UART异步串行发送端。发送缓冲xbuf输入:带发送数据输入。发送命令xmit_cmd输入:启动发送器发送一个UART帧。发送完成xmit_done输出:UART帧发送完成,等待新的发送命令。UART接收rxd输入:UART异步串行接收端。接收缓冲rbuf

8、输出:接收数据缓冲,在下一个帧数据接收完毕时,数据缓冲rbuf会被更新,需要在此之前取走数据。接收准备rec_ready输出:接收协调信号,接收完毕后的下一帧接收准备好信号,在rec_ready有效时,rbuf已被更新。二、实验原程序:整体分四个模块,一个顶层模块,三个子模块顶层模块:uart 第 15 页A.:uartmodule 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;ou

9、tput 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)

10、,.xbuf(xbuf),.xmit_done(xmit_done);endmoduleB./波特率发生子模块:baudmodule 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=

11、36; /时钟的分频系数=XTAL/BAUD*16*2always (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;en

12、dendmoduleC./接收子模块:u_recmodule 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 datacn

13、t;/数据位长度判断计数器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 o

14、r 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 (!res

15、et)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;end

16、endr_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;c

17、enter=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_ xmitmodule u

18、_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;/发

19、送完毕信号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=

20、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_shftre

21、g7=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;Sh

22、ift=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_Shift;Shift=

23、1b1;datawait=1b1;endendx_Shift:beginShift=1b1;state=x_Wait;endx_Stop:beginxmit_done=1b1;state=x_Idle;enddefault:beginShift=1b0;datacnt=3d0;datawait=1b0;state=x_Idle;xmit_done=1b1;end endcaseendendmodule三、实验UART的部件图: 、系统级电路 、波特率发生器模块级电路 、接收模块级电路 、接收模块状态机图 、发送局部状态机图四、仿真波形:五、锁定管脚:六、下载:七、验证实验:结果良好,只是速度感

24、觉不是瞬时传送完毕的。八、体会:经过这次实习,感觉收集与整理资料是最麻烦的,它根本上占了整个实习阶段的三分之二左右的时间。因为在这个过程中,不仅要对资料进展必要检索,还要进展学习。收集完之后,还要对这些资料做最后的整理,使这些资料变成自己想要的东西。而就算你已经学会了这些知识,要应用到实验箱上来也不是一件容易的事。通过这次实习,根本了解到传统的数字电子系统或IC设计中,手工设计的比例占了很大的局部,而手工设计有很多的缺点:复杂电路的设计、调试十分的困难;由于无法进展硬件系统功能仿真,如果某一过程出现错误,查找与修改十分不便;设计过程中产生大量的文档,不便于管理;对于IC设计而言,设计实现过程与具体生产工艺相关,因此可移植性差;只有在设计出样机或芯片才能进展实测。而EDA技术对数字系统进展行为与功能描述到具体的内部线路构造,从而可以在电子设计的各个阶段、各个层次进展计算机模拟验证,保证设计过程的正确性,可以大大的降低设计本钱、缩短设计周期。

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 应用文书 > 文案大全

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知得利文库网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号-8 |  经营许可证:黑B2-20190332号 |   黑公网安备:91230400333293403D

© 2020-2023 www.deliwenku.com 得利文库. All Rights Reserved 黑龙江转换宝科技有限公司 

黑龙江省互联网违法和不良信息举报
举报电话:0468-3380021 邮箱:hgswwxb@163.com