fpga实现uart串口通信
扫描二维码
随时随地手机看文章
串行通信是指利用一条传输线将资料一位位地顺序传送。特点是通信线路简单,利用简单的线缆就可实现通信,降低成本,适用于远距离通信,但传输速度慢的应用场合。
异步通信以一个字符为传输单位,通信中两个字符间的时间间隔多少是不固定的,然而在同一个字符中的两个相邻位间的时间间隔是固定的。
数据传送速率用波特率来表示,即每秒钟传送的二进制位数。例如数据传送速率为120字符/秒,而每一个字符为10位(1个起始位,7个数据位,1个校验位,1个结束位),则其传送的波特率为10&TImes;120=1200字符/秒=1200波特。
数据通信格式如下图:
其中各位的意义如下:
起始位:先发出一个逻辑”0”信号,表示传输字符的开始。
数据位:可以是5~8位逻辑”0”或”1”。如ASCII码(7位),扩展BCD码(8位)。
校验位:数据位加上这一位后,使得“1”的位数应为偶数(偶校验)或奇数(奇校验)。
停止位:它是一个字符数据的结束标志。可以是1位、1.5位、2位的高电平。
空闲位:处于逻辑“1”状态,表示当前线路上没有资料传送。
异步通信是按字符传输的,接收设备在收到起始信号之后只要在一个字符的传输时间内能和发送设备保持同步就能正确接收。下一个字符起始位的到来又使同步重新校准(依靠检测起始位来实现发送与接收方的时钟自同步的)
串行通信的硬件接口电路原理设计在串行通信中,普遍采用的是RS-232-C接口的标准。RS-232-C接口信号引脚的连接方式规定了25芯的D型连接器(DB225),实际使用中多采用的是一个9芯的D型连接器(DB29),本方案采用了DB29连接器
本方案的异步串行通信的硬件接口电路图如图2所示,由三部分组成:FPGA串口模块、MAX232和DB29。MAXIM公司的MAX232是为满足EIA/TEA2232E的标准而设计的,具有功耗低、波特率高、价格低等优点,工作电源为+5V,外界电容仅为0.1uF或1Uf,为双组RS2232收发器。MAX232有两个发送器,若只用其中一个发送器,另外一个发送器的输入、输出端可以悬空。本方案把异步通信电路作为一个整体来实现,数据由DB29的RxD端输入,经过MAX232进行电平转换由FPGA串口模块的RxD端进入,进行串并转换后经由8位数据总线(D72D0)进入FPGA的其它模块或其它的处理芯片。数据处理后经由8位数据总线进入FPGA串口模块,在其中进行并串转换后由TxD端输出MAX232的12管脚,在MAX232种经过电平转换后由DB29的TxD端输出。
FPGA串口模块设计FPGA串口模块是本设计的关键所在,的内部逻辑结构及各部件的功能。如图3所示,主要由波特率发生模块、发送模块,接收模块组成。用Verilog实现设计的各部件功能说明如图3
波特率发生模块
设计的UART的接收和发送按照相同的波特率进行,波特率可以通过接口模块的总线接口进行设置。UART收发的每一个数据宽度都是波特率发生器输出的时钟周期的16倍,即假定当前按照9600b/s进行收发,那么波特率发生器的输出时钟频率应该为9600&TImes;16Hz。假定提供的外部时钟为1.6MHz,可以很简单地通过总线写入不同的数值到波特率发生器保持寄存器,然后用计数器的方式生成所需要的各种波特率,即分频器。计算公式为:1600000/(16&TImes;所期望的波特率)-1,如果希望输出10000Hz的波特率,可以得出从总线写入的数值为1600000/(16&TImes;10000)-1=9(09H)。
发送模块根据UART协议的描述,发送数据由接口模块控制,接口模块给出wrn信号,发送器根据此信号将并行数据锁存,并通过发送保持寄存器和发送移位寄存器发送并行数据。由计数器no-bs-sent控制状态的转移,即数据的发送,计数值为1时,数据从发送保持寄存器传送到发送移位寄存器,计数值为2时,发送开始位(1b低电平),计数值为3~10,发送8位数据,计数器为11,发送校验位,计数值为12,发送1位停止位,计数器随后清零。发送时钟是根据数据传输的波特率产生的,16倍于波特率发生器产生的时钟。
在Xilinx的ISE7.1.02i集成环境中,用Verilog编写代码,Synplifypro8.1进行逻辑综合,Modelsim6.0d进行仿真,其结果如图4所示。
接收模块
接收逻辑首先通过检测输入数据的下降沿来检查起始位,然后产生接收时钟,利用接收时钟来采样串行输入数据,在缓冲器中作移位操作,同时产生校验位,在第9位处比较校验位是否正确,在第10位处比较停止位是否为高,在校验位错误或停止位错误的情况下产生错误指示信号。接收时钟是根据数据传输的波特率产生的,16倍于波特率发生器产生的时钟。
使用Modelsim6.0对接收模块做了时序仿真,其结果如图5所示。接收时钟与发送时钟相同,接收到一帧串行数据,由接收模块转换为并行输出,并且检验校验位和停止位,产生framing-error和parity-error信号输出。
接口控制模块
接口控制模块连接控制发送、接收、波特率发生模块,并与外部并行总线相连接,从外部(CPU或单片机)接收控制信号(nrst,nwrn,nbdn,nrdn),来控制UART的发送、接收以及内部时钟的生成。在nwrn有效并且内部信号tbre=‘0’(发送缓冲寄存器空)时,将数据总线输入的并行数据发送给发送模块数据线din(7:0),执行发送数据功能。在nrdn有效并且内部信号data-ready,parity-error,framing-error有效时,允许从接收模块读入接收到的数据。波特率发生器和发送模块的并行数据输入端口共用一个数据总线。
综合实现其性能分析使用Xilinx的SpatanIIxc2s100FPGA芯片,对整个FPGA设计使用Synplifypro8.1进行逻辑综合,其实占用的FPGA资源总共仅为56个查找表(LUTs),占用的资源很少,可以很方便的集成在其他的FPGA设计中;最高时钟速度可以到达121.8MHz,可见此设计完全可以满足任何一种标准的波特率系列
硬件电路实现及软件实现在验证此UARTFPGA设计时,使用了PADS来设计电路原理图和PCB图,并最终在硬件上下载调试成功。在验证UART通信时,此设计的PC机串口通信程序,采用了Ac2tiveX控件方式来实现。
用FPGA实现了UART通信功能,可以实现对数据的接收和发送,并可以在接收数据时对其校验位、停止位进行判断,在发送数据时可以形成完整的一帧数据格式。其接收和发送数据的时钟有内部波特率发生器产生,根据预置的分频系数,对外部时钟进行分频,产生需要的接收或发送时钟。将该UARTFPGA设计作为一功能块嵌入到一个FPGA实现的数据采集与处理系统中,可以成功地实现和远端的PC机进行异步串行通信。实验证明该UART设计占用资源少,工作稳定可靠,可运使用在低端的异步通信。