李汉青
(徐州科亚机电有限公司 江苏省徐州市 221700)
串行通信是通信双方使用一条信号线对二进制位进行传输的一种通信方法。串行通信作为一种灵活、方便、可靠的通信技术,长期以来被广泛应用在信息技术及工业控制领域。串行通信要求通信双方遵守相同的串口协议。一般来讲,串行通信方式一次只能实现两个设备之间的点对点传输,若需要局部端的多个设备和主机端的一个设备进行通信则需要主机端的设备依次和局部端的设备连接实现,通常使用专用的器件来实现该需求,但由于串行通信标准多,灵活性大,就目前而言,还不能够提供将局部端多路串行数据合成一路发送给主机端,将主机端的一路高速串行数据分解成多路并自动发给局部端指定设备的收发器件。为此,本文介绍一种基于FPGA 的一对多路的串行通信方法及系统。
整个系统要实现的功能是将局部端的多路数据,一般是多个功能模块采集的数据在本地端进行处理,将这些数据合并成一路数据,通过一路高速串行通信借口发送到主机端。同时,主机端的数据,通过高速串行通信接口发送到本地端,本地端对接收到的数据进行分析、处理,并将数据发送给主机指定的各个模块中。这样就实现了一路对多路的双向通信。
本文所介绍的系统是实现的1 路对8 路的系统。在设计中,本地端负责处理8 个模块和主机端的数据,8 个模块和主机端都是串行通信接口,因此,本地端需要9 个UART,其中8 个和多路的模块通信,1 个和主机通信。对于通用的MCU 芯片,一般外设有2对UART,要实现9 个或更多的UART,MCU 无能为力。不过,这样的需求可以在FPGA 上轻松实现,理论上,只要FPGA 的资源充足,可以实现足够多的UART 和其他外设。本文所介绍的设计中采用ALTERA 公司的EP3C10 器件,可以使用Quartus II 开发软件包。Quartus II 还包含一个SOPCBulid 设计平台,用户可以在该平台上设计自定义的NIOS II 嵌入式软核处理器。通过SOPCBuild 的设置,可以在EP3C10 上实现一个有9 个UARTR 外设的软核处理器,正好满足一对多的通信需求。
前文中描述了实现一对多通信中多个UART 的总体思想。本部分描述如何在基于FPGA 的NIOS ii 软核上进行数据的处理及转发。
图1 是要在FPGA 上实现的系统组成图。该系统包括两种端口,主机端端口和局部端端口。主机端端口包括主机端接收器、主机端发送器、主机端接收缓存、主机端发送缓存,主机端数据处理控制单元、主机数据处理单元、主机端发送控制单元。局部端端口包括8 个局部端接收器、8 个局部端发送器、8 个局部端接收缓存、8 个局部端发送缓存、局部端数据处理控制单元、局部数据处理单元、局部端发送控制单元。主机端端口和局部端端口的接收器、发送器由NIOS ii 的UART 外设实现,主机端和局部端的接收缓存、发送缓存由NIOS ii 的FIFO 实现,主机端和局部端的处理单元由基于NIOS II 的C 代码实现。
图1:系统组成图
图2:单路信号流示意图
接收器和发送器用来收发数据,接收缓存用来暂时存放收到的还未处理的数据,发送缓存用来存放处理好将要发送的数据。接收缓存和发送缓存的大小要结合数据传输速率、FPGA 逻辑单元的资源合理设置。局部端数据处理控制单元作用是将接收的数据放到各自对应的接收缓存中,并监测各个接收缓存中的数据量,达到一定数量时,将数据转给局部数据处理单元。局部数据处理单元按照和主机约定的协议打包,并将数据存放到主机发送缓存中。主机端发送控制单元监测主机发送缓存中的数据,当数量达到某个值时就将数据写入主机端发送器,数据便通过发送器传输到主机端。主机根据协议可以确认接收到的数据来自哪个局部端的模块。系统和主机的连接可根据传输的距离选择合适的串行通信方式,比如RS232、RS485 或CAN 等方式。
图3:系统工作流程
同样的,主机端数据处理控制单元负责将主机发过来的数据放入主机端缓存中,监测其中的数据量,达到一定量的时候交由主机数据处理单元对接收的数据进行解析,根据协议对数据进行分类,确认收到的数据是哪个局部端端口的,并将数据写入对应端口的发送缓存中。局部端发送控制单元监测发送缓存中的数据,达到一定量时写入对应的发送器。中。局部端的收发器对应分散在不同地方的多个数据采集控制模块,系统和各个局部端模块的连接也可以使用多种串行通信方式。
在这种通信方式下,系统和主机间的协议保证了数据转发的可靠性。局部端数据发给主机前的打包中需要包含包头、长度、通道标识等信息。主机通过通道标识来确认数据是来自于局部端的哪个设备。同样的,主机接收缓存中的数据也是包含了通道标识的数据包,主机数据处理单元在解析的时候根据通道标识,将解析好的数据写入对应的局部发送缓存中。
局部端发送控制单元和主机端发送控制单元既监测发送缓存中的数据量,同时监测发送器状态,只有在数据量达到设定值同时发送器空闲时才将数据传给发送器,向外发送数据。
在主机端和局部端同时工作时就实现了数据的双向通信。
以下结合图2 单路信号流示意图、图3 系统工作流程图来描述系统工作的过程。主机接收器或局部接收器对相应的主机端接口和局部端接口进行监测,监测接口是否有数据,没有数据时则继续监测。当局部端接口或主机端接口有数据的时候,接收数据,并将接收的数据传送到主机接收缓存或局部端接口对应的缓存中,由局部数据处理控制单元或主机数据处理单元监测局部接收缓存和主机接收缓存中的数据量是否达到设定值,若没达到设定值,主机接收缓存和局部接收缓存继续接收数据。当数据量达到设定值时,将局部接收缓存或主机接收缓存中的数据传送至局部数据处理单元或主机数据处理单元,并由局部数据处理单元或主机数据处理单元对数据进行处理,并将处理的数据发送至主机大宋缓存或局部发送缓存中。同时,主机数据发送控制单元或局部数据发送控制单元监测主机发送缓存或局部发送缓存中是否有接收到的数据,若没有接收到数据则继续监测。当监测到有数据时,由局部数据处理单元或主机数据处理大怒眼控制主机发送缓存或局部发送缓存中的数据发送至主机发送器或局部发送器,然后由局部数据发送控制单元或主机数据发送控制单元将主机发送器或局部发送器接收的数据发送到主机端接口或局部端接口,并通过主机端接口或着局部端接口将数据传送至微处理器进行处理。当局部端的多个局部接收器同时有数据接收时,微处理器控制多个设备的数据将以中断方式分别写入各自对用的局部接收缓存中,而局部数据处理控制单元或主机数据处理控制单元将不剪短的对局部接收缓存或主机接收缓存中的数据量进行查询和计算,若某个或多个局部接收缓存或主机缓存中的数据量达到设定值时(可根据缓存大小和传输速率设置为10bytes 左右)。此时需要启动局部端和主机端的通信协议,在数据前加上包头、长度、和通道标识等信息,完成打包,然后将该完整的数据包发送至主机发送缓存或局部发送缓存中。
由于局部端有多条数据传输通道,这些通道的数据都要发送到主机发送缓存中,因此主机发送缓存的空间应该尽量大一些,可以容纳多个局部端通道发送的数据。主机端的主机发送控制单元监测主机发送缓存和主机发送器的工作状态,当主机发送缓存中有数据且主机发送器空闲时,主机发送控制单元控制主机反射缓存将数据传输给主机发送器,并控制主机发送器将数据发到主机端接口。主机接口通过串行通信方式传输给微处理器进行处理,微处理器收到数据后进行解析,根据通道标识确定收到的数据来自于哪个局部端的设备。
同时,主机接收器若接收到主机端接口的数据,同样以中断方式写入到主机接收缓存中,当该主机接收缓存中有数据,并达到设定值时,主机数据处理控制单元启动主机数据处理单元,使主机数据处理单元读取主机接收缓存中的数据,并对该接收的数据进行处理,读出的数据中包括包头、长度、通道标识等,主机数据处理单元依据通信协议对数据包解析,并根据解析出的通道标识将该包中的数据发送到与指定通道对应的局部发送缓存中。
当主机端和局部端的数据通路同时工作,实现双工通信,而且,多个局部接收器可以同时工作来接收局部端的数据,实现多路通信。主机收发器采用高波特率以实现高速通信。
这种基于在FPGA 中实现外设和NIOSII 内核的方式实现一对多串行通信的系统,具有很高的灵活性、而且成本低廉。理论上,只要FPGA 资源足够可实现任意多个串行接口和多个设备连接。
在实验中的系统中,采用常见的低成本EP3C10 器件实现了10个本地设备端和一个主机端的通信,主机端以5Mbuad 的速率可以可靠运行。