通用异步收发器UART设计

上传人:无*** 文档编号:199352245 上传时间:2023-04-10 格式:PDF 页数:10 大小:212.59KB
返回 下载 相关 举报
通用异步收发器UART设计_第1页
第1页 / 共10页
通用异步收发器UART设计_第2页
第2页 / 共10页
通用异步收发器UART设计_第3页
第3页 / 共10页
亲,该文档总共10页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.1文档来源为:从网络收集整理.word 版本可编辑.通用异步收发器UART 设计现代电子系统设计一、实验原理:通用异步收发器是一种广泛应用的短距离串行传输接口。常用于短距离,低速,低成本 的 微 机 与 下 位 机 的 通 讯 中,基 本 的UART 连 接 通 信 图 如 下: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_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_sampleRXD 设备二TXD GND TXD 设备一TXD RXD GND TXD r_tar r_enter r_wart r_samp r_stop 文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.2文档来源为:从网络收集整理.word 版本可编辑.状态进行数据的采样检测,同时也判断是否采集的数据长度已达到数据帧的长度(Framelen),如果达到,说明停止位来临了。本设计中,Frample 默认为 8,即对应得 UART工作在 8 位数据位,无校验位。r_sample:数据位采样检测,完成后无条件转入r_wait状态,等待下次数据位的到来。r_stop:无论停止位是1 位还是 1.5 位,或是 2 位,状态机载r_stop状态下不具体检测RXD,只是输出帧接收完毕信号(rec_done=1)停止位后状态机转回到r_start状态,等待下一帧的起始位。发送器发送器状态转化图如下:x_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会被x_Idlx_starx_wait x_shifx_stop 文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.3文档来源为:从网络收集整理.word 版本可编辑.更新,需要在此之前取走数据。接收准备rec_ready(输出):接收协调信号,接收完毕后的下一帧接收准备好信号,在rec_ready有效时,rbuf已被更新。二、实验原程序:整体分四个模块,一个顶层模块,三个子模块顶层模块:uart A.:uart/uart.v module 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);endmodule B./波特率发生子模块:baud/baud.v module 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=;/(83ns)/parameter BAUD=9600;parameter div_clk=36;/时钟的分频系数=XTAL/(BAUD*16*2)always(negedge clk or negedge reset)文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.4文档来源为:从网络收集整理.word 版本可编辑.begin if(!reset)begin div_16baud=8d0;bclk16=1b0;bclk=1b0;div_baud=4d1;end else if(div_16baud=div_clk)begin div_16baud=8d0;div_baud=div_baud+4d1;bclk16=bclk16;if(div_baud=4d15)begin div_baud=4d0;bclk=bclk;end end else div_16baud=div_16baud+8d1;end endmodule C./接收子模块:u_rec/u_rec.v module 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;/数据接收完毕信号(等待接受信号)3 parameter Framelen=4d8;/数据位长度/状态机状态编码,使用独热码parameter r_Start=5b00001;parameter r_Center=5b00010;parameter r_Wait=5b00100;parameter 文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.5文档来源为:从网络收集整理.word 版本可编辑.r_Sample=5b01000;parameter r_Stop=5b10000;/同步信号always(posedge bclk16 or negedge reset)if(!reset)rxd_sync=1d1;else rxd_sync=rxd;/右移寄存器always(posedge bclk16 or negedge reset)if(!reset)begin rec_shftreg=8d0;rbuf=8d0;end else if(Shift)begin rec_shftreg6:0=rec_shftreg7:1;rec_shftreg7=rxd_sync;end else rbuf=rec_shftreg;/采样间隔判断计数器always(posedge bclk16 or negedge reset)if(!reset)samplecnt=4d0;else if(center)samplecnt=samplecnt+4d1;else samplecnt=4d0;/*状态机*always(posedge bclk16 or negedge reset)begin if(!reset)begin state=r_Start;Shift=1b0;center=1b0;datawait=1b0;datacnt=4d0;end else case(state)r_Start:begin if(!rxd_sync)state=r_Center;else begin state=r_Start;rec_ready=1b0;end end r_Center:begin if(samplecnt=2h3)begin 文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.6文档来源为:从网络收集整理.word 版本可编辑.center=1b0;if(!rxd_sync)state=r_Wait;else state=r_Start;end else begin state=r_Center;center=1b1;end end r_Wait:begin Shift=1b0;if(samplecnt=4d13)begin center=1b0;if(datacnt=Framelen)state=r_Stop;else begin state=r_Sample;datacnt=datacnt+4d1;end end else begin state=r_Wait;center=1b1;end end r_Sample:begin state=r_Wait;Shift=1b1;datawait=1b0;end r_Stop:begin state=r_Start;rec_ready=1b1;datacnt=3d0;end default:begin rxd_sync=1b1;Shift=1b0;rec_shftreg=8d0;samplecnt=4d0;center=1b0;datacnt=3d0;datawait=1b0;state=r_Start;rec_ready=1b1;end endcase end endmodule D./发送子模块:u_ xmit/u_xmit.v module u_xmit(bclk,reset,txd,xmit_cmd,xbuf,xmit_done);input bclk;文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.7文档来源为:从网络收集整理.word 版本可编辑.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)begin xmit_cmd_p=1b0;flag=1b0;end else if(xmit_cmd&(!flag)begin flag=1b1;xmit_cmd_p=1b1;end else if(!xmit_cmd)begin flag=1b0;xmit_cmd_p=1b0;end else xmit_cmd_p=1b0;/右移寄存器always(posedge bclk or negedge reset)if(!reset)begin xmit_shftreg=8d0;txd=1b1;end else if(Shift)begin txd=xmit_shftreg0;文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.8文档来源为:从网络收集整理.word 版本可编辑.xmit_shftreg6:0=xmit_shftreg7:1;xmit_shftreg7=1b1;end else if(start)begin txd=1b0;xmit_shftreg=xbuf;end else begin xmit_shftreg=xbuf;txd=1b1;end/数据位长度判断计数器always(posedge bclk or negedge reset)if(!reset)datacnt=3d0;else if(datawait)datacnt=datacnt+3d1;else datacnt=3d0;/*状态机*always(posedge bclk or negedge reset)begin if(!reset)begin state=x_Idle;Shift=1b0;datawait=1b0;start=1b0;end else case(state)x_Idle:begin if(xmit_cmd_p)state=x_Start;else begin state=x_Idle;xmit_done=1b1;end end x_Start:begin start=1b1;xmit_done=1b0;state=x_Wait;end x_Wait:begin start=1b0;if(datacnt=Framelen)begin state=x_Stop;datawait=1b0;Shift=1b0;end else begin state=x_Shift;文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.9文档来源为:从网络收集整理.word 版本可编辑.Shift=1b1;datawait=1b1;end end x_Shift:begin Shift=1b1;state=x_Wait;end x_Stop:begin xmit_done=1b1;state=x_Idle;end default:begin Shift=1b0;datacnt=3d0;datawait=1b0;state=x_Idle;xmit_done=1b1;end endcase end endmodule三、实验 UART 的部件图:、系统级电路、波特率发生器模块级电路、接收模块级电路、接收模块状态机图、发送部分状态机图四、仿真波形:五、锁定管脚:文档来源为:从网络收集整理.word 版本可编辑.欢迎下载支持.10文档来源为:从网络收集整理.word 版本可编辑.六、下载:七、验证实验:结果良好,只是速度感觉不是瞬时传送完毕的。八、体会:经过这次实习,感觉收集和整理资料是最麻烦的,它基本上占了整个实习阶段的三分之二左右的时间。因为在这个过程中,不仅要对资料进行必要检索,还要进行学习。收集完之后,还要对这些资料做最后的整理,使这些资料变成自己想要的东西。而就算你已经学会了这些知识,要应用到实验箱上来也不是一件容易的事。通过这次实习,基本了解到传统的数字电子系统或IC 设计中,手工设计的比例占了很大的部分,而手工设计有很多的缺点:复杂电路的设计、调试十分的困难;由于无法进行硬件系统功能仿真,如果某一过程出现错误,查找和修改十分不便;设计过程中产生大量的文档,不便于管理;对于IC 设计而言,设计实现过程与具体生产工艺相关,因此可移植性差;只有在设计出样机或芯片才能进行实测。而EDA 技术对数字系统进行行为与功能描述到具体的内部线路结构,从而可以在电子设计的各个阶段、各个层次进行计算机模拟验证,保证设计过程的正确性,可以大大的降低设计成本、缩短设计周期。
展开阅读全文
相关资源
相关搜索

最新文档


当前位置:首页 > 管理文书 > 施工组织


copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


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