基于FPGA的电子计算器设计(上)

2020-12-30 15:45:58 浏览数 (1)

大侠好,欢迎来到FPGA技术江湖,江湖偌大,相见即是缘分。大侠可以关注FPGA技术江湖,在“闯荡江湖”、"行侠仗义"栏里获取其他感兴趣的资源,或者一起煮酒言欢。

今天给大侠带来基于FPGA的电子计算器设计,由于篇幅较长,分三篇。今天带来第一篇,上篇,话不多说,上货。

导读

本篇介绍了一个简单计算器的设计,基于 FPGA 硬件描述语言 Verilog HDL,系统设计由计算部分、显示部分和输入部分四个部分组成,计算以及存储主要用状态机来实现。显示部分由六个七段译码管组成,分别来显示输入数字,输入部分采用4*4矩阵键盘,由0-9一共十个数字按键,加减乘除四个运算符按键,一个等号按键组成的。通过外部的按键可以完成加、减、乘、除四种功能运算,其结构简单,易于实现。本篇为本人毕业设计部分整理,各位大侠可依据自己的需要进行阅读,参考学习。

第一篇内容摘要:本篇会介绍绪论,包括Verilog的发展、Verilog的特点、Verilog语言结构、FPGA开发环境简介等相关内容;还会有现场可编程门阵列(FPGA)简介,包括可编程逻辑器件、现场可编程门阵列(FPGA)等相关内容。还会介绍整体系统设计,包括数码管显示、按键部分原理以及状态机原理等相关内容。

前言

在国外,电子计算器在集成电路发明后,只用短短几年时间就完成了技术飞跃,经过激烈的市场竞争,现在的计算器技术己经相当成熟。计算器已慢慢地脱离原来的“辅助计算工具”的功能定位,正在向着多功能化、可编程化方向发展,在各个领域都得到了广泛的应用。用计算器不仅可以实现各种各样复杂的数学计算还可以用来编制、运行程序,甚至解方程组,图形计算器还可以进行图形处理。计算器内置的软件允许用户进行类似于对计算机的文件和目录管理等操作,允许用户对图形界面进行定制,同时各种新技术也被应用到计算器里使计算器功能越来越强大。可以说,计算器就是一个“微微型”的计算机。国内也有厂商利用计算器芯片开发新的产品,但对计算器技术的研究、计算器芯片的设计还处于起步阶段。计算器的主要功能还是在于“计算”,不妨称之为“低档计算器”。即便是对这种计算器,很多厂商也只从事计算器的组装、销售业务。一些IC设计公司、芯片提供商也开始研究计算器技术。

本次设计基于现场可编程逻辑器件FPGA进行设计,应用硬件描述语言Verilog编程并在Altera公司的QuartusⅡ软件上实现仿真。需要进行计算器的常用运算功能的实现,通过外接键盘输入、LED数码显示来达成运算目的。

一、绪论

Verilog HDL 是一种硬件描述语言(HDL:Hardware Description Language),以文本形式来描述数字系统硬件的结构和行为的语言,用它可以表示逻辑电路图、逻辑表达式,还可以表示数字逻辑系统所完成的逻辑功能。Verilog HDL和VHDL是世界上最流行的两种硬件描述语言,都是在20世纪80年代中期开发出来的。前者由Gateway Design Automation公司(该公司于1989年被Cadence公司收购开发)。两种HDL均为IEEE标准。

1.1 Verilog HDL 的发展

Verilog是由Gateway设计自动化公司的工程师于1983年末创立的。当时Gateway设计自动化公司还叫做自动集成设计系统(Automated Integrated Design Systems),1985年公司将名字改成了前者。该公司的菲尔·莫比(Phil Moor by)完成了Verilog的主要设计工作。1990年,Gateway设计自动化被Cadence公司收购。

1990年代初,开放Verilog国际(Open Verilog International,OVI)组织(即现在的Accellera)成立,Verilog面向公有领域开放。1992年,该组织寻求将Verilog纳入电气电子工程师学会标准。最终,Verilog成为了电气电子工程师学会1364-1995标准,即通常所说的Verilog-95。

