原创 用CPLD设计实现串口(UART)

2007-8-26 22:06 8942 11 16 分类: FPGA/CPLD

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


点击看大图


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

PARTNER CONTENT

文章评论5条评论)

登录后参与讨论

用户167165 2009-4-30 20:56

你好。能转给我一份么!学习一下!谢谢!532382142@qq.com。我做了一个发送和接受的模块,快两个星期了。还有问题!我想借鉴您的程序一下!

用户158282 2008-8-15 16:33

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

用户1657917 2008-6-30 13:15

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

用户392473 2008-6-29 22:10

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

用户1189548 2008-6-29 22:10

你好,我也做了一个uart的设计,用的是VHDL语言,基本思路跟你的差不多,功能仿真也通过了,但是奇怪的是下载到板子上后,接收发送的指示灯都亮了,只是回到PC上的数据始终为FF,我估计是接收模块出了问题,可以参考一下你的程序么? 我的邮箱: xiangchuiyi@163.com q: 156595083 谢谢~
相关推荐阅读
用户1657917 2008-06-24 15:10
STM32上位机控制演示软件
STM32项目/学习计划表项目名称 STM32上位机控制演示软件请点击以下链接更新您的个人资料(包括“职位,部门,单位名称,地址,邮编,电子邮箱,电话”),以便我们能及时联系您并快速发送开发套件。ht...
用户1657917 2008-04-03 16:27
串口调试软件V1.0
        这两天用VC++写了个串口调试软件,是用MSComm 控件编写的,虽然串口调试的软件多的满天飞,但是本人初涉串口编程,写这么个软件对以以后应用串口编程还是受益匪浅的。        这...
用户1657917 2008-04-01 16:03
关于radio button控件的使用问题
    用过这个控件的都知道他们之间都是互斥的,但是编程是总是找不到属性设置,在网上查找资料,上面说设置成一组就可以了。但是我把他们的GROUP属性选中了,但是运行时还是不行,没有办法再找,终于在一个...
用户1657917 2008-03-31 11:57
学习串口通信编程
    在公司实习也一个多月了,前段时间调好了AIAO板,接下来又有新任务了。。。准备设计编写基于RS485的多主多从协议,类似于IBM的Token Ring协议,先在电脑间联网写个VC程序测试,所以...
用户1657917 2008-02-21 15:05
汉字转Unicode软件
    这是我学了几天C++后所写的第一个软件,目的是出于前段时间学习AT指令时所需,使用AT指令发短信需要用Unicoe码发送汉字。也算是自己学习C++的练手软件,现在发布给有需要的朋友。本人的第一...
用户1657917 2007-09-25 22:35
DIY迷你CPLD核心板
    这两天用敷铜板做了块迷你的CPLD核心板,把所有的IO口全部都引了出来,还引出了几个CLK的脚,到今天为止已经钻孔、焊接、调试成功,正常下载程序了,呵呵,如有什么不足之处请各位大虾指出,不胜感...
EE直播间
更多
我要评论
5
11
关闭 站长推荐上一条 /3 下一条