基于有限状态机的UART实现与设计方法的探讨

  • starysoul
  • LV4工程师
  • |      2015-11-22 23:39:44
  • 浏览量 496
  • 回复:1

自从 +=1A9D; 于 #EFG 年建立形式语言的描述 以来,形式语言及自动机的理论发展得很快。这种 理论对计算机科学有着深刻的影响,特别是对程序 设计语言的设计、编译理论和计算复杂性等方面, 更有重大作用。作为自动机理论的重要组成部分, 有限状态自动机是具有离散输入输出系统的一种 数学模型,可用一个五元组来表示:HI6JK5K!KL"KMC, 根据每次转换的后继状态是否唯一,有限状态自动 机又可分为确定的有限状态自动机6)M*C和不确定 的有限状态自动机6NM*C。有限状态自动机的语言 识别能力等价于右线性文法,所定义的语言属于 +=1A9D; 文法体系中的 O 型语言6正规集C。

 在硬件设计中,自动机理论也找到了用武之 地,在我们设计时序电路时,常常使用有限状态自动机理论,手工设计一个时序电路的步骤如下: 6#C 画出状态转移图; 6!C 写出状态转移表; 6OC 写出下一个状态的布尔表达式,并尽可能地 化简; 6PC 写出输出信号的真值表; 6FC 写出输出信号的布尔表达式并化简; 6GC 根据下一状态和输出信号的布尔表达式,画 出逻辑图。 在利用 ()* 工具进行可编程 *&’+ 设计时,我 们经常使用的是一种有输出的有限状态自动机,输 出可以是控制信号也可以是最终的输出。根据输 出、自动机状态及输入三者之间的关系,又可分为 两种自动机:其一,自动机的输出不仅与它所处的 状态有关,而且与输入有关,这种自动机称为米兰 机6H-:0;C;其二,自动机的输出只与到达的状态有 关,称为摩尔机6H11.-C;两种自动机的区分如图 # 所示。在实际设计中,可以根据具体情况选用,并对 自动机的状态选用合适的编码方式,将其存储到以 一组触发器中,下一状态是输入与当前状态的函 数,在输入的约束下在状态之间进行转换,从而完 成控制功能。

基于有限状态机的UART实现与设计方法的探讨