设计人员在使用这个版本的Verilog的过程中发现了一些可改进之处。为了解决用户在使用此版本Verilog过程中反映的问题,Verilog进行了修正和扩展,这部分内容后来再次被提交给电气电子工程师学会。这个扩展后的版本后来成为了电气电子工程学会1364-2001标准,即通常所说的Verilog-2001。Verilog-2001是对Verilog-95的一个重大改进版本,它具备一些新的实用功能,例如敏感列表、多维数组、生成语句块、命名端口连接等。目前,Verilog-2001是Verilog的最主流版本,被大多数商业电子设计自动化软件包支持。

2005年,Verilog再次进行了更新,即电气电子工程师学会1364-2005标准。该版本只是对上一版本的细微修正。这个版本还包括了一个相对独立的新部分,即Verilog-AMS。这个扩展使得传统的Verilog可以对集成的模拟和混合信号系统进行建模。容易与电气电子工程师学会1364-2005标准混淆的是加强硬件验证语言特性的SystemVerilog(电气电子工程师学会1800-2005标准),它是Verilog-2005的一个超集,它是硬件描述语言、硬件验证语言(针对验证的需求,特别加强了面向对象特性)的一个集成。

2009年,IEEE 1364-2005和IEEE 1800-2005一共两个部分合并为IEEE 1800-2009,成为了一个新的、统一的SystemVerilog硬件描述验证语言(hardware description and verification language,HDVL)。

1.2 Verilog HDL 的特点

描述复杂的硬件电路,设计人员总是将复杂的功能划分为简单的功能,模块是提供每个简单功能的基本结构。设计人员可以采取“自顶向下”的思路,将复杂的功能模块划分为低层次的模块。这一步通常是由系统级的总设计师完成,而低层次的模块则由下一级的设计人员完成。自顶向下的设计方式有利于系统级别层次划分和管理,并提高了效率、降低了成本。“自底向上”方式是“自顶向下”方式的逆过程。

1.3 Verilog HDL 的语言结构

Verilog的设计初衷是成为一种基本语法与C语言相近的硬件描述语言。这是因为C语言在Verilog设计之初,已经在许多领域得到广泛应用,C语言的许多语言要素已经被许多人习惯。一种与C语言相似的硬件描述语言,可以让电路设计人员更容易学习和接受。不过,Verilog与C语言还是存在许多差别。另外,作为一种与普通计算机编程语言不同的硬件描述语言,它还具有一些独特的语言要素,例如向量形式的线网和寄存器、过程中的非阻塞赋值等。总的来说,具备C语言的设计人员将能够很快掌握Verilog硬件描述语言。下面介绍Verilog语言基本规范:

1)空白符

空白符是指代码中的空格(对应的转义标识符为b)、制表符(t)和换行(n)。如果这些空白符出现在字符串里,那么它们不可忽略。除此之外,代码中的其他空白符在编译的时候都将会被视为分隔标识符,即使用2个空格或者1个空格并无影响。不过,在代码中使用合适的空格,可以让上下行代码的外观一致(例如使赋值运算符位于同一个竖直列),从而提高代码的可读性。

2)注释

为了方便代码的修改或其他人的阅读,设计人员通常会在代码中加入注释。与C语言一样,有两种方式书写注释。第一种为多行注释,即注释从/*开始,直到*/才结束;另一种为单行注释,注释从//开始,从这里到这一行末尾的内容会被系统识别为注释。

3)某些电子设计自动化工具,会识别出代码中以特殊格式书写、含有某些预先约定关键词的注释,并从这些注释所提取有用的信息。这些注释不是供人阅读,而是向第三方工具提供有关设计项目的额外信息。例如,某些逻辑综合工具可以从注释中读取综合的约束信息。

4)大小写敏感性

Verilog是一种大小写敏感的硬件描述语言。其中,它的所有系统关键字都是小写的。

5)标识符及保留字

Verilog代码中用来定义语言结构名称的字符称为标识符,包括变量名、端口名、模块名等等。标识符可以由字母、数字、下划线以及美元符($)来表示。但是标识符的第一个字符只能是字母、数字或者下划线,不能为美元符,这是因为以美元符开始的标识符和系统任务的保留字冲突。

和其他许多编程语言类似,Verilog也有许多保留字(或称为关键字),用户定义的标识符不能够和保留字相同。Verilog的保留字均为小写。变量类型中的wire、reg、integer等、表示过程的initial、always等,以及所有其他的系统任务、编译指令,都是关键字。可以查阅官方文献以完整的关键字的列表。

