UART课程设计.docx
《UART课程设计.docx》由会员分享,可在线阅读,更多相关《UART课程设计.docx(14页珍藏版)》请在冰豆网上搜索。
UART课程设计
课程设计——
题目:
UART的设计与实现
2012年10月20日
摘要
本文对通用异步收发器——UART进行了概述,描述了UART的功能以及模块化的设计思路,给出了设计的VHDL语言程序,并进行了相应的仿真验证。
摘要
16页空?
目录
字号:
正文小四号
注意空白与图片大小
第1章设计要求
整个课程设计的要求如下:
a.采用8位宽的数据总线,16位宽的地址总线;
b.具有完整的数据收发功能,且波特率可调;
c.8位数据位、1位奇校验位、1位停止位;
d.一级数据缓冲;
e.具备奇校验检错功能;
第2章原理概述
1、UART的整体框图
异步收发器的原理框图如图1-1所示。
图1-1
2、UART的原理
(1)UART简述
UART即UniversalAsynchronousReceiverTransmitter通用异步收发器,是一种应广泛的短距离串行传输接口。
往往用于短距离、低速、低成本的微机与下拉机的通讯中。
8250、8251、NS16450等芯片都是常见的UART器件。
“异步”指不需要额外的时钟线进行数据的同步传输,是一种串行总线接口,只需占用两根线就可以完成数据的收发(一根接收数据,一根发送数据)。
常用的传输率有4800bps、9600bps、19200bps和115200bps等。
(2)基本帧格式
1.基本概念
1 在信号线上有两种状态,可分别用逻辑1和逻辑0来区分。
在发送空闲时,数据线应保持在逻辑1状态;
2 起始位。
发送器是通过发送起始位而开始一个字符传送,起始位使数据线处于逻辑0状态,提示接收器数据传输即将开始;
3 数据位。
起始位之后就是传送数据位。
数据位一般为一个字节的数据(也有6位、7位的情况),低位(LSB)在前,高位(MSB)在后;
4 校验位。
可以认为是一个特殊的数据位。
校验位一般用来判断接收的数据位有无错误,一般是奇偶校验。
本课程设计里,UART使用1比特的奇校验位;
5 停止位。
停止位在最后,用以标志一个字符传送的结束,它对应于逻辑1状态;
6 位时间。
即每个位的时间宽度。
起始位、数据位、校验位的位宽度是一致的,停止位有0.5位、1位、1.5位格式,一般为1位;
7 帧。
从起始位开始到停止位结束的时间间隔称之为一帧;
8 波特率。
UART的传送速率,用于说明数据传送的快慢。
在串行通信中,数据是按位进行传送的,因此传送速率用每秒钟传送数据位的数目来表示,称之为波特率。
2.帧格式
UART的帧格式如下:
START
D0
D1
D2
D3
D4
D5
D6
D7
P
STOP
起始位
数 据 位
校验位
停止位
UART的整个设计分为3个子模块和一个顶层模块:
波特率发生器、发送模块、接收模块和一个顶层模块。
(3)波特率发生器
波特率发生器实际上就是一个简单的分频器。
它把系统时钟(clk)分频成16倍的波特率时钟,称为分频时钟(bclk)。
分频时钟控制了发送器和接收器的采样速率,从而达到精准采样的目的。
(4)发送器
发送器要做的工作就是把CPU从数据总线上送来的8位并行数据按照波特率时钟变为串行数据,先发1位的起始位,然后发8位的数据,之后1位的奇校验位和停止位。
每1位都是发一个波特率时钟,即16个分频时钟。
在发送完数据后,产生一个发送确认信号(命名为txd_done),当该信号为1时表示一帧的数据发送完毕,等待下一帧数据的发送。
(5)接收器
接收器要做的工作就是把外部送来的串行数据按照波特率时钟转换成8比特的并行数据,然后放在数据总线上供CPU使用。
首先它要能够检测低电平的起始位,等待8个分频时钟后确认信号是否一直保持低电平,是的话就开始每16个分频时钟(即一个波特率时钟)采一次数据。
接收完数据后返回奇校验信息,并把接收完成信号(命名为r_ready)置为高电平,表示一帧的数据接收完毕。
(6)顶层模块
顶层模块把地址总线上的16位地址信号进行地址译码。
将译码后的信号送往对应的子模块,把数据总线上的8位数据做并串转换后输出,或者把外部串行数据做串并转换后送往数据总线。
并且返回相应的接收完成信号和奇校验信号,或者返回发送完成信号。
第3章模块设计与仿真
1、波特率发生器设计与仿真
波特率发生器实际上就是一个简单的分频器。
可以根据给定的系统时钟频率(晶振时钟)和要求的波特率算出波特率分频因子。
已算出的波特率分频因子作为分频器的分频数。
对于波特率发生器中的系数一般在FPGA实现时往往是固定的,但对于不同的实现,这个系数需要更改。
波特率发生器产生的分频时钟,不是波特率时钟,而是波特率时钟的16倍,目的是为了在接收事实进行精确地采样,以提出异步的串行数据。
在VHDL实现的时候,设置了4个输入端口和1个输出端口,其中输入端口k用于设置所需的波特率。
当k为00时对应的波特率为4800bps;k为01时对应的波特率为9600bps;k为10时对应的波特率为19200bps;k为11时对应的波特率为115200bps。
输入端口clk接系统时钟,ben为使能端口,resetb为复位端口,低电平有效。
输出端口信号bclk即为不同波特率所对应的分频时钟。
这里的系统时钟clk设为32MHz。
波特率发生器的仿真结果如图3-1所示。
图3-1
2、接收器设计与仿真
由于串行数据帧和接收时钟是异步的,由逻辑1转为逻辑0可以被视为一个数据帧的起始位。
然而,为了避免毛刺影响,能够得到正确的起始位信号,必须要求接收到的起始位在波特率时钟采样的过程中至少有一半都是属于逻辑0才可认定接收到的是起始位。
由于内部采样时钟bclk周期(波特率发生器产生)是发送或接收波特率时钟频率的16倍,所以起始位需要至少8个连续bclk周期的逻辑0被接收到,才认为起始位接收到,接着数据位和奇偶校验位将每隔16个bclk周期被采样一次(即每一个波特率时钟被采样一次)。
如果起始位的确是16个bclk周期长,那么接下来的数据将在每个位的中点处被采样。
图3-2是UART接收器的接收状态机。
图3-2
状态机一共有4个状态,分别命名为:
rx_idle,rx_sync,rx_data,rx_stop。
接收机复位以后,将处于rx_idle状态。
这时,接收机等待输入信号rxdr变为低电平,即起始位,这意味着新的一帧UART数据帧的开始,一旦起始位被确定,状态机将转入rx_sync状态。
rxd_sync信号是rxdr的同步信号,因为在进行逻辑1或逻辑0判断时,不希望检测的信号是不稳定的,所以不直接检测rxdr信号,而是检测经过同步后的rxd_sync信号。
rx_sync状态:
这一状态是起始位的检测阶段,即接收器在连续收到8个分频时钟的低电平后,才能确定接收到的信号是起始位,才能进入下一状态;否则,接收器重新进入rx_idle状态。
进入rx_sync状态会有一个分频时钟的延迟,所以计数值为6(即二进制的0110,从0000开始计数)时,便可以确定接收到的是起始位。
rx_data状态:
对于异步串行信号,为了使每一次都检测到正确的位信号,而且在较后的数据位检测时累计误差较小,显然在每位的中点检测是最为理想的。
所以在计数值为15(即二进制的1111,从0000开始计数)时,把接收到的同步信号rxd_sync送入移位寄存器rbufs的最低位,然后移位寄存器向左移一次位,同时把rxd_sync与校验信号rx_check(初始值为0)做异或操作,结果返回到rx_check中;当移位寄存器移了8次后,在移位计数值为9时进入下一状态,否则重新进入rx_data状态。
这个时候9比特的数据(包括一位奇校验位)就接收完成。
同时,奇校验也同时完成。
rx_stop:
这一状态是接收停止位状态。
其实,接收器并不严格接收停止位,而是把r_ready信号输出一个波特率时钟。
这一状态里,r_ready信号为逻辑1,计数值全部清0,移位寄存器中的值送给输出寄存器rbuf,奇校验信息送给寄存器r_check。
之后进入rx_idle状态。
这里r_check为1时说明接收到的数据是没有检验错误的,否则便出现数据错误。
接收器的仿真结果如图3-3所示。
图3-3
(1)
图3-3
(2)
图3-3(3)
图3-3(4)
3、发送器设计与仿真
发送器只要遵循每经过一个波特率时钟便输出一位数据即可,顺序为1位起始位,8位数据位,1位奇校验位和1位停止位。
发送器的状态机如图3-4所示。
图3-4
发送器有5个状态,分别命名为:
x_idle,x_start,x_send,x_done,x_stop。
x_idle状态:
当发送器复位后,等待使能信号ten变为逻辑1。
如果ten为1,则进入下一状态,并且输出txds变为0;否则重新进入x_idle状态,输出txds为1,发送完成信号txd_done为0。
x_start状态:
这一状态是发送一个波特率时钟的起始位。
发送完起始位后,进入下一状态。
x_send状态:
发送8位数据。
这一状态里,每一个波特率时钟移位寄存器里的最低位输出,然后向右移一次位,同时把输出与校验信号做异或操作,结果返回到检验信号tx_check;当发送完最后1位数据时,进入下一状态。
x_done状态:
发送一个波特率时钟的校验位,并把txd_done中值变为1,进入下一状态。
x_stop状态:
发送停止位,进入x_idle状态。
发送器的仿真结果如图3-5所示。
图3-5
(1)
图3-5
(2)
第4章UART仿真验证
UART顶层模块的设计就是把各子模块信号连接起来,并且做地址译码。
地址译码的一个例子如下表所示:
顶层模块的仿真结果如图4-1所示:
图4-1
(1)
图4-1
(2)
图4-1(3)
图4-1(4)
图4-1(5)
图4-1(6)
第5章总结
第6章附录
VHDL程序:
1、顶层模块
2、波特率发生器
3、发送器
4、接收器