通用异步接受发送器 3*45 是目前广泛使用的一种通用串行数据接口, 其应用范围遍及计算机外设、 工业控制等场合。 3*45 的作用是, 它既可以接收外围设备的串行数据输入,并转换成计算机内 部所需的并行数据,也可以把计算机内部的并行数 据转换成串行数据,并发送给外围设备。$%&’ 主要 由接收器、发送器和控制部分组成,其中接收器和 发送器部分都是双缓冲结构。$%&’ 传送的每个串 行字符由四个部分组成: (#) 一个低电平开始位; (!) *+, 个有效数据位; (-) 一个奇偶校验位; (.) #+! 个高电平停止位。 两个相邻串行字符之间的间隔是高电平的空 闲位,它可以是任意长度。下一个字符的开始,必然 是以高电平的停止位或空闲位变为低电平的开始 位为标志。 $%&’ 在发送或接收数据时,使用的时钟信号 频率是波特率的 #/ 倍,我们称这个时钟信号为波 特时钟,这个时钟由 $%&’ 对外部输入的系统时钟 进行分频得到。$%&’ 每 #/ 个波特时钟发送或接收 一个二进制位,图 ! 表示了 $%&’ 对数据的采样情 形。
图 ! $%&’ 对数据的采样 启动检测 确定检测到开始位 采样数据
01203
#/’
启动位
4%’%
在发送时,由 05$ 来的并行数据由缓冲器接 收,然后送至发送移位寄存器,在波特时钟的同步 下,首先发送低电平开始位,接着由 ’64 线将有效 数据位逐位地串行移出,最后发送奇偶校验位和停 止位,组成一个完整的数据帧。在接收时,接收器部 分监视 &64 线,当发现一个低电平信号,以后又连 续采样到 , 个波特时钟的“"”信号,则确定它是开 始位而非干扰信号,由此开始一个数据帧的接收过 程,以后每隔 #/ 个波特时钟脉冲采样一次 &64 线。 在本次设计的 $%&’ 中,我们采用固定的波特 率、固定的奇偶校验方式(奇校验)以及固定的字符 格式: # 位开始位、 , 位有效数据位、 # 位奇偶校验位 以及 # 位停止位;因此该 $%&’ 是一个不可编程的 串行通信接口。但是串行接口的核心功能已经实 现,由此我们可以比较容易地将其扩充为可编程的 串行通信接口。 !"# $%&’ !"#$%&’()*+,本次设计的 $%&’ 主要由三个模块构成:波特时钟发生器模块 789:;<=>?@A@B8CDBEF、发送器模块 CB8AGHICC@BEF 以及接收模块 B@;@IF@BEF,如图 - 所示。 其中,发送器模块和接收器模块是本 $%&’ 设计的 主要组成部分,也是我们讨论的重点。
发送器部分由发送移位寄存器 CGB、发送保持寄 存器(缓冲器)CJB 以及发送控制逻辑组成;接收器部 分由接收移位寄存器 BGB、接收保持寄存器(缓冲器) BJB 以及接收控制逻辑组成,二者的接口定义如表 # 所示。下面我们将就发送器模块和接收器模块的设 计进行讨论,对于波特时钟发生器模块,由于设计 相对简单,限于篇幅,这里我们不作讨论。 表 # $%&’ 的模块接口定义 KL2 方向 功能描述
公共 信号
MNG>0<= K 输入 $%&’ 的外部系统时钟
O89:;<= K
$%&’ 工作的时钟信号,频率为 波特率的 #/ 倍 &@G@C>1 K 系统复位信号 0G>1 K 片选信号 48C8 KL2 双向并行数据总线
发送 模块 信号
’64 2 串行发送数据线 PBIC@>1 K 并行数据写信号,低电平有效
’>@HQCN 2
发送缓冲器为空,可以接收下一 个要发送的并行数据
接收 模块 信号
&64 K 串行接收数据线
&@8:>R K
接收的并行数据读信号,高电平 有效 &>S9<< 2 接收缓冲器满,主机可以取数据 58BICN>@BB 2 接收数据时发生奇偶校验错误 2F@BT S@BB 2 下一数据已接收完,而上一数据 尚未取走,溢出错误
VB8H@>@BB 2
接收数据时停止位不为 ",发生 帧错误
!"! ./%&0!" 发送器模块的设计主要集中在其控制逻辑的 设计上,我们采用有限状态自动机来作为它的控制


器,在设计中,我们共定义了六个发送器工作状态: $%&’()、$%*+,-+、$%.,&+、$%*/&0+、$%1,-&+2 以及 $%*+31,该自动机的状态转换图如图 4 所示。为了 简化图示,在这里我们没有将状态机的输出在图中 表示出来,实际上,该状态机的输出都在给定的状 态中进行,根据米兰机和摩尔机的定义,我们可知 该状态机属于摩尔机的范畴,下一节将讨论的接收 模块控制逻辑亦属于摩尔机的范畴。对于这六个状 态,我们采用了独热码56789:6$ ;6<8=的编码方式,这 种编码方式虽然较二进制码5>?7@AB9;6<8=编码方式 或格雷码5CA@B9;6<8=编码方式多用了三个触发器, 但却可以省下许多组合电路,综合后的电路更加简 单,可使电路的速度和可靠性得到显著提高,而总 的单元数增加不多,这在触发器资源丰富的 01D, 器件中是一种行之有效的方法。
图 4 E,-+ 发送器的状态转移图
A8F8$G(HH"
$G8IJ$BHH"
$%1,-&+2 K"#""""K
$%*+31 K#"""""K
$%*/&0+ K""#"""K
$%.,&+ K"""#""K
$%*+,-+ K""""#"K
$%&’() K"""""#K$G8IJ$BHH#
;LMG;6N7$OH#P
;LMG;6N7$OH#Q
;LMG;6N7$OH#P
;LMG;6N7$OH#P
$RG;6N7$HHS
;LMG;6N7$HH#Q
;LMG;6N7$HH#P
ARG;6N7$OHHS
;LMG;6N7$HH#P
;LMG;6N7$HH#P @7< $G8IJ$B
;LMG;6N7$HH#P @7< 76$ $G8IJ$B
由于是每 #P 个波特时钟发送一个二进制位, 因此我们需要设立一个 4 位的同步计数器来计数 波特时钟;为了判断有效数据位是否发送完,我们 将 4 位的波特时钟计数器扩展到 S 位,这样计数器 的高 4 位正好表示了发送二进制位的个数,利用这 一点,可以减少控制信号,简化设计过程。 当电路复位以后,控制器首先进入 $%&’() 状 态,当检测到缓冲器 $:A 不空时,转入到 $%*+,-+ 状 态,控制发送器发送低电平开始位;随后进入 $%.,&+ 状态,开始发送有效数据位,当计数器计数 #Q 个波特时钟后,转入 $%*/&0+ 状态,发出移位信 号;之后进入下一 $%.,&+ 状态,发送下一位数据 位;当 S 位有效数据位发送完之后,进入 $%1,-&+2 状态,发送奇偶校验位;最后转入 $%*+31 状态,发 送停止位;这样就完成了一个数据帧的发送过程。

接收器模块的设计要相对复杂一些,因为它需 要正确判断接收时刻以及进行一些错误检测。对于 接收器模块,其控制逻辑仍然采用有限状态自动机 来设计,我们共定义了 P 个状态,仍采用独热码编 码方式,控制状态转移的波特时钟计数器共七位, 其中高三位计数位表示了接收的二进制数据位数。 该状态机的状态转换图如图 P 所示。
图 P E,-+ 接收器的状态转移图
A8F8$G(HH"
A%1,-&+2 K"#""""K
A%*+31 K#"""""K
A%*,W1() K""#"""K
A%.,&+ K"""#""K
A%*+,-+ K""""#"K
A%&’() K"""""#K-R’HH#
;LMG;6N7$OH#P
;LMG;6N7$OH#Q
;LMG;6N7$OH#P
;LMG;6N7$OHS
$RG;6N7$HHS
;LMG;6N7$HH#Q
;LMG;6N7$HH#P
ARG;6N7$OHHS
;LMG;6N7$HHS @7< -R’HH#
;LMG;6N7$HH#P
-R’HH"
;LMG;6N7$HHS @7< -R’HH"
系统复位后,状态机默认为 A%&’() 状态,当检 测到 -R’ 线出现低电平信号后,则转入到 A%*+,-+ 状态,并开始对波特时钟进行计数,当计数到 S 时, 即接收位单元的中间时,若 -R’ 线上仍为低电平, 则确定这是一个开始位,随后状态机交替进入 A%.,&+ 状态和 A%*,W1() 状态接收 S 个有效数据 位,之后状态机进入 A%1,-&+2 状态接收奇偶校验 位,最后进入 A%*+31 状态接收停止位,完成一个数 据帧的接收过程。 同样,我们给出了接收器的后仿真波形,其中

假定接收的数据帧是 "#"#"#"##"#,并将某些重要 的中间信号也输出进行观察,见图 $。
图 $ %&’( 接收器的后仿真波形图
)*+,-./
0121345
01*,46
-245
’78
,*3*
049+.. :*0;3<4⋯ 90*=14⋯ >?109.>⋯
0423*31
2@;93
020
AA BB 8C
"# "! "D "D "D "D "D "D "D "D #" !" "#
"" E" D" &" C" &E CD && 8C
! !"#$%&’( 我们还采用了另外一种方法来设计 %&’(,这 种方法不用状态机来控制 %&’( 接收发送数据,其 主要思想是在发送移位寄存器和接收移位寄存器 的两端分别添加适当的辅助寄存器,并置以适当的 初值,在发送或接收过程中,通过辅助寄存器以及 移位寄存器各位的状态组合来判断发送或接受处 于哪个阶段。在设计中,我们感到这种方法需要精 巧的构思,控制信号复杂,调试不便,对于规模更大 的电路而言,其设计速度显然难以提高。 采用有限状态机方法,由于其状态及状态之间 的转换关系明确,设计过程直观简单,易于理解,设 计程序便于阅读存档,可以大大加快设计流程;但 是这种方法所消耗的器件资源可能会略多于传统 的设计方法,这可以通过优化程序组织使其降至最 低,因此在器件资源丰富的今天在多数场合下是一 种值得推荐的方法。此外,目前某些 F8& 工具,例 如 &-3;?1G685,可以直接支持状态图输入的方式, 并可转换成 H10;.>I 685 或者 H685 代码,这在一 定场合下还是很有效的。

的 ’J!M! 标准接口,或者可以作为一个模块嵌入到 其他电路中组成应用系统。在此基础上,我们可以 比较容易地将其扩展为一个可编程的串行接口,并 可进一步实现与 ;N31. E!C" 接口芯片相兼容。









  • 0
  • 收藏
  • 举报
  • 分享
我来回复

登录后可评论,请 登录注册

所有回答 数量:1
镇江醋 2015-11-25

 谢谢分享啊

0   回复
举报
发布
x
收藏成功!点击 我的收藏 查看收藏的全部帖子