1.4 FPGA开发环境简介

系统电路的软件设计可采用工具软件Quartus Ⅱ,用该工具软件所支持的语言——硬件描述语言,以文本的方式进行编程输入。在编程时分别对控制、计数、锁存、译码等电路模块进行Verilog文本描述,使每个电路模块以及器件都以文本的形式出现,然后通过编译、波形分析、仿真、调试来完善每个器件的功能。单个器件制作完成后,然后将它们生成库文件,并产生相应的符号,最后用语言将各个已生成库文件的器件的各个端口连接在一起,从而形成了系统主电路的软件结构。在连接器件时,也可以采用图形输入方式,即在图形输入界面中调出先制作好的库文件器件符号,再将每个器件符号的各端口直接连线,从而构成系统主电路。在上述工作的基础上,再进行波形分析、仿真调试便完成整个软件设计。

二、现场可编程门阵列(FPGA)简介

2.1 可编程逻辑器件简介

可编程逻辑器件(PLD——Programmable Logic Devices)是一种由用户编程以实现某种逻辑功能的新型逻辑器件。它诞生于20世纪70年代,在20世纪80年代以后,随着集成电路技术和计算机技术的发展而迅速发展起来的。可编程逻辑器件自问世以来,PLD经历了从PROM、PLA、PAL、GAL到FPGA、ispLSI等高密度PLD的发展过程。在此期间,PLD的集成度、速度不断提高,功能不断增强,结构趋于更合理,使用变得更灵活方便。PLD的出现打破了由中小型通用型集成电路和大规模专用集成电路垄断的局面。与中小规模通用型集成电路相比,用PLD实现数字系统,有研制周期短、先期投资少、无风险、修改逻辑设计方便、小批量生产成本低等优势。

随着可编程逻辑器件性能价格比的不断提高,EDA开发软件的不断完善,现代电子系统的设计将越来越多地使用可编程逻辑器件,特别是大规模可编程逻辑器件。如果说一个电子系统可以像积木堆积起来的话,那么现在构成许多电子系统仅仅需要3种标准的积木块——微处理器、存储器和可编程逻辑器件,甚至只需一块大规模可编程逻辑器件。PAL(Programmable Array Logic)器件是20世纪70年代末期出现的一种低密度、一次性可编程逻辑器件。GAL(Generic Array Logic)器件是继PAL器件之后,在20世纪80年代中期推出的一种低密度可编程逻辑器件。它在结构上采用了输出逻辑宏单元(OLMC——Output Logic Macro Cell)结构形式,在工艺上吸收EEPROM的浮栅技术,从而使GAL器件具有可擦除、可重新编程、数据可长期保存的结构特点。CPLD(Complex Programmable Logic Device)是万门以上的复杂可编程逻辑器件,采用CMOS EPROM、EEPROM、快闪存储器和SRAM等编程技术,从而构成高密度、高速度和低功耗的可编程逻辑器件。

2.2 现场可编程门阵列(FPGA)

FPGA是现场可编程门阵列(Field Programmable Gate Array)的简称。FPGA器件及其开发系统是开发大规模数字集成电路的新技术。它利用计算机辅助设计,绘制出实现用户逻辑的原理图、编辑布尔方程或用硬件描述语言等方式作为设计输入;然后经一系列转换程序、自动布局布线、模拟仿真的过程;最后生成配置FPGA器件的数据文件,对FPGA器件初始化。这样就实现了满足用户要求的专用集成电路,真正达到了用户自行设计、自行研制和自行生产集成电路的目的。

FPGA是一种半定制的集成电路,其特点是直接面向用户,具有极大的灵活性和通用性,开发效率高,硬件测试和实现快捷,工作可靠性好而且技术维护简单。

FPGA相对于CPLD而言,其结构特点在于FPGA是基于查找表look-up-table的。查找表(look-up-table)简称为LUT,LUT本质上是一个RAM。FPGA使用4输入的LUT,所以每一个LUT 可以看成一个有4位地址线的16*1的RAM。当用户通过原理图或HDL语言描述了一个逻辑电路后,PLD/FPGA开发软件会自动计算逻辑电路的所有可能的结果,并把结果事先写入RAM,这样,每输入一个信号进行逻辑运算就等于输入一个地址进行查表,找出地址对应的内容,然后输出即可。

