APP下载

基于有限状态机的高速串口通信收发器的FPGA设计

2018-01-03陈孟春冯建文

计算机应用与软件 2017年12期
关键词:波特率收发器状态机

陈孟春 冯建文

(杭州电子科技大学计算机学院 浙江 杭州 310018)

基于有限状态机的高速串口通信收发器的FPGA设计

陈孟春 冯建文

(杭州电子科技大学计算机学院 浙江 杭州 310018)

针对在多任务操作系统环境下串口通信实时性和高速性受到影响的问题,提出一种基于有限状态机的高速串口通信收发器的FPGA实现方法。串口通信收发器由波特率发生器、发送模块、接收模块和控制与状态四个模块构成,波特率发生器使用锁相环对输入时钟进行倍频和分频;接收模块和发送模块分别使用一个四状态和两状态的有限状态机实现。仿真和实测结果表明,设计的FPGA串口收发器模块电路工作稳定,速度可以达到3 Mbit/s。由于FPGA的高度并行性和有限状态机的稳定性,使用有限状态机实现的FPGA高速串口通信收发器在工业应用中能保证高速串行通信的实时性和可靠性。

有限状态机 高速串行通信 收发器 FPGA

0 引 言

串行通信由于其连线少、可靠性高等特点,被广泛应用于计算机与工业控制系统中[1-2]。传统的RS-232、RS-485异步串行通信接口,更是成为嵌入式处理器上的标准配置接口[3]。然而,在多任务操作系统的应用背景下,因其分时共享CPU,使得串口通信的实时性与高速性受到影响[4]。虽然通过设置缓存或者开辟独立线程来弥补时间片切换所带来的不利影响,但是仍不能满足工业现场对于高速串行通信的需求。随着EDA技术的迅速发展,FPGA的可编程性、高速性、并行性等诸多优点,使其成为可编程PLD的主流器件。本文设计了一种基于FPGA的高速异步串行收发器模块,并使用有限状态机机制,保证了串行通信的高可靠性和高速性。

1 起止式异步串行通信

起止式异步串行通信以一个字符为一个数据帧,帧格式如图1所示。其特点是:逐个字符传输,每个字符逐位传输,并且每帧。总是以低电平的“起始位”开始,以高电平的“停止位”结束,字符之间间隔以高电平的空闲位。帧数据按照起始位(1位)、数据位(5~8位)、奇偶校验位(0或者1位)、停止位(1~2位)、空闲位顺序排列[5]。

图1 起止式异步串行通信数据格式

2 串行通信收发器模块

使用Xilinx FPGA器件与Verilog HDL语言设计的串行通信收发器模块如图2所示。分为波特率发生器、发送模块、接收模块和控制与状态模块[5]。

图2 异步串行收发器模块框图

2.1 波特率发生器

波特率发生器用于产生接收模块所需的接收时钟和发送模块所需的发送时钟,是根据约定的波特率、波特率因子,由100 MHz的时钟源经过倍频和分频产生的。波特率因子为16的收发操作的位同步与采样检测原理如图3所示。

图3 收发数据同步与采样原理

由图3可知,发送数据是在位周期的边缘处动作,即每16个脉冲发送一位,因此发送时钟频率可以等于波特率。而接收时钟,需要更高的采样频率,所以接收时钟频率等于波特率×波特率因子。

本收发器中使用了3 MHz的波特率,需要用到48 MHz的接收时钟,故使用锁相环IP核进行倍频和分频,如图4所示。

图4 锁相环分频向导示意图

2.2 收发机制

对照图3的收发原理,发送数据时,每16个脉冲发送一位二进制,从发送移位寄存器中,按顺序发送起始位(0)、数据位(先低后高)、奇偶校验位(可有可无)、停止位(1)。

接收数据时,则在每个接收时钟的上沿采样数据传输线,一旦监测到“0”(低电平),则表明起始位下跳沿来临,如果数据线上低电平维持了8个采样周期,则表明确实是起始位,而非干扰,此时是起始位位周期的中点。之后每隔16个脉冲采样一次数据线,即在每个位周期中点处接收一位二进制数据,移位进入接收移位寄存器,直到接收完约定位数的帧数据。

3 串行通信的有限状态机

3.1 有限状态机概述

有限状态机包含了一组有限的状态量和两个函数:下一状态函数和输出函数[7],如图5所示。

图5 有限状态机结构图

图5中,rst信号用于确定有限状态机的初始状态(S0)和原始输出,clk用于同步状态转换的边沿或者定时状态转换的周期。状态集包含在中间过程中可能出现的所有状态量,使用触发器保存。下一状态函数,则是通过输入变量和当前状态确定转移到下一状态的组合逻辑函数。输出函数根据当前状态和输入变量产生电路的一组输出变量。与普通的时序逻辑函数一样,如果输出函数仅仅依赖于当前状态,则称该有限状态机为Moore型状态机。如果输出函数不仅依赖于当前状态,也依赖于当前输入,则称该有限状态机为Mealy型状态机[8]。

