UART(即Universal Asynchronous Receiver Transmitter 通用异步收发器)是广泛使用的串行数据传输协议。UART允许在串行链路上进行全双工的通信,UART主要有由波特率发生器、发送部分和接收部分等组成。
我这里设计的这个串口是很简单的一个,不带数据校验位的,波特率为固定的9600,其实波特率可选可以用按键很方便的实现,我这只是为了实现串口的最小系统。
UART的接收和发送是按照相同的波特率进行收发的(当然也可以实现成对的不同波特率进行收发)。UART收发的每一个数据宽度都是波特率发生器输出的时钟周期的16倍,即假定当前按照9600bps进行收发,那么波特率发生器输出的时钟频率应为9600×16Hz,当然这也是可以改变的,我只是按照UART的方法进行设计,这样可以准确地接收到数据而不出错。我这里用的晶振是11.059200MHz,可以用计数器的方式生成所需要的各种波特率,这个值的计算原则就是11059200/(16×所期望的波特率),如果希望输出9600Hz的波特率,那么这个值就是11059200/(16×9600)=72,波特率发生模块就是一个分频模块,这里就是对11.059200MHz进行72分频,图如下:
接收部分的起始位可由发送来的数据由逻辑1变为逻辑0为一个数据帧的开始。接收器先要捕捉起始位,确定rxd输入由1到0,逻辑0要8个clk16x时钟周期,才是正常的起始位,然后在每隔16个clk16x时钟周期采样接收数据,移位输入接收移位寄存器rsr,最后输出数据dout。还要输出一个数据接收标志信号标志数据接收完。接收部分仿真波形如下图:
最后一个模块就是发送部分,当接收器完成一帧数据的接收时,就将接收到的数据送到发送器,再由发送器将这一帧数据从高位到低位一位一位发出 ,这里在发送这帧数据开始前要发送一个起始位(低电平0),然后发送8位数据,最后再发送一位停止位。一帧数据发送完毕后输出标志为以示发送完毕。发送部分仿真波形如下图:
仿真好后确认无误,最后将这三个模块连在一起,就构成了一个UART,下面是顶层模块连接图:
最后对这个UART进行仿真,波形如下图:
完成以上功能仿真后,我把最后的程序下载到了实验板上,用串口调试精灵进行了测试,结果准确无误,这是我今天的劳动成果,如设计由什么错误、不当之处还请广大朋友指出,谢谢。
用户167165 2009-4-30 20:56
用户158282 2008-8-15 16:33
用户1657917 2008-6-30 13:15
用户392473 2008-6-29 22:10
用户1189548 2008-6-29 22:10