2.2.1 FPGA的器件结构与工作原理

FPGA(Field Programmable Gate Array)即现场可编程逻辑阵列,是大规模可编程集成电路的主流器件。FPGA一般由三种可编程电路和一个用于存放编程数据的SRAM(静态随机存储器)组成,这三种可编程电路是:可编程逻辑阵列LAB(Logic Array Block),输入输出模块IOB(I/O Block)和互连资源IR(Interconnect Resource)。FPGA可编程逻辑形成的方法是基于查找表LUT(Look Up Table)结构的,LUT是可编程的最小逻辑构成单元。

1)可编程逻辑阵列LAB

可编程逻辑阵列是由一系列相邻的逻辑单元LE(Logic Element)构成的,每个LAB包括八个逻辑单元LE、相连的进位链和级联链,LAB控制信号和LAB局部互连。LAB的构成、ACEK系列芯片的“粗粒度(coarse-grained)”结构,有利于EDA软件进行布局布线,优化器件的利用进而提高整个数字系统的性。

其中的逻辑单元LE是一种基于查找表的函数发生器。它能够实现4输入1输出的任意逻辑函数。每个LE包含一个4输入的查找表、一个带有同步使能的可编程触发器、一个进位链和一个级联链。每个LE有两个输出分别可以驱动局部互连和快速通道互连。LE有两个输出驱动内部互连,一个是驱动局部互连输出,另一个驱动行或列的快速通道Fast Track的互连输出,这两个输出可以单独控制。因此在一个逻辑单元LE中的触发器和查找表能够用来完成不相关的功能,从而提高LE的资源利用率。

在ACEK系列芯片的结构中还提供了两种专用的高速数据通道,用于连接相邻的LE,但不占用局部互连通路,它们是进位链和级联链。进位链用来支持高速计数器和加法器,它提供了LE之间的快速向前进位功能。来自低位的进位信号经进位链向前直接送到高位,同时反馈入查找表和进位链的下一段。这种特点使得ACEK结构能够实现高速计数器、加法器和宽位比较器。级联链可以用来实现多输入数的逻辑函数。相邻的查找表并行地完成部分逻辑功能,级联链把中间结果拼接起来。进位链和级联链的使用有利于提高器件的工作速度,但是大量使用进位链和级联链会限制布局布线的灵活性,导致资源的浪费。因此在设计过程应该权衡考虑,在FPGA芯片资源利用和工作速度之间寻求平衡。

2)输入/输出模块IOB

ACEK器件的I/O引脚是由一些I/O单元驱动的。IOE(I/O Element)位于快速通道的行和列末端,包含一个双向的缓冲器和一个寄存器。这个寄存器可以用作需要快速建立时间的外部数据输入寄存器,也可以作为需要快速“时钟到输出”性能的数据输出寄存器。IOE可以配置成输入、输出或双向口。

ACEK器件中的IOE具有许多特性,支持JTAG编程、三态缓冲和漏极开路输出等等。每个IOE的时钟、清零、时钟使能和输出使能的控制均由I/O控制信号网络提供,采用高速驱动以减小通过器件的时间偏差。此外,ACEK器件还提供了若干专用输入引脚,这些引脚用来驱动IOE寄存器的控制端,使用了专用的布线通道,以便具有比快速通道更短的延迟和更小的偏差。

3)互连资源IR

可编程的互连资源包括各种长度的金属连线线段和一些可编程的连线开关,它们将各个逻辑阵列之间、及其与IO模块之间互相连接起来,构成各种功能复杂的系统。

在ACEK中互连结构是通过快速通道(Fast Track)实现的。Fast Track遍布于整个ACEK器件,是一系列水平和垂直走向的连续式布线通道。每一行的LAB都有一个专用的“行互连”,“行互连”可以驱动。I/O引脚或馈送到器件中的其LAB;“列互连”连接各行,也能驱动I/O引脚。这种布线结构能够有效提高布线效率,使得即使非常复杂的设计也能够测定其延时性。

4)嵌入式阵列块EAB

