FPGA教学课件:第5章 有限状态机设计

上传人:努力****83 文档编号:189269780 上传时间:2023-02-21 格式:PPT 页数:42 大小:1,006KB
收藏 版权申诉 举报 下载
FPGA教学课件:第5章 有限状态机设计_第1页
第1页 / 共42页
FPGA教学课件:第5章 有限状态机设计_第2页
第2页 / 共42页
FPGA教学课件:第5章 有限状态机设计_第3页
第3页 / 共42页
资源描述:

《FPGA教学课件:第5章 有限状态机设计》由会员分享,可在线阅读,更多相关《FPGA教学课件:第5章 有限状态机设计(42页珍藏版)》请在装配图网上搜索。

1、第第5章章 有限状态机设计有限状态机设计本章主要内容本章主要内容n状态机的基本概念n状态编码n状态机的基本语法n状态机的描述5.1有限状态机的基本概念有限状态机的基本概念n状态机:表示有限个状态以及在这些状态之间的转移和动作等行为。n数字系统有两大类有限状态机(Finite State Machine,FSM):Moore状态机和Mealy状态机。n图 51 状态跳转示意图5.1.1 Moore型状态机型状态机nMoore型状态机由Edward F.Moore提出来,其最大的特点是输出只由当前状态确定,与输入没有关系。Moore状态机的状态图中的每一个状态都包含有一个输出信号。n在数字时序系统

2、中,当前状态一般都存储在触发器中并通过全局时钟信号来驱动。Moore状态机把当前的状态解码成输出一旦当前状态改变,几乎会立即导致输出改变。尽管会在传播的过程中产生一些毛刺的现象,但是设计出的大多数系统都会忽略掉这些毛刺。nMoore状态机的输出在时钟脉冲的有效边沿后的有限个门延后会达到稳定值。输入对输出的影响需要等待下一个时钟周期才能反映出来,因而Moore状态机最重要的特点就是将输入和输出信号隔离开来。n图 52 Moore状态机5.1.2 Mealy型状态机nMealy型状态机由G.H.Mealy在1951所写的A Method for Synthesizing Sequential Ci

3、rcuits中提出,它的输出不仅与当前状态有关系,而且与它的输入也有关系,因而在状态转移图中每条转移边需要包含输入和输出的信息,每个Mealy机都有一个等价的Moore机。nMealy状态机对输入的响应会比Moore机要早一个周期,而且输入信号的噪声也可能影响到输出的信号。n图 53 Mealy状态机5.1.3 状态机的描述n状态机可以采用三种描述方式:状态跳转图、状态转移列表和硬件语言描述。n状态跳转图的最大优点是直观、形象。在进行时序逻辑设计之前或者分析一个具体的逻辑电路时经常采用。n状态转移列表则是用表格的形式来取代状态图来表述状态转移,不适合复杂状态机的情形n运用硬件描述语言描述状态是

4、EDA技术发展的必然5.2 状态机描述的基本语法n例5-1请参考具体的程序设计n对于一个可综合的FSM来说下面的语法会经常使用到。nwire,reg变量:用于对FSM中的各个线网变量或者寄存器变量进行声明。nparameter变量:用于编码FSM中的各种状态。状态编码主要以三种为主:独热码、格雷码和顺序码,也就是二进制码。也可使用define语句声明,不过不常用。nalways语句:在FSM设计中,always语句必不可少。根据不同的FSM设计,有时候会采用一个always语句来实现整个FSM的功能,在它里面包括时序转移和组合逻辑输出;有时候会采用两个always语句来实现时序转移和组合逻辑的

5、分离,实现整个FSM的功能;还有一种就是就是在两个always语句的基础上,采用三个always语句来实现时序转移和组合逻辑的同时,采用寄存器输出。nifelse语句:事实上它可以完全被case语句取代,不过建议还是由ifelse语句来实现状态的初始化和输出的初始化。ncase语句:在FSM中case语句是必不可少的语句,case语句后的条件表达式一般是状态变量,而各个分支一般都是状态编码。case语句中的各个分支的输出有些仅仅是状态的跳转,有些则有组合逻辑的输出。case语句一定要有default值并且一定要有endcase结束,否则表示不完整。case语句可以用casex/casez来替代

6、。ntask语句:task语句是很有用的语句,当状态输出量比较大的时候,可以采用task语句来封装。nfunction语句:和task语句一样,可以采用functioion语句来对状态机中一些重复使用的组合逻辑输出或者一些功能进行封装,这样整个程序就显得简洁,提高代码的可读性。5.3状态编码n编码就是根据一定的协议或者格式把模拟信息转化成比特流的过程。n数字系统常用的编码有两大类:一类是二进制编码;一类是二-十进制编码(BCD码)。5.3.1 二-十进制码(BCD码)n二-十进制编码(BCD码)采用四位二进制数来表示十进制中09十个数字。二进制的每一个数码乘以它的相应的位权就成了对应的十进制数

