摘 要:在基于fpga芯片的工程实践中,经常需要fpga与上位机或其他处理器进行通信,为此设计了用于短距离通信的uart接口模块。该模块的程序采用vhdl语言编写,模块的核心发送和接收子模块均采用有限状态机设计,详述了各子模块的设计思路和方法,给出了它们的仿真时序图。综合实现后,将程序下载到fpga芯片中,运行正确无误。又经长时间发送和接收测试,运行稳定可靠。相对参数固定的设计,该uart的波特率、数据位宽、停止位宽、校验位使能及校验模式选择均可以在线设置,为fpga与其他设备的通信提供了一种可靠途径,具备较强的实用价值。
0 引言
通用异步收发器(universal asynchronous receivertransmitter,uart)尽管自20世纪70年代就已出现,但因其简单可靠,目前仍是一种使用广泛的串行通信接口。各种微处理器,不论是单片机,还是dsp、arm,uart都是基本外围模块。许多场合如系统监控、数据采集都要用到串口通信[1-3],甚至要用多个串口,如开发串口服务器[4-6]。此时通常采用专用芯片,如16c554、vk3224等扩展串口。专用芯片使用简单,然而缺乏灵活性,同时专用芯片集成的串口数量也有限,有时需使用多个芯片才能满足要求[5],增加了系统的复杂度,降低了可靠性。
fpga(field programmable gate array)作为一种可编程芯片,其资源丰富、工作效率高,常用于高速数据采集、算法的高速并行执行[7-8]。用户可通过硬件描述语言或电路原理图,设计出个性化的高性能电路模块,具有设计灵活,升级方便的优点。
在基于fpga的工程实践中,常需要其与串口设备通信,但在xilinx现有的开发环境ise中没有相关的ip核。目前也有使用fpga设计uart的例子[9-13]后,但有的参数固定,缺乏通用性。本文设计和实现了参数可在线配置的uart接口模块,为fpga与其他设备通信提供了一种可靠途径。
1 uart串行通信简介
标准的rs232接口常采用db-9连接器,其有2根数据线,6根控制线,1根信号地线。本文设计的uart符合rs232串行通信标准,但在实际中,rs232标准中诸多控制信号使用较少,故文中的uart只使用其中的3根信号线,即txd、rxd和信号地,这也是很多微处理器uart模块所采用的信号线。
uart属于异步通信接口,通信双方需约定好波特率。国际上规定了一系列标准的波特率,如9 600b/s、19 200b/s、115 200b/s等。uart每一数据帧,依次由起始位(1位)、数据位(5~8位),奇偶校验位(可选的1位)以及停止位(1~2位)组成。其中数据位部分是从最低位先开始传送的;奇偶校验位是对1帧数据中的数据部分和校验位计算,使‘1’的个数满足奇数个或偶数个。当uart空闲时,收发引脚rxd与txd均是高电平。一旦需要发送数据,则首先向txd引脚输出低电平作为起始位,表示1帧数据的开始。而在接收数据时,检测到起始位将启动一次数据接收流程。
2 系统设计
本文设计的uart通信接口主要由波特率产生模块、发送模块、接收模块以及微处理器接口模块组成。各模块使用vhdl语言来表述,模块之间的信号连接是通过顶层文件中的元件例化语句实现。
整个设计的结构框图如图1所示。设计和实现的uart通信模块主要功能如下:
1)实现了串行数据的发送和接收。
2)停止位可设置(1位或2位)。
3)可设置是否启用奇偶校验功能,以及校验模式设置即选择奇校验还是偶校验。
4)波特率可配置。标准的波特率系列中从9 600~115 200b/s均可设置,同时还支持自定义的波特率。
5)设计了微处理器接口,通过接口可访问uart内部寄存器,配置uart参数,读写收发数据。
该uart 通信接口包含2 个数据缓冲寄存器(txholder和rxholder)、3 个控制寄存器(uartcon、uartbaud及uartinten)、3 个状态寄存器(uartstate、uarterror、uartintpend)。考虑到需要在线更新uart参数,设计uartcon与uartbaud为双缓冲寄存器。第一级缓冲用于存储外部处理器写入的配置数据,第二级缓冲即用于设置uart内核。当uart内核空闲时,才将第二级缓冲内容更新为第一级缓冲内容,防止破坏收发中的数据。
3 uart各模块的设计
下面详细介绍uart各模块的设计思路和方法,同时给出了主要模块的行为仿真时序图。
3.1 波特率发生模块
波特率发生模块的作用是产生uart工作所需的时钟信号,其频率定为实际波特率的16倍。波特率发生模块本质是1个可预置初值的计数器,每当计数达到预置值时输出高电平,其余值输出低电平。
3.2 发送模块
发送模块按照用户设置,将txholder中的并行数据串行发送出去,其核心为1个有限状态机,其状态转换如图2所示。
1)idle状态
当系统上电复位之后,发送状态机即进入此状态。若不向发送缓冲器写入数据,那么txdatavalid为低电平,表示发送缓冲器空,状态机始终在此状态循环等待,txd引脚输出高电平。
2)start状态
一旦向发送缓冲器txholder 中写入数据,txdatavalid即变为高电平。状态机由idle状态切换到start状态,txd输出低电平,输出起始位。
3)shift状态
1位波特时间过后,状态机无条件的转换到shift状态,即使能发送移位寄存器,开始将并行数据逐位右移,实现并串转换并输出到txd。当输出的数据个数达到databit设定的数据位宽时,便转换到parity或者stop_1bt状态,否则仍转换到该状态。
4)parity状态
若数据位部分发送完毕,且奇偶校验使能位parityen=‘1’时,则转换到该状态。该状态下,根据已发送的数据和选择的校验模式,发送校验位。
5)stop_1bit状态
无论停止位为1位还是2位,都先转换到stop_1bit状态,先输出1位停止位。由该状态转换下一状态时,次态会有多种情况。若设置了stopbit为‘1’即选择2位停止位时,次态为stop_2bit;若stopbit为‘0’且发送缓冲器为空时,次态即转换到idle状态,否则转换到start状态开始新一轮的数据发送。
6)stop_2bit状态
若选择2位停止位时,才会进入此状态。持续1个波特时间后,根据txdatavalid状态,进入idle状态待命,或进入start状态开始新1轮的数据发送。
发送模块的行为仿真时序图如图3所示。其uart参数设置为偶校验、8位数据位和1位停止位。txclk为发送采样时钟信号,在该信号的上升沿,发送状态机状态翻转,同时数据被送到txout(txd)引脚。图中txout输出的数据为“00100110011”,去掉起始位、校验位和停止位后即为待发送的数据0x32。由仿真所得发送模块的时序图可知,该模块各信号仿真结果正确无误。
3.3 接收模块
接收模块主要功能是将rxd引脚接收到的串行数据按照配置的通信参数,提取出数据部分,存入接受缓冲器,并设置相关状态寄存器。其核心是1个接收状态机,状态转换如图4所示。
1)idle状态
复位之后,接收状态机便进入此状态等待。一旦检测到rxd为低电平,即一帧数据的起始位,状态机立即转换到start状态,否则开始数据接收标志startbitflag为‘0’,状态机始终停留在该状态。正确捕获到1帧数据的起始位非常重要,它起到同步接收采样时钟的作用,是正确接收1帧数据的关键。
2)start状态
一旦捕获到起始位,便立即转入该状态,启动一帧数据的接收流程。
3)shift状态
起始位之后,状态机无条件的转换到shift状态,即开始接收数据部分。接收到的每1位数据将逐位左移,实现串并转换。当接收到的数据个数达到databit设定的数据位宽时,即转换到parity或者stop_1bt状态。
4)parity状态
当完成数据位部分的接收且奇偶校验使能位parityen=‘1’时,则转入该状态。根据已接收的数据和选择的校验模式,uart接收模块将检查校验结果,设置相关寄存器。
5)stop_1bit状态
在该状态下,检查rxd信号是否为高电平,否则设置错误寄存器,以表示发生了帧错误。
6)stop_2bit状态
只有选择了2位停止位时,才会进入此状态。该状态下,需要更新各状态寄存器。持续1个波特的时间后,转换到idle状态待命,等待捕捉新的1帧数据的起始位。
接收模块的行为仿真时序图如图5 所示。仍将uart设置为偶校验、8位数据位,1位停止位。图中rxclk为接收采样时钟信号,该时钟同步于每1帧数据的起始位。rxclkd8为rxclk延迟了半个周期的信号,以便在rxd引脚每1位的中间位置采样到稳定的电平。rxin(rxd)引脚的信号在rxclkd8上升沿被采样。图中rxin串行输入的数据为“00101101001”,与接收到的数据0x5a 一致,且没有校验错误,接收模块各信号仿真正确无误。
3.4 微处理器接口模块
为方便外部处理器操作,uart模块提供了专门的微处理器接口信号,包括cs、wr、clk、addr 和data。cs为uart模块的片选信号,所有操作只有在cs为低电平才能有效,否则被忽略。wr为读写控制信号,当wr为高电平时,从uart内部寄存器读取数据,否则写数据到其寄存器。wr同时还控制双向接口data 的方向。当wr为高时,data 被设置为输出,uart内部数据被输出到data 接口;而wr为低时,data 被设置为输入,外部处理器可把数据输出到data接口。addr为地址线,用来寻址uart内部寄存器。clk为读写时钟信号,所有的读写的操作均是在clk的上升沿完成,该模块的仿真波形如图6所示。
4 验证测试
在xilinx公司的fpga xc3s500e上综合、实现后,所设计的uart通信接口模块实际只耗用了128个寄存器和134个4输入查找表,占其可用资源比例均不到1%。将程序下载到芯片中经实际运行,数据收发正确无误,实际运行结果如图7所示。
为进一步测试串口模块长期运行的稳定性与可靠性,进行了如下实验:使用串口调试软件,定时将测试数据发送给uart,再用单片机通过uart的微处理器接口读收到的数据,然后再写回uart的发送缓冲器,如此可自动完成所设计uart模块收发功能的测试。测试结果如表1所示。可以看出,无论波特率低至9 600bps还是高达115 200bps,经大量数据收发测试,均无出现发送、接收错误,也未出现帧错误以及奇偶校验错误,表明所设计的串口通信模块长时间运行时稳定可靠。
5 结论
本文基于fpga 设计和实现了通信参数可在线配置的异步串行通信接口模块,将程序下载到芯片实际运行,结果表明该接口模块设计正确,运行稳定可靠,为fpga 与其他设备的通信提供了一种可靠途径,具有较强的实用价值。同时本设计可作为fpga 开发多串口设备的1个基本模块,通过复制基本模块,可在1片fpga 芯片上扩展出多个串口,而数量仅与fpga 可用资源有关,满足多串口场合的需要,开发出基于fpga 的多串口设备,替代采用专用串口芯片的传统设计方案,降低多串口系统的复杂度,提高可靠性。
荣耀9评测:千机一变,友商们又可以出新颜色啦!胡歌同款奶奶灰,你值得拥有!
一文知道MCU上电复位启动过程
自粘结铁芯对电机能效提升到底有多大影响?
贸泽电子携手Microchip推出全新电子书 探索新一代物联网各类出色应用
扬声器和智能放大器:什么使放大器变得智能?
基于FPGA异步串行通信接口模块设计与实现
工信部划分6GHz频段,5G+工业互联网未来不可估量
Sinexcel静止无功发生器SVG的应用案例
七夕蓝牙耳机礼物推荐:最适合运动的蓝牙耳机
锂电产业如何利用视觉检测系统降本增效?
Xilinx可编程逻辑器件设计与开发(基础篇)连载34:Spartan
教你实现用Python自动玩王者荣耀
苹果新任设计掌门人的上位之路
基于FPGA芯片和RISC在图像驱动中的应用
紧随Apple Pay 三星支付24日将公开测试
【Makefile】C文件包含的头文件修改,但不重新编译?
断路器锁具适用各种各样双孔,它的特性是怎样的
通过采用多种编码器实现DSP处理器的低功耗总线的设计
国轩高科第二个在美锂电项目签约落地
德生R101袖珍式高保真收音机的电路剖析及摩机