嵌入式阵列块EAB是在输入输出口上带有寄存器的灵活的RAM块,是由一系列嵌式RAM单元组成的。EAB的逻辑功能是在配置期间,用只读模式对EAB编程产生一个大型查找表来实现的。采用查找表实现组合逻辑比一般算法快,EAB的快速时间通道使得这一先进性能进一步得到加强。当要实现存储器功能时,每个EAB提供2048比特位,每一个EAB是一个独立的结构,它具有共同的输入、互连和控制信号。每个EAB含有一个行互连馈端,EAB的输出能够同时驱动行互连通道和列互连通道。这一特性增加了EAB的可利用布线资源。因此,EAB可以非常方便地用于实现一些规模不大的RAM、ROM、FIFO等功能模块;同时在实现地址译码器、状态机、微控制器等复杂逻辑时也具备了一定优势。

2.2.2 基于EDA平台的FPGA开发流程

一个完整、典型的EDA设计流程即是自顶向下设计方法的具体实施过程,也是EDA软件本身的组成结构。在实践中进一步了解支持这一个设计流程的诸多设计工具,有利于排解设计中的具体问题,提高设计质量。

1)设计输入

基于EDA软件平台的FPGA开发流程,一般有两种设计输入方式:图形输入和硬件描述语言文本输入。下面将重点介绍采用Verilog硬件描述语言进行设计输入方法,这是我们在设计开发过程中采用的主要方法。Verilog作为电子工程主流硬件描述语言,是EDA技术的重要组成部分。它于1983年由美国国防部创建,由IEEE协会进一步发展并在1987年成为IEEE国际标准。自IEEE协会公布了Verilog标准版本(IEEE Std 1076)之后,各大EDA公司相继推出支持Verilog语言的开发环境。从此Verilog作为硬件描述语言的业界标准之一,在电子设计领域得到广泛应用,并逐步成为事实上的通用硬件描述语言。

Verilog语言具有很强的电路建模能力,具有良好的电路行为描述和系统描述的能力,能从多个层次对数字系统进行建模和描述;Verilog语言还具有与硬件电路无关和设计平台无关的特性,并且在语言易读性和层次化结构化设计方面表现了强大的生命力和应用潜力。这些特性使得Verilog语言在支持自顶向下的EDA设计流程方面显得游刃有余。因此,采用Verilog进行电子系统设计可以让设计者专心致力于其功能的实现,而不需要对不影响功能的与工艺相关的问题花费过多的时间和精力,提高了设计效率和可靠性。

采用Verilog文本设计输入与传统的计算机软件语言编辑输入基本上一样,就是使用Verilog描述数字系统的功能,进行文本编辑输入。事实上,纯粹的Verilog设计输入方法仍然是最基本、最有效和最普遍的设计输入方法。

2)设计综合

在电子设计领域“综合”的概念可以表示为:将行为和功能层次表达的电子系统转化为低层次的便于具体实现的模块组合装配而成的过程。事实上,设计过程通常从高层次的行为描述开始,直到最底层的结构描述结束,每一个步骤都是上一个层次的综合转换。在FPGA设计开发过程中,整个综合过程就是设计者在EDA软件平台上编辑输入Verilog文本,依据给定电路结构组件和约束控制条件进行编译、优化、转换和综合,最终获得门级电路甚至更底层的电路描述网表文件。因此设计综合的过程就是将软件设计的Verilog描述文本与硬件结构挂钩,是软件描述转化为硬件电路的关键步骤,是文本描述与硬件实现之间的一座桥梁。

3)结构适配

适配器也称为结构综合器,它的功能是将综合器产生的网表文件配置于指定的FPGA目标器件中,使之产生最终的下载文件。适配过程中所选定的FPGA目标器件必须属于综合器原来指定的目标器件系列,这是因为适配器的适配对象是直接与器件的结构细节相对应的。逻辑综合通过后必须利用适配器将综合后的网表文件针对某一具体目标器件进行逻辑映射操作,其中包括底层器件配置、逻辑分割、逻辑优化、逻辑布局布线操作。适配完成后可以利用适配所产生的仿真文件作精确的时序仿真,同时产生可用于编程下载文件。

4)功能仿真和时序仿真