7、,因此也叫做8421BCD码表 51 BCD码b3b2b1b0自然二进制数余000000000011110010222001133300100444101015520110663011177410008851001996101010710111158110012691101137111014811111595.3.2 格雷码(Gray码)n格雷码也叫做循环码,是1880年由法国工程师Jean-Maurice-Emlle Baudot发明的一种编码,20世纪40年代由贝尔实验室的Frank Gray提出,用来在使用PCM(Pulse Code Modulation)方法传送讯号时避免出错的一种编

8、码机制,并于1953年3月17日取得美国专利。n格雷码也是一种二-十进制编码,但它是一种无权码,采用绝对编码方式,典型格雷码是一种具有反射特性和循环特性的单步自补码,它的循环、单步特性消除了随机取数时出现重大误差的可能。n特点是:相邻的两个码组之间仅有一位不同,当模拟量发生微小变化而可能引起数字量发生变化时,格雷码仅改变一位,这样可以降低数字电路中很大的尖峰电流脉冲,从而减少出错的可能性。表 52 格雷码编码原则十进制数自然二进制数格雷码0000000001000100012001000113001100104010001105010101116011001017011101008100011

9、00910011101101010111111101111101211001010131101101114111010011511111000n普通二进制码与格雷码之间可以相互转换。n二进制码转换成格雷码:n从最右边一位起,依次与左边一位异或,作为对应格雷码该位的制,最左边的一位不变(相当于最左边是0)。n格雷码转换成二进制码:n从左边第二位起,将每一位与左边一位解码后的值异或,作为该解码后的值(最左边的一位依然不变)。5.3.3 独热码(onehot码)n独热码又分为独热1码和独热0码。当任何一种状态有且仅有一个1时,就是独热1码,相反,任何一种状态有且仅有一个0时,就是独热0码。n独热码是

10、一种很简单的编码,常应用于FPGA的状态机设计当中。nHDL语言主要使用独热码、格雷码和二进制码进行编码。不同的CPLD/FPGA有不同的硬件结构和触发器单元,因此需要认真地了解器件的架构特性,然后选择相应的编码进行设计。n许多FPGA的设计采用独热码进行编码。独热码的每个比特对应一个寄存器,而每一次都只有一个比特处于活动状态,速度最快,同时占用的面积也最大。n使用synplify工具可以在代码中以注释的方式来要求synplify工具设定特定的编码格式。ifdef onehot reg 3:0 state/*synthesis state_machine syn_encoding=onehot

11、*/;endififdef sequential reg 3:0 state/*synthesis state_machine syn_encoding=sequential*/;endififdef grey reg 3:0 state/*synthesis state_machine syn_encoding=grey*/;endif5.4 状态初始化n任何一个状态机都需要有初始化的动作,否则就会出现死锁的现象。n在状态初始化的时候,需要防止出现伪初始化或者说不完全初始化的情况,具体实例请参考例5-2和例5-35.5 Full case和Parallel casenFull Case,在S

12、ynplify软件中一般采用/*synthesis full_case*/来实现;而Parrallel Case,在Synplify软件中一般采用/*synthesis parallel_case*/来实现。具体实例请参考例5-4和例5-5nFull case把FSM的所有编码向量与case中的某个分支匹配n在parallel case中,每个case的判断条件表达式有且仅有唯一一个分支语句与之对应。n使用Full case可以增加设计的安全性,而采用parallel case可以优化状态机的逻辑译码。一般工业专家都比较推荐采用parallel case,因为从功能和门级仿真的结果来看,它能够

13、符合硬件行为的要求。n当需要使用优先级编码逻辑的时候采用“casez”语句,可以确保case语句涉及的是全面的;当需要使用parallel case的时候采用“case”语句,而且case语句中的各条分支都必须是相互排斥的。n图 54 采用Synplify pro综合后的Full Case产生的RTL线路图n图 55 采用Synplify pro综合后的Parallel Case产生的RTL线路图5.6 状态机的描述状态机的描述n状态机有三种描述方式:一段式状态机、两段式状态机、三段式状态机。5.6.1 一段式状态机n当把整个状态机写在一个always模块中,并且这个模块既包含状态转移,又含有

14、组合逻辑的输入输出的时候,称之为一段式状态机。n不推荐采用这种状态机,因为从代码风格方面来说,一般都会要求把组合逻辑和时序逻辑分开;从代码维护和升级来说,组合逻辑和时序逻辑混合在一起不利于代码维护和修改,也不利于约束。n具体设计实例请参考例5-6n图 56 例5-6状态跳转示意图n图 57 采用Synplify pro综合后的一段式状态机RTL线路图5.6.2 两段式状态机n为了避免组合逻辑和时序逻辑之间的混乱,人们推荐采用两段式或者三段式状态机来实现其功能。n两段式状态机就是采用一个always语句来实现时序逻辑,另外一个always语句来实现组合逻辑,这样不但符合了代码的风格,同时也提高了