用硬件描述语言(HDL)描述的FPGA电路大都是并行实现,但是对于实际工程应用,往往需要让硬件来实现一些具有一定顺序逻辑的工作。而有限状态机就是通过不同的状态迁移来完成一些特定的顺序逻辑。因此,有限状态机是FPGA数字系统设计的重要工具与精髓所在[9-10]。

基于FPGA的有限状态机的设计步骤如下[11-12]:

(1) 进行逻辑分析与抽象,确定输入、输出与状态变量,画出状态转移图。

(2) 状态简化,得到最简的状态转移图。

(3) 对状态进行编码:可选择binary、gray、one-hot编码方式之一,在FPGA的开发综合平台和综合工具中,可以进行选择或者自定义。

(4) 用HDL描述,并综合、仿真与实现:描述方式有一段式、二段式和三段式三种方式[11]。

3.2 串行接收模块的有限状态机设计

接收模块始终扫描数据信号线Sin上的电平,一旦有数据传送过来,则按照时钟接收数据,并逐位串行移位至接收移位寄存器中,待数据帧接收完,则并行装入接收缓冲寄存器。使用FPGA实现接收功能的时序如下描述:

(1) 开始通信时,信号线为空闲(逻辑1),当检测到信号线Sin为0时,开始对“接收时钟”计数。

(2) 当计到8个时钟时,对Sin信号进行检测,若仍为低电平,则确认这是“起始位”,而不是干扰信号。

(3) 接收端检测到起始位后,每隔16个接收时钟,读取输入信号Sin至接收移位寄存器,同时右移一位,直至规定的数据帧位数(含数据位和校验位)。

(4) 16个接收时钟后,应该收到停止位,即数据“1”,若未收到,则置位“帧错误”标志FE。

(5) 若收到停止位“1”,则对全部数据位进行奇偶校验,无校验错时,把数据从接收移位寄存器中送接收缓冲寄存器,置“数据准备好”标志RD;如果有校验错,则在状态寄存器中置“奇偶错”标志PE。

(6) 本帧数据接收完,把线路上出现的高电平作为空闲位,回到(1)继续监测下一帧数据。

将上述时序归纳为四个状态:总线空闲状态、检测起始位状态、接收数据位和校验位状态、接收停止位状态,则接收状态机的转换如图6所示,图中以波特率因子等于16为例。

图6 接收状态机状态转移图

假设通信数据格式为:数据位8位,偶检验1位,停止位2位,按照两段式书写方法,接收状态机模块的Verilog HDL程序如下:

module Rev_x(

input rst,

input rev_clk,

//接收时钟

input Sin,

//串行输入

output reg[7:0] Rev_Data,

//并行输出数据

output reg RD,

//已收到一个数据,可以读取

output reg FE,

//帧格式错误

output reg PE,

//校验错误

input clr_RD

//清RD,表明已经读取Rev_Data

);

reg[3:0] bit_cnt;

//接收数据的位数计数器

reg[4:0] clk_cnt;

//时钟计数器

reg[1:0] Rev_ST;

//接收状态机的状态

parameter Idle=0, StartBit=1, DataBit=2, StopBit=3;

//空闲状态,起始位状态,接收数据状态,停止位状态

reg[8:0] shift_reg;

//移位寄存器

always @(posedge rst or posedge rev_clk) begin

if(rst) begin

//初始赋值

Rev_ST <= Idle;

……

//信号清零,略

end

else begin

if (clr_RD) RD <= 1′b0;

case (Rev_ST)

Idle: begin

//空闲状态

clk_cnt <= 5'b0;bit_cnt <= 4′b0;

if(!Sin) Rev_ST<=StartBit;

//状态转移

end

StartBit: begin

//起始位状态

clk_cnt <= clk_cnt + 1′b1; bit_cnt <= 4′b0;

if((!Sin)&&(clk_cnt==5′d8)) begin

//起始位中点

Rev_ST <= DataBit;

//状态转移

clk_cnt <= 5′b0;

end

else if (Sin) Rev_ST <=Idle;

//扰动

else Rev_ST <= StartBit;

end

DataBit: begin

//数据位状态

clk_cnt <= clk_cnt + 1′b1;