在编程下载前必须利用EDA工具对配置生成的结果进行模拟分析,这就是所谓的仿真。仿真的过程就是让计算机根据一定的算法和一定的仿真库对EDA设计进行模拟,以验证设计,排除错误。仿真包括功能仿真和时序仿真。

功能仿真:不经过综合和适配阶段,在设计项目编译后直接进入门级仿真器进行模拟测试。主要用于测试设计项目的逻辑功能,用以了解其实现的功能是否满足设计要求,在功能仿真的过程不涉及任何具体器件的硬件特性。

时序仿真:当设计项目通过功能仿真初步确定满足设计要求后,需要绑定具体器件进行时序仿真。时序仿真就是接近真实器件运行特性的仿真,仿真文件包含了器件硬件特性参数,因而仿真精度高。

5)编程下载

把适配后生成的下载或配置文件,通过编程器或编程电缆向FPGA进行下载,以便进行硬件调试和验证,从而实现满足设计要求的电子系统。

三、整体设计原理介绍

FPGA具有运算速度快,编程简易等优点,它是在PAL、GAL、CPLD等可编程器件的基础上进一步发展的产物。它还是作为专用集成电路领域中的一种半定制电路而出现的,既解决了定制电路的不足,又克服了原有可编程器件门电路数有限的缺点。所以我采用FPGA原理设计了本次计算器,主要包括数码管部分,按键电路部分以及运算器部分,设计方案基本原理如下。

3.1 数码管显示

数码管的显示分为两种,静态显示和动态显示,在这里我们使用的是动态显示。动态显示的特点是将所有位数码管的段选并联在一起,由位选线控制是哪一位数码管是有效的。这样一来,就没有为每一位数码管配置一个锁存器的必要,从而就会大大简化了硬件电路。选亮的数码管采用动态扫描显示。所谓的动态扫描显示就是轮流向各位数码管送出字形码和相应的位选,利用发光管的余辉和人眼视觉暂留作用,使人的感觉好像各位数码管在同时都在显示。动态的显示的亮度要比静态的显示略差了一些,因而我们在选择需要的限流电阻应小于静态显示电路中的。

3.2 按键部分原理

我们采用了4*4矩阵键盘扫描在键盘中按键数量较多时,为了减少I/O口的占用,通常将按键排列成矩阵形式。在矩阵式键盘中,每条水平线和垂直线在交叉处不直接连通,而是通过一个按键加以连接。这样,一个端口就可以构成4*4=16个按键,比之直接将端口线的应用于键盘多出了一倍,而且线数越多,区别越明显,比如再多加一条线就可以构成20键的键盘,而直接用端口线则只能多出一键(9键)。由此可见,我们在需要的键数比较多时,采用矩阵法来做键盘是合理的。

矩阵式结构的键盘显然比直接法要复杂一些,识别也要复杂一些,列线通过了电阻连接正电源,并将行线所接的I/O口作为输出端,而列线所接的I/O口则作为输入。这样,当按键没有按下时,所有的输入端都是高电平,代表无键按下。行线输出是低电平,一旦有键按下,则输入线就会被拉低,这样,通过读入输入线的状态就可得知是否有键按下了。下面我们介绍行扫描法。

行扫描法又称为逐行(或列)扫描查询法,是一种最常用的按键识别方法,介绍过程如下。

首先判断键盘中有无键按下:将全部行线置低电平,然后检测列线的状态。只要有一列的电平为低,则表示键盘中有键被按下,而且闭合的键位于低电平线与4根行线相交叉的4个按键之中。若所有的列线均是高电平,则键盘中无键按下。

其次判断闭合键所存在的位置:在确认有键按下后,即可进入确定具体闭合键的过程。其方法是:依次将行线置为低电平,就是在置某根行线为低电平时,其它线为高电平。在确定某根行线位置为低电平后,再逐行检测各列线的电平状态。若某列为低,则该列线与置为低电平的行线交叉处的按键就是闭合的按键。

3.3 状态机原理

运算部分我们主要应用了状态机进行运算和存储的,主要是有限状态机,下面对有限状态机进行简单的介绍。

状态机简写为FSM(Finite State Machine),主要分为2大类:第一类,若输出只和状态有关而与输入无关,则称为Moore状态机;第二类,输出不仅和状态有关而且和输入有关系,则称为Mealy状态机。要特别注意的是,因为Mealy状态机和输入有关,输出会受到输入的干扰,所以可能会产生毛刺(Glitch)现象,使用时应当注意。事实上现在市面上有很多EDA工具可以很方便的将状态图的描述转换成可以综合的Verilog程序代码。

