日志档案

发表于 2007-8-26 22:06:28

1

标签: UART  CPLD  

用CPLD设计实现串口(UART)

    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进行仿真,波形如下图:

点击看大图

    完成以上功能仿真后,我把最后的程序下载到了实验板上,用串口调试精灵进行了测试,结果准确无误,这是我今天的劳动成果,如设计由什么错误、不当之处还请广大朋友指出,谢谢。

系统分类: CPLD/FPGA   |   用户分类: FPGA/CPLD   |   来源: 原创   |   【推荐给朋友】   |   【添加到收藏夹】

    阅读(1198)    回复(4)  

投一票您将和博主都有获奖机会!

最新评论

  • xiang

    2008-6-29 22:10:04

    你好,我也做了一个uart的设计,用的是VHDL语言,基本思路跟你的差不多,功能仿真也通过了,但是奇怪的是下载到板子上后,接收发送的指示灯都亮了,只是回到PC上的数据始终为FF,我估计是接收模块出了问题,可以参考一下你的程序么? 我的邮箱: xiangchuiyi@163.com q: 156595083 谢谢~

  • 飞南

    2008-6-29 22:10:29

    你好,我也做了一个uart的设计,用的是VHDL语言,基本思路跟你的差不多,功能仿真也通过了,但是奇怪的是下载到板子上后,接收发送的指示灯都亮了,只是回到PC上的数据始终为FF,我估计是接收模块出了问题,可以参考一下你的程序么? 我的邮箱: xiangchuiyi@163.com q: 156595083 谢谢~

  • chinaluou

    2008-6-30 13:15:23

    这个我做了都快有一年了,都有点忘了,呵呵。。。程序我回去发你。

  • kenson608

    2008-8-15 16:33:19

    你好,我也做了一个uart的设计,用的也是VHDL语言,基本思路也差不多,各个功能仿真也对,但是下载到板子上后,回到PC上的数据始终为00,我估计是接收模块出了问题,可以参考一下你的程序吗?我的邮箱: zhangjiansenszu@163.com qq: 40342325 谢谢~~