一种新型的FPGA实现RS422串口通信方法
2017-03-27梁晓鹏李军武
刘 杰,臧 炜,梁晓鹏,李军武
(1.贵州航天凯山石油仪器有限公司,贵阳 550000; 2.中国石油渤海装备公司第一机械厂,河北 青县 062650; 3.长庆油田第六采油厂,陕西 榆林 718600; 4.长庆油田第七采油厂,甘肃 环县 745700)
一种新型的FPGA实现RS422串口通信方法
刘 杰1,臧 炜2,梁晓鹏3,李军武4
(1.贵州航天凯山石油仪器有限公司,贵阳 550000; 2.中国石油渤海装备公司第一机械厂,河北 青县 062650; 3.长庆油田第六采油厂,陕西 榆林 718600; 4.长庆油田第七采油厂,甘肃 环县 745700)
在FPGA实现RS422串口通信的常用方法中经常遇到诸多问题,如FIFO深度读取不正确、FIFO写数据端口与读数据端口时序竞争、多个模块间信号延时导致FPGA亚稳态等问题,因此设计了一种新型的RS422串口通信实现方法;该方法通过利用寄存器数组作为循环缓存代替FIFO,利用计数器代替传统的波特率产生模块,把常用方法中的多个模块整合成一个模块,只采用一个主时钟,所有寄存器的时钟输入端共享一个时钟,对FPGA逻辑与时序进行了有效约束,避免了FPGA中亚稳态产生;试验结果表明该方法实现的RS422串口通信高速、可靠、稳定,并且利用FPGA实现RS422串口通信,可使整个系统更为灵活、紧凑,减小整个电路的体积,提高系统的可靠性和稳定性。
RS422;FPGA;DSP;Verilog HDL
0 引言
目前,嵌入式电子系统设计多采用DSP+FPGA架构,因为其兼顾了DSP和FPGA的优点。DSP的优点是能够实现复杂的算法结构,运算速度高、寻址方式灵活等,适合于运算能力和存储容量有较高要求的应用场合[1]。FPGA的优点是基于可编程逻辑器件进行数字逻辑设计,性能稳定、易于维护、性价比高、产品体积小、信号间干扰小、研制周期短等,并发处理能力强,可以作为DSP的各种外围电路的控制器。因此,采用DSP和FPGA数字信号处理系统可以把两者的优点结合起来,兼顾速度和灵活性,优势互补,符合当前软硬件融合协调工作的趋势。
RS422 串口通信在航空航天及工业控制领域有着广泛的应用,其特点是点对点通信、传输距离长、抗干扰能力强、传输速率高等方面。利用FPGA实现RS422串口通信,可使整个系统更为灵活、紧凑,减小整个电路的体积,提高系统的可靠性和稳定性。
本文首先介绍了一种FPGA实现RS422串口通信的常用方法,然后设计并实现了一种改进方法,在改进方法中采用寄存器数组作为循环缓存代替FIFO,利用计数器代替波特率产生模块,把常用方法中的四个模块进行整合,采用同步时钟代替异步时钟,对FPGA逻辑与时序进行了有效约束,避免了FPGA中亚稳态产生,提高了RS422串口通信的可靠性、稳定性。
1 RS422串口通信常用实现方法
RS422串口通信的帧格式如图1所示。
图1 RS422串口通信帧格式
一帧数据包括起始位、数据位、校验位和停止位。线路空闲时,传输线路保持高电平。当发送数据时,发送节点要先发一个低电平的起始位,表示一帧数据的开始,然后发送有效数据位,通常为8个比特,然后发送奇偶校验位,最后发送停止位,停止位为高电平,表示一帧数据发送结束。
串口通信结构框图如图2所示。
图2 串口通信结构框图
DSP与FPGA之间的通信方式采用DSP的EMIF方式,即地址总线、数据总线和控制总线。FPGA内部实现RS422通信功能,主要包括接收模块、发送模块、波特率产生模块、DSP接口控制模块等4个部分。RS422串口通信外设一般是指RS422收发芯片,如MAX3087,完成TLL电平和RS422差分电平之间的转换,通常与FPGA相连时要经过数字隔离器,进行地线隔离。
串口接收模块的功能为:FPGA首先检测数据的起始位,然后获得有效数据位的信息,并且对有效数据位进行奇偶校验后,进行串/并转换,存入串口接收FIFO中,等待DSP进行查询读取,当DSP读串口接收FIFO地址时,FPGA把串口接收FIFO中的数据放到数据总线上。
串口发送模块的功能为:首先DSP通过EMIF接口向FPGA的串口发送FIFO写数据,FPGA把数据存入串口发送FIFO中,进行并/串转换,将串行数据从输出端口按照约定的波特率输出。
波特率产生模块的功能:一般通过FPGA内部的PLL锁相环以及分频模块,获得串口发送模块波特率时钟驱动串口发送模块,获得串口接收模块16倍频波特率时钟驱动串口接收模块。
DSP接口控制模块具体功能为:根据DSP接口的读信号、写信号、片选信号以及地址信号产生相应的接收FIFO读信号、发送FIFO写信号、以及读取接收FIFO深度等功能。
在常用方法中,数据缓存操作通常采用FPGA生产商免费提供的FIFO软核,是一种采用环形存储结构的先进先出存储器[2]。FIFO结构如图3所示。
图3 异步FIFO结构图
图3中,FIFO的存储介质为一个双端口RAM,可以同时进行读写操作。左侧为一个写时钟域,由写地址逻辑产生写控制信号和写地址,可以把数据写入RAM;右侧为一个读时钟域,由读地址逻辑产生读控制信号和读地址,可以读出RAM中的数据。另外,由空/满标志位产生逻辑对读写地址相互比较产生空、满标志位以及动态刷新FIFO的深度,该模块需要和读时钟域、写时钟域进行交互,存在跨时钟域的问题。
综上所述,常用方法是基于FPGA内部FIFO建立串口通信模块,在工程应用中,经常遇到诸多问题,如FIFO深度读取不正确、FIFO写数据端口与读数据端口时序竞争、多个模块间信号延时导致FPGA亚稳态等问题。究其原因是由于FIFO软核由厂家封装后,对用户开发是一个“黑盒子”,其内部设计无法被用户优化[3]。因此在改进方法中,设计循环缓存代替了FIFO,利用计数器代替了波特率产生模块,可以把串口发送模块整合成一个模块,把串口接收模块整合成一个模块,并且两个模块只采用一个主时钟,采用同步时序电路设计的FPGA,所有寄存器的时钟输入端共享一个时钟,可以有效地消除亚稳态。
2 RS422串口通信改进方法
2.1 利用寄存器数组作为循环缓存代替FIFO
定义一个寄存器数组[4]:reg[7:0] data_HC[511:0],数据宽度为8位,长度为512。
定义一个读指针计数器:reg[8:0] REcount = 9’h000,计数范围为[0~511]。
定义一个写指针计数器:reg[8:0] WEcount = 9’h000,计数范围为[0~511]。
如图4所示,采用一个主时钟对循环缓存data_HC进行读、写操作,当向循环缓存data_HC写入数据后,写指针WEcount加1;当从循环缓存data_HC读出数据后,读指针REcount加1。当读、写指针递增到511后,再加1则自动为0,依次循环。循环缓存还需要建立3个关键的变量。
图4 循环缓存data_HC示意图
循环缓存的深度:wire [8:0] cnt;
循环缓存的满标志:wire FULL;
循环缓存的空标志:wire EMPTY;
深度cnt即循环缓存data_HC中数据的个数,利用写指针WEcount与读指针Recount比较,当WEcount >= Recount时,cnt = WEcount -Recount。当WEcount < Recount时,cnt = WEcount +512 -Recount。利用逻辑电路表达式为:
assign cnt = (WEcount >= Recount)?( WEcount -Recount):( WEcount +512 -Recount)。
空、满标志产生的原则是:写满而不溢出,读空而不多读。即在满信号有效时若继续向FIFO写数据,应根据设计的要求对数据作保持或抛弃重发处理,空标志的产生也是如此。
当深度cnt=0时,设置空标志EMPTY=1。当深度cnt=256时,设置满标志FULL=1。当然,满标志FULL的深度cnt数值可以灵活设置。利用逻辑电路表达式为[3]:
assign EMPTY = (cnt === 9’d0)?1:0;
assign FULL = (cnt ===9’d256)?1:0;
当向循环缓存data_HC写入数据时,代码示例如下:
if(~FULL)
begin
data_HC[WEcount] <= data_in;
WEcount <= WEcount + 1;
end
当从循环缓存data_HC读出数据时,代码示例如下:
if(~EMPTY)
begin
data_out <= data_HC[REcount];
REcount <= Recount + 1;
end
2.2 利用计数器代替波特率产生模块
串口发送模块的时钟一般和串口发送波特率一致,当发送数据时,只需要按照时钟把循环缓存中的数据并/串转换后,按帧格式发送。
串口接收模块的时钟一般是串口接收波特率的16倍频。当接收数据时,由于接收节点和发送节点的时钟异步,所以需要对数据位进行多次采样,采样次数越多,采样点就可以越靠近数据位中点,降低采样错误的概率。但是,采样次数越多,其系统开销就越大。因此,设计串口接收模块的时钟是串口接收波特率的16倍频,每个数据位可以采样16次,并且只取靠近中间的3个采样点,如第7、8、9次,并且对3次的采样点值,通过3判2进行裁决,进一步降低采样误码概率。
上述方法中,需要通过FPGA的主时钟经过PLL锁相环和分频模块产生串口发送时钟和串口接收时钟,分别驱动串口发送模块和串口接收模块。利用计数器完全可以替代波特率产生模块,其优点是只需要FPGA的主时钟,而不进行分频,其时钟相位、延时都不会由于分频而产生变化。
例如,RS422串口全双工通信,收、发波特率都为38400bpt/s,FPGA中模块主时钟用14.745 6 MHz。在串口发送模块,以14.745 6 MHz时钟的上升沿为触发模式进行计数,当计数到384时,进入图5串口发送模块状态机,根据状态机执行相应的动作,并且计数重新置1,主时钟下一个上升沿来时,继续进行计数动作。在串口接收模块,以14.745 6 MHz时钟的上升沿为触发模式进行计数,当计数到24时,进入图6串口接收模块状态机,根据状态机执行相应的动作,并且计数重新置1,主时钟下一个上升沿来时,继续进行计数动作。
2.3 发送模块设计
DSP向数据缓存data_HC写数据,FPGA检测到DSP的串口写信号有效,并且数据缓存未满,把DSP数据总线上的数据装入数据缓存data_HC[WEcount],并且WEcount写指针加1。FPGA中串口发送模块,以主时钟上升沿进行计数,当计数到分频时钟的值(BAND=主时钟频率/发送数据波特率)时,进行状态机判断和跳转,并且计数值重新置1,过程如图5所示。
发送模块状态机设计如下:状态1检测循环缓存data_HC是否为空,如果循环缓存data_HC非空,读取data_HC[REcount]值(1个字节),REcount读指针加1,跳转到状态2,然后依次从状态2~状态12跳转,其状态为发送起始位、数据位0~数据位7,奇偶校验位、停止位。
图5 发送模块设计示意图
2.4 接收模块设计
FPGA中串口接收模块,以主时钟上升沿进行计数,当计数到分频时钟的值(BAND=主时钟频率/(接收数据波特率*16倍频))时,进行状态机判断和跳转,并且计数值重新置1,过程如图6所示。
图6 接收模块设计示意图
接收模块状态机设计如下:状态1检测数据线是否有起始位,如果检测到起始位,跳转到状态2,状态2为检测到起始位的中间位置,然后依次从状态3~状态11跳转,其状态为数据位0~数据位7,奇偶校验位的中间位置采样,最后跳转到状态12,停止位的中间位置,对数据进行奇偶校验,以及判断data_HC是否满,如果未满,把数据写入数据缓存data_HC[WEcount],并且WEcount写指针加1。
DSP可以读取与FPGA约定的两个地址,一个为数据缓存深度地址[4],如addr_data_count,另一个为数据缓存中数据地址,如addr_data。当DSP读取数据缓存深度地址时,FPGA可以把数据缓存深度cnt锁存后放到DSP数据线上。当DSP读取数据缓存中数据地址时,FPGA判断数据缓存data_HC非空后,把data_HC[REcount]锁存后放到数据线上,并且读指针REcount加1。
3 实验结果与分析
在XXX组合导航系统中,FPGA硬件采用A3P1000,DSP采用TI公司的TMS320C6713B,产品包含与陀螺、上位机、转位机构、北斗系统等进行RS422串口通信的11个接收、发送模块。采用改进方法后,在测试过程中,常温条件下,产品连续工作100多个小时,未出现串口通信错误。在高温、低温条件下,分别进行1小时测试,未出现任何通信异常现象,也没有出现误码现象。
在常用方法中,如图2所示,多个模块间需要传递时钟、数据、FIFO控制信号等,系统很容易产生亚稳态。亚稳态就是触发器工作在一种不确定的状态,这种不确定的状态将会影响到下一级触发器,最终导致连锁反应,从而使整个系统功能失常。当信号在异步电路中或多个时钟域之间传输时,容易产生亚稳态现象。在改进方法中,通过模块整合,只采用一个主时钟,所有寄存器时钟输入端共享一个时钟,有效避免了系统亚稳态的产生。
4 结论
本文首先介绍了一种FPGA实现RS422串口通信的常用方法,包括波特率产生、串口发送、串口接收、FPGA的FIFO软核等模块,然后设计并实现了一种改进方法。在改进方法中由于设计了循环缓存代替了FIFO,利用计数器代替了波特率产生模块,因此,可以把串口发送模块整合成一个模块,把串口接收模块整合成一个模块,并且串口发送模块、串口接收模块只采用一个主时钟,采用同步时序电路设计的FPGA,所有寄存器的时钟输入端共享一个时钟,可以有效地消除亚稳态,提高了RS422串口通信的可靠性、稳定性,具有较高的应用推广价值。
[1] 三恒星科技. TMS320C6713 DSP原理与应用实例[M] .北京:电子工业出版社,2012.
[2] ProASIC 3 Flash Family FPGAs 使用手册[Z]. 北京:ACTEL公司,2013.
[3] 夏宇闻. Verilog数字系统设计教程[M] . 北京:北京航空航天大学出版社,2013.
[4] FT-C6713J/250军用DSP产品使用手册[Z]. 北京:国防科学技术大学,2012.
A New Method of RS422 Serial Port Communication Based on FPGA
Liu Jie1,Zang Wei2,Liang Xiaopeng3,Li Junwu4
(1.Guizhou Aerospace Kai Shan Petroleum Instrument Co., Ltd.,Guiyang 550000, China;2.1STMachinery Works of CNPC BOHAI Equipment Manufacturing Co., Ltd., Qingxian 062650, China;3.6STOil Production Plant of Changqing Oilfield, Yulin 718600, China;4.7STOil Production Plant of Changqing Oilfield, Huanxian 745700, China)
The common method of RS422 serial port communication realized by FPGA often encounter many problems, such as FIFO depth is incorrect, the timing of writing FIFO data port and reading FIFO data port are compete, and signal delay between multiple modules leads to FPGA metastable state, so a new method of RS422 serial port communication is proposed. This method replaces the traditional FIFO by using register array as a cyclic queue, uses the counter instead of the baud rate generation module, integrate multiple modules into one module, only one master clock, all registers share one clock with the clock input, and constraints FPGA logic and timing to avoid the FPGA metastable state. The experimental results show that the method is fast, reliable and stable. It can make the whole system more flexible and compact, reduce the whole circuit volume and improve the reliability and stability of the system.
RS422;FPGA;DSP;Verilog HDL
2016-12-12;
2017-02-06。
刘 杰(1984-),女,山东单县人,硕士研究生,工程师,主要从事电路、软件方向的研究。
1671-4598(2017)03-0191-04
10.16526/j.cnki.11-4762/tp.2017.03.052
TP3
A