用户登陆 用户注册
您的位置:首页>
技术文章>内容正文
用FPGA器件实现UART核心功能的一种方法
[正文]:串行外设都会用到rs232-c异步串行接口,传统上采用专用的集成电路即uart实现,如ti、exar、epic的550、452等系列,但是我们一般不需要使用完整的uart的功能,而且对于多串口的设备或需要加密通讯的场合使用uart也不是最合适的。
如果设计上用到了fpga/cpld器件,那么就可以将所需要的uart功能集成到fpga内部,本人最近在用xilinx的xcs30做一个设计的时候,就使用vhdl将uadt的核心功能集成了,从而使整个设计更加紧凑,更小巧、稳定、可靠,下面就谈谈设计方法。
---- 分析uart的结构,可以看出uart主要由数据总线接口、控制逻辑和状态接口、波特率发生器、发送和接受等部分组成,各部分间关系如图一。
点击查看大图片
---- 了解了uart的各部分组成结构后,下面对各部分的功能进行详细的分析。
我们假定所要设计的uart为:数据位为7位、8位可选,波特率可选,效验方式为奇、偶、无等效验方式,下面的分析都是在这个假定的基础上进行。
一、波特率发生部分---- 从图一可以看出,uart的接收和发送是按照相同的波特率进行收发的(当然也可以实现成对的不同波特率进行收发),波特率是可以通过cpu的总线接口设置的。
uart收发的每一个数据宽度都是波特率发生器输出的时钟周期的16倍,即假定当前按照9600bps进行收发,那么波特率发生器输出的时钟频率应为9600*16hz,当然这也是可以改变的,我们只是按照uart的方法进行设计。
---- 我们假定提供的时钟为1.8432mhz,那么可以很简单地用cpu写入不同的数值到波特率保持寄存器,然后用计数器的方式生成所需要的各种波特率,这个值的计算原则就是1843200/(16*所期望的波特率),如果希望输出9600hz的波特率,那么这个值就是1843200/(16*9600)=12(0ch)。
二、 发送部分---- 这里应重点分析几个问题:首先是何时cpu可以往发送保持寄存器(thr)写人数据?也就是说cpu要写数据到thr时必须判一个状态,当前是否可写?很明显如果不判这个条件,发送的数据会出错,除非cpu写入thr的频率低于当前传输的波特率,而这种情况是极少出现的。
其次是cpu写入数据到thr后,何时thr的数据传送到发送移位寄存器(tsr)并何时移位?即如何处理thr和tsr的关系?再次是数据位有7、8位两种,校验位有三种形式,这样发送一个字节可能有9、10、11位三种串行长度,所以我们必须按照所设置的传输情况进行处理。
数据位、效验方式可以通过cpu写一个端口来设置,发送和接受都根据这个设置进行,由于这部分很简单,所以我就不给出程序了。
---- 根据上面的分析,引进了几个信号:---- bigin1、begin2:引入两个附加移位,目的是为送出起始位、停止位而加入串行长度。
---- txdone7、txdone8:分别表示7、8位的结束标志。
txdone<=txdone8 when“8bit”else txdone7;---- paritycycle7、paritycycle8:分别表示7、8位下的校验位。
parity<=parity8 when“8 bit”else parity7;---- writerdy:为0时表示cpu不能将数据写入thr,为1时可以写入。
---- 这样就可以得到以下信息:在移位时钟的上升沿检测到txdone和writerdy都为高电平时,进入load状态即将thr的数据load到tsr,在下一个时钟就进入移位状态。
在移位中同时进行校验位的运算,在需要送出校验位的时候将运算好的校验位送出,txdone=1的时候将高电平送出,其它时候移位输出。
---- 最后还有一个小程序,那就是写出writerdy的状态,很明显没数据写入时为高,而当txdone为低时为低,注意这里也必须同时同步。
图二给出了一个奇效验8bit数据的发送时序图。
点击查看大图片
三、 接受部分---- 对于接收同样存在9、10、11位三种串行数据长度的问题,必须根据所设置的情况而将数据完整地取下来。
接收还有一个特别的情况,那就是它的移位的时钟不是一直存在的,这个时钟必须在接受到起始位的中间开始产生,到停止位的中间结束。
接受到停止位后,必须给出中断,并提供相应的校验出错、frame错以及溢出等状态。
---- 这样需引入hunt和idle两个信号,其中hunt为高表示捕捉到起始位,idle为高表示不在移位状态,利用这两个信号就可以生成接收所需要的移位时钟。
---- 下面还有一个小程序,就是如何将接收的状态和标志表示出来。
溢出标志很简单,那就是在idle从低变高,也就是说在接收到一个完整的串行序列后,去判一下当前的中断是否有效?(高有效,数据没有被读走)如果为高那么溢出,否则没有。
在移位的时候,同时对接收的数据进行校验,这样就可以判断接收的数据是否有错,在接收完成时判一下当前的rx是否为高电平就可以知道frame是否有错,图三是一个8bit奇校验的接收时序图(假定接收正确,所以没有给出校验、溢出、帧出错信号)。
点击查看大图片
---- 总结:我在用fpga做一个设计的时候,由于还有资源而且正好用到uart,所以就根据对uart的认识进行了设计,全部用vhdl进行描述,用speedwave进行语言级的仿真,用xilinx的f2.1进行顶层仿真,最后和pc的仿真终端进行联机,功能一切正常,整个uart所需要的触发器为80个左右,一般的pld都可以完成。
网站首页
培训课程
维修指南
技术文章
家电专栏
供应信息
求购信息
培训资讯
展会信息
电脑专栏
教程下载
资料下载
常用软件
PLC教程
PLC资料
变频伺服
低压电器
维修资料
人机界面
自控仪表
工控机类
文章标题:
中国工控资源网手机版 2012
电话:010-67577139 13811659603
培训咨询QQ:657167934 471895637 销售咨询QQ:623769457
联系邮箱:zggkzyw@163.com
京ICP备11002135号
报时(2026-04-07 04:30:50)