15、代码的可读性,易于维护。不同于一段式状态机的是,它需要定义两个状态:现态和次态,通过现态和次态的转换来实现时序逻辑。时序逻辑基本格式:n具体设计实例参考例5-7always(posedge clk or negedge rst_)if(!rst_)current_state=IDLE;else current_state=next_state;n图 58 采用Synplify pro综合后的两段式状态机RTL线路图5.6.3 三段式状态机n三段式和两段式的区别:两段式状态机直接采用组合逻辑输出,而三段式状态机则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出。n好处在于增加一级寄存器输出可以

16、有效地滤去组合逻辑输出的毛刺,同时增加一级寄存器可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对齐,从而减小总线数据间的偏斜(Skew),减小接收端数据采样出错的频率。n三段式状态机的基本格式是:第一个always语句实现同步状态跳转;第二个always语句实现组合逻辑;第三个always语句则实现同步输出。组合逻辑采用的是current_state,即现态,而同步输出采用的是次态。n具体设计参考例5-8n图 59 采用Synplify pro综合后的三段式状态机RTL线路图5.6.4 小结小结n如果直接阅读代码会比较麻烦,那么可以运用一些辅助设计工具来实现,比如

17、说Synplify pro中的FSM Viewer。有些工程师习惯于采用状态转移图进行设计,也可以利用Xilinx公司的StateCAD以图形化的界面来实现状态机的编程。n图 510 FSM Viewer界面图n图 511 StateCAD界面图5.7 实例实例 3:PCI Slave接口接口设计设计n5.7.1 PCI协议简介协议简介nPCI协议就是从ISA协议上继承和发展起来的一个系统解决方案的协议,也就是说它与不同其他的一些特定总线不同,它不是仅局限在为了某个用途而设计的协议,而是一整套的系统解决方案nPCI总线采用33MHz的时钟频率操作,采用32位的数据总线,数据传输速率可高达132

18、MB/S,远远超过了标准ISA总线5MB/s的速率。它支持线性突发传输,这样对于高性能的图形加速器的数据实时处理尤为重要。nPCI总线独立于处理器结构,适合于从笔记本电脑到服务器的各种机型,而且它的兼容性强,能够与ISA、EISA、MCA总线完全兼容。它预留了64位数据位宽的设计,这样PCI总线的数据传输速度可以达到原来的一倍。nPCI总线的信号线有32根数据地址线、两个错误报警信号、两根仲裁信号、1根33MHZ的时钟信号、一个全局复位信号以及11根握手信号。如果采用64位的结构,数据地址信号及其相关的控制信号等将增加一倍。nPCI总线支持三种总线操作:I/O读写操作、存取器读写操作和配置读写

19、操作。当FRAME#信号有效的时候,就意味着一个传输过程的开始;C/BE信号中显示传输的类型;当TRDY#、IRDY#、DEVSEL#、IDSEL等握手协议都有效的时候就开始数据传输,直到FRAME#信号无效或者STOP#信号有效。n具体设计请参考实例3n图 512 PCI总线系统图n图 513 PCI总线信号示意图n图 514 PCI基本的读操作n图 515 PCI基本的写操作n图 516 PCI Slave模块设计示意图n图 517 PCI Slave状态跳转图n注意:n如果always语句中敏感表达式中的敏感变量过多,会使整个always模块转化的RTL线路变得复杂,同时敏感变量太多有可

20、能会使工程师由于疏忽而遗忘其中的一个敏感变量,从而生成锁存器,再者就代码风格而言,太多的敏感变量是很忌讳的,因此建议过多的敏感变量可以采用语句always(*)来替代或者先在always模块外先进行处理,设置中间变量来减少敏感变量的个数,如假设PCI数据总线为敏感变量,任何一根数据线为1时,执行always模块,如果直接把PCI数据总线做为敏感变量,则always语句中至少有32个敏感变量。我们可以设置一个中间变量flag_one,并且assign flag_one=|AD;那么always语句中的32个数据总线敏感变量就可以采用flag_one来替代,这样敏感变量就从32个减少1个。5.8

21、本章小结n状态机设计是硬件描述语言最基本的也是最重要的部分。本章着重讲述了状态机的基本要素、描述、种类以及设计的注意事项。一般来说,凡是有时序逻辑的设计都会用到状态机,特别是协议解析时。对于逻辑工程师而言,不要拘泥于状态机的实现形式是两段式还是三段式,需要根据具体的设计需要而进行编码。5.9思考与练习1.状态机有哪几种?分别有什么特点?2.采用Verilog HDL描述状态机时,需要注意哪些事项?3.case语句在状态机描述中,有哪些注意事项?4.full case和parallel case在逻辑综合中有什么不同?5.状态编码有哪几种?分别有什么缺点和优点?6.格雷码有什么样的特点?为什么采用格雷码可以达到面积和速度都能有效提高的目标?7.采用syplify工具中的关键字synthesis来实现编码规则的转化有什么优点和缺点?8.Moore状态机与mealy状态机之间有什么区别与联系?9.什么是PCI协议?PCI协议的基本内容是什么?10.试根据PCI的协议,采用Verilog HDL设计一个完整的PCI Slave。

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!