关于状态机的一个极度确切的描述是它是一个有向图形,由一组节点和一组相应的转移函数组成。状态机通过响应一系列事件而“运行”。每个事件都在属于“当前”节点的转移函数的控制范围内,其中函数的范围是节点的一个子集。函数返回“下一个”(也许是同一个)节点。这些节点中至少有一个必须是终态。当到达终态,状态机停止。

包含一组状态集(states)、一个起始状态(start state)、一组输入符号集(alphabet)、一个映射输入符号和当前状态到下一状态的转换函数(transition function)的计算模型。当输入符号串,模型随即进入起始状态。它要改变到新的状态,依赖于转换函数。在有限状态机中,会有有许多变量,例如,状态机有很多与动作(actions)转换(Mealy机)或状态(摩尔机)关联的动作,多重起始状态,基于没有输入符号的转换,或者指定符号和状态(非定有限状态机)的多个转换,指派给接收状态(识别者)的一个或多个状态,等等。

传统应用程序的控制流程基本是顺序的:遵循事先设定的逻辑,从头到尾地执行。很少有事件能改变标准执行流程;而且这些事件主要涉及异常情况。“命令行实用程序”是这种传统应用程序的典型例子。

另一类应用程序由外部发生的事件来驱动——换言之,事件在应用程序之外生成,无法由应用程序或程序员来控制。具体需要执行的代码取决于接收到的事件,或者它相对于其他事件的抵达时间。所以,控制流程既不能是顺序的,也不能是事先设定好的,因为它要依赖于外部事件。事件驱动的GUI应用程序是这种应用程序的典型例子,它们由命令和选择(也就是用户造成的事件)来驱动。

Web应用程序由提交的表单和用户请求的网页来驱动,它们也可划归到上述类别。但是,GUI应用程序对于接收到的事件仍有一定程度的控制,因为这些事件要依赖于向用户显示的窗口和控件,而窗口和控件是由程序员控制的。Web应用程序则不然,因为一旦用户采取不在预料之中的操作(比如使用浏览器的历史记录、手工输入链接以及模拟一次表单提交等等),就很容易打乱设计好的应用程序逻辑。

显然,必须采取不同的技术来处理这些情况。它能处理任何顺序的事件,并能提供有意义的响应,即使这些事件发生的顺序和预计的不同。有限状态机正是为了满足这方面的要求而设计的。

有限状态机是一种概念性机器,它能采取某种操作来响应一个外部事件。具体采取的操作不仅能取决于接收到的事件,还能取决于各个事件的相对发生顺序。之所以能够做到这一点,是因为机器能跟踪一个内部状态,它会在收到事件后进行更新。为一个事件而响应的行动不仅取决于事件本身,还取决于机器的内部状态。另外,采取的行动还会决定并更新机器的状态。这样一来,任何逻辑都可建模成一系列事件/状态组合。

状态机可归纳为4个要素,即现态、条件、动作、次态。这样的归纳,主要是出于对状态机的内在因果关系的考虑。“现态”和“条件”是因,“动作”和“次态”是果。

有限状态机用于描述电路模型的时序行为,所有的输入都可以看成是模型的激励,所有的输出可以看成是模型对激励的响应。CLK提供时间基准。

图3-1 抽象时序电路的行为模型

Figure 3-1 abstract behavior model of sequential circuits

时序电路模型可以表示为:R=F(t),这里F(t)是模型行为的描述。当电路的输出仅仅与状态时间有关时候,所描述的模型为摩尔型状态机;当电路的输出不仅与时间有关,也与当前的输入信号有关时,称为米利型状态机。

本篇到此结束,下一篇带来基于FPGA的电子计算器设计(中),介绍计算器设计的电路部分以及总体代码设计等相关内容。

END

后续会持续更新,带来Vivado、 ISE、Quartus II 、candence等安装相关设计教程,学习资源、项目资源、好文推荐等,希望大侠持续关注。

大侠们,江湖偌大,继续闯荡,愿一切安好,有缘再见!

0 人点赞