if(clk_cnt == 5'd15) begin

//16个脉冲

bit_cnt <= bit_cnt + 1′b1; clk_cnt <= 5′b0;

shift_reg<={Sin,shift_reg[8:1]};

//采样数据

end;

if(bit_cnt == 4′d9) begin

//接收了9位数据

Rev_Data <= shift_reg[7:0];

//数据赋值

if ((^shift_reg[7:0])!=shift_reg[8])

//偶校验

PE <= 1′b1;

//校验错

Rev_ST <= StopBit;

//状态转移

clk_cnt <= 5′b0; bit_cnt <= 4′b0;

end;

end

StopBit: begin

//停止位状态

clk_cnt <= clk_cnt + 1′b1;

if((Sin)&&(clk_cnt==5′d31)) begin

//2位停止位

Rev_ST <= Idle;

//状态转移

RD <= 1′b1;

//接收到一个完整数据帧

end

else if ((!Sin)&&(clk_cnt>5′d8) &&(clk_cnt<5′d31))

begin

//停止位位数不对

Rev_ST <= Idle; FE <= 1′b1;

//帧格式错误

end

end

endcase

end

end

endmodule

接收模块产生的接收标志和错误标志,送给控制与状态模块进行储存,供顶层模块调用。

由于受综合工具的影响,在调试过程中,会碰到有限状态机“跑飞”现象,即状态机可能会进入无效状态,且无法自启动。因此,在ISE中设置有限状态机的综合选项非常重要,譬如状态编码(FSM Encoding Algorithm)选择独热码、开启状态机安全实现开关等,从而使得有限状态机安全、可靠运行。

3.3 串行发送模块的有限状态机设计

发送模块以“发送时钟”和“波特率因子”决定一位的时间长度,如果发送波特率因子为1,则每隔1个发送时钟发送一位,发送时钟的频率等于波特率。发送过程的时序控制如下:

(1) 当初始化后,或者没有信息需要发送时,发送端输出逻辑1到数据线Sout,即空闲位,空闲位可以有任意数量。

(2) 当需要发送时(Send_EN=1),将发送保持寄存器的内容传送到发送移位寄存器,同时置位“发送保持寄存器空”标志THRE。

(3) 发送端首先输出逻辑0到数据线Sout,作为起始位,维持一个位周期。

(4) 下一个发送周期,首先发送移位寄存器最低位,同时右移一位,直到各数据位发送完(含计算得到的校验位)。

(5) 最后,发送端发送规定长度的停止位(逻辑1)。

(6) 如果没有信息需要发送时,发送端继续输出逻辑1,即空闲位,空闲位可以有任意数量;如果还有信息需要发送,转入第(2)步,发送下一帧。

在编程实现时,可以采用发送状态机完成,将上述时序归纳为两个状态:总线空闲状态、发送状态。空闲状态下,始终发送“1”到Sout;当状态机检测到发送使能有效时(Send_EN=1),则进入发送状态,每个发送时钟从Sout发送一位,按约定的数据格式依次发送停止位、数据位、校验位、停止位,发送完成后进入空闲状态。状态转移图如图7(a)所示,发送模块的端口如图7(b)所示。

以同样的数据格式为例,主要程序如下:

always @(posedge rst or posedge send_clk) begin

if(rst) begin

//初始赋值

Send_ST <= Idle; shift_reg <= 12′b0;

bit_cnt <= 4′b0; Sout <= 1′b1; THRE <= 1′b1;

end

else begin

Send_EN1 <= Send_EN;

//记录上一时钟状态

case (Send_ST)

Idle:begin

//空闲状态

Sout <= 1′b1; THRE <= 1′b1; bit_cnt <= 4′b0;

if ((!Send_EN1)&& Send_EN) begin

//上跳沿

shift_reg<={2′b11,^Send_Data,Send_Data,1′b0};

Send_ST <= SendBit;

//状态转移

end;

end

SendBit: begin

//发送状态

Sout <= shift_reg[bit_cnt]; THRE <= 1′b0;

bit_cnt <= bit_cnt + 1′b1;

if(bit_cnt == 4′b1011)

//12位数据发送完成后

Send_ST <= Idle;

end

endcase

end

end

4 仿真与实测

对接收模块进行仿真,结果如图8(a)所示,接收了一帧数据11001001B;对发送模块仿真,结果如图8(b)所示,发送了一帧数据10110001B。

图8 收发模块仿真图

为实现高速的串口通信,需要在顶层模块添加两个FIFO作为接收和发送缓存区[12],顶层模块的结构如图9所示。

图9 顶层模块结构图

测试程序将接收FIFO的dout和发送FIFO的din内部短接,具体由收发控制模块实现:从Sin收到的数据自动写入接收FIFO;只要发送FIFO不满,收发控制模块就自动从接收FIFO读取数据写入发送FIFO;同时只要THRE=1,就自动从发送FIFO读取数据,从Sout发送出去。

测试程序下载到FPGA测试板卡,将板卡的UART-USB口连接到PC机的COM口,连线是普通的USB连接线,图10是实验系统连接图。在PC上,通过串口助手和FPGA互发信息,得到的测试结果如图11所示。

图10 实测与调试系统

图11 PC串口助手收发数据

图11选择重复发送10个数据,则PC机发送数据到FPGA的UART,FPGA顶层模块将接收的数据经由接收FIFO和发送FIFO,又重新发送回PC端。可以看出,在以3 Mbit/s的高速速率连续传输数据时,仍能收发正确。

5 结 语

本文使用有限状态机实现了基于FPGA的高速串行通信收发器的设计,分频器精准,接收自动机和发送自动机完全并行执行,自动差错检测,实时性好,可靠性高,适应于高速系统。经过升级改造后,应用于某航天测控系统的发射控制继电柜,实现了3 Mbit/s的高速RS-422串口通信。

在顶层模块可添加设置通信参数的端口,则将具有更好的通用性;在上层模块设计接收和发送FIFO模块,将进一步提高串行通信的可靠性和速度。

[1] 戴彦,王诚意,孙春.基于FPGA的RS-232串行通信设计[J].唐山学院学报,2011,24(3):74-76.

[2] 刘亚兵,马瑞卿,张庆超,等.基于FIFO的串口通信模式研究[J].计算机测量与控制,2014,22(7):2301-2303.

[3] 于志翔.基于FPGA的UART设计与实现[J].电子测量技术,2015,38(3):77-81.

[4] 罗柠,皮佑国.基于FPGA的高速串行通信接口研究[J].信息技术,2013(7):113-116.

[5] 冯建文,章复嘉,包健,等.基于FPGA的数字电路实验指导书[M].西安:西安电子科技大学出版社,2016:137-140.

[6] 邓岳平,肖铁军.基于FPGA的并行DDS信号发生器的设计与实现[J].计算机工程与设计,2011,32(7):2319-2323.

[7] 陈勇.有限状态机的建模与优化设计[J].重庆工学院学报(自然科学版),2007,21(5):55-58.

[8] Wakerly J F.数字设计原理与实践[M].林生,葛红,金京林,译.4版.北京:机械工业出版社,2007:387-396.

[9] 孔昕,吴武臣,侯立刚,等.基于Verilog的有限状态机设计与优化[J].微电子学与计算机,2010,27(2):180-183.

[10] 刘小平,何云斌,董怀国.基于Verilog HDL的有限状态机设计与描述[J].计算机工程与设计,2008,29(4):958-960.

[11] 吴厚航.深入浅出玩转FPGA [M].2版.北京:北京航空航天大学出版社,2013:35-38.

[12] 陈标龙,王保成,周江华.基于FPGA和FIFO技术的多串口系统设计与实现[J].计算机测量与控制,2013,21(10):2835-2837.

FPGADESIGNFORHIGHSPEEDSERIALCOMMUNICATIONTRANSCEIVERBASEDONFINITESTATEMACHINE

Chen Mengchun Feng Jianwen

(SchoolofComputerScience,HangzhouDianziUniversity,Hangzhou310018,Zhejiang,China)

Under the environment of multitask operating system, the character of real-time and high speed of serial communication is significantly affected. This article puts forward an FPGA implementation method of high speed serial communication transceiver based on finite state machine. The serial communication transceiver consists of four modules, baud rate generator, transmission module, reception module and control and status module. The baud rate generator uses a phase-locked loop to multiply and divide the input clock. The reception module and the transmission module use a finite state machine of four states and two states, respectively. Simulation and experimental results show that the FPGA serial transceiver module circuit works stably with the speed up to 3 Mbit/s. Due to the high parallelism of FPGA and the stability of finite state machine, the FPGA high speed serial communication transceiver based on finite state machine can guarantee the real-time and reliability of high speed serial communication in industrial applications.

Finite state machine High speed serial communication Transceiver FPGA

2017-03-22。国家自然科学基金项目(61471150)。陈孟春,本科生,主研领域:计算机应用。冯建文,副教授。

TP331.2

A

10.3969/j.issn.1000-386x.2017.12.034

猜你喜欢

波特率收发器状态机
清管球收发器设计细节分析及应用
CAN 总线波特率自适应程序设计
基于有限状态机的交会对接飞行任务规划方法
基于FPGA的异步串行通信波特率容错设计
Virtex5 FPGA GTP_DUAL硬核两个收发器独立使用的实现
C*Core芯片SCI串口波特率容限优化
富士通半导体推出收发器家族全新LTE优化多频单芯片MB86L13A
FPGA设计中状态机安全性研究
基于反熔丝FPGA的有限状态机加固设计
计算机多设备接口波特率不匹配的研究