配套课程数字逻辑设计lec7状态机_第1页
配套课程数字逻辑设计lec7状态机_第2页
配套课程数字逻辑设计lec7状态机_第3页
配套课程数字逻辑设计lec7状态机_第4页
配套课程数字逻辑设计lec7状态机_第5页
已阅读5页,还剩21页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

状态机设计战略发展中心技术部2015-3-2

版本管理修改记录审核记录版本号.作者描述修改日期v0.1陈和炯创建2015-3-2版本号.职务签名修改日期大纲FSM概述Mealy与Moore型状态机有限状态机的Verilog描述状态编码方式小结有限状态机概述概述有限状态机(finite-statemachine,FSM),简称状态机,是表示有限个状态以及在这些状态之间的转移和动作等行为的数学模型。它是一组触发器的输出状态随着时钟和输入信号按照一定的规律变化的一种机制或过程。任何时序电路都可以表示为有限状态机,有限状态机是实现高可靠逻辑控制的重要途径,是大型数字系统设计中的重要组成部分,尤其是进行复杂的时序逻辑电路的实现。本章将采用VerilogHDL对有限状态机的设计进行介绍。有限状态机概述FSM的结构下图表示的是数字电路设计中常用的时钟同步状态机的结构。其中状态寄存器是由一组触发器组成,用来记忆状态机当前所处的状态;组合逻辑F控制状态是否改变、以及怎样改变;组合逻辑G控制状态机的输出大纲FSM概述Mealy与Moore型状态机有限状态机的Verilog描述状态编码方式小结Moore型状态机FSM分类FSM根据输出信号与当前状态以及输入信号的关系分为:Moore型状态机和Mealy型状态机,前者也被称为摩尔型状态机,后者被称为米勒型状态机Moore型状态机Moore型状态机的输出只与当前的状态有关,也就是当前的状态决定输出,而与此时的输入无关,输入只决定状态机的状态改变,不影响电路最终的信号输出。Mealy型状态机Mealy型状态机Mealy型状态机的输出不仅与当前的状态有关,还与当前的输入信号有关,即当前的输入信号和当前的状态共同决定输出。通常我们在输出逻辑G后面再加一组触发器,让G所有的输出信号在下一个时钟跳变沿时同时存入寄存器组,即完全同步地输出。对于Mealy型状态机,输出同步不仅会带来运行性能的提升,还会增加系统的稳定性:防止输出信号出现毛刺,防止组合回路的产生。Mealy与Moore型状态机Mealy与Moore型状态机区别很明显,这两种电路结构除了在输出部分有些不同外,其他地方都是相同的。也是由于输出不同,导致Mealy型是异步状态机,而Moore型是同步状态机。在实际设计工作中,其实大部分状态机都是属于Mealy状态机。因为状态机的输出中或多或少有几个属于Mealy类型的输出。由于Mealy型状态机输出进行了同步输出,因此Moore型FSM的输出逻辑相对于Mealy型FSM的输出逻辑简单了许多,仅仅是对状态寄存器进行译码的组合逻辑。大纲FSM概述Mealy与Moore型状态机有限状态机的Verilog描述状态编码方式小结FSM的Verilog描述有限状态机的描述方法在VerilogHDL中可以用许多方法来描述有限状态机,最常用的方法是用always语句和case语句。根据always块的使用情况可以分成一段式,两段式,三段式等。接下来将通过一系列示例来介绍这些方法。状态转移图:一般情况下,为更直观的考虑状态机的功能,会首先画出状态机的状态转移图。状态转移图右图所示的状态转移图表示了一个4状态的有限状态机,其输入是A和Reset,输出是K2和K1。当条件满足时,状态转移到箭头所示方向。说明:“A/K1=0”表示当A为真时,K1=0,且状态转移接下来将给出不同方式的Verilog代码StartIdleClearStopA/K1=0!A/K2=0,K1=0!A/K2=0,K1=1A/K2=1!AA!AA例1:一段式编码modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[1:0]state;parameter Idle =2'b00, Start =2'b01, Stop =2'b10, Clear =2'b11;always@(posedgeClock)

if(!Reset)begin state<=Idle;K2 <=0;K1 <=0;

end

else

case(state) Idle:if(A)beginstate<=Start;K1<=0;

end

elsestate<=Idle; Start:if(!A)state<=Stop;

elsestate<=Start; Stop:if(A)begin

state<=Clear;K2<=1;

end

else

begin

state<=Stop;

end例1:一段式编码该例子是一个一段式的有限状态机,它的状态转移,输出等操作都在一个always块中描述的。这种一段式的描述不清晰简介,不易于维护,不易于附加时序约束,使综合器和布局布线器难于优化。因此对设计要求较高的不推荐使用此描述方法。 Clear:if(!A)begin state <=Idle; K1 <=1; K2 <=0;

end

else

begin state <=Clear;

end

default:state <=2'bxx;endcaseendmodule例2:二段式编码modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[1:0]cstate,nstate;parameterIdle=2'b00, Start=2'b01, Stop=2'b10, Clear=2'b11;always@(posedgeClock)

if(!Reset)begin cstate<=Idle; K2 <=0;K1 <=0;

end

elsecstate<=nstate;always@(cstateorA)

case(cstate) Idle:if(A)begin nstate=Start; K1=0;

end

elsenstate=Idle; Start:if(!A) nstate=Stop;

elsenstate=Start; Stop:if(A)begin

nstate=Clear;K2=1;

end

elsenstate=Stop; 例2:二段式编码两段式FSM的核心是:一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律。需要注意的是这个同步时序模块的赋值采用非阻塞赋值“<=”。组合逻辑模块的赋值要采用阻塞赋值“=”。Clear:if(!A)begin nstate=Idle; K1 =1;K2=0;

end

elsenstate=Clear;default:nstate=2'bxx;endcaseendmodule例3:三段式编码modulefsm(Clock,Reset,A,K2,K1);inputClock,Reset,A;outputK2,K1;regK2,K1;reg[1:0]cstate,nstate;parameter Idle =2'b00, Start =2'b01, Stop =2'b10, Clear =2'b11;always@(posedgeClock)

if(!Reset)begin cstate<=Idle; K2<=0;K1<=0;

endelsecstate<=nstate;always@(cstateorA)

case(cstate) Idle:if(A)nstate=Start;

elsenstate=Idle; Start:if(!A) nstate=Stop;

elsenstate=Start;

Stop:if(A)

nstate=Clear;

elsenstate=Stop; Clear:if(!A) nstate=Idle;

elsenstate=Clear;default:nstate=2'bxx;

endcase例3:三段式编码三段式描述采用了三个always块来完成,相对于两段式这个always块用于描述状态转移条件判断;另一个always块用于描述寄存器输出。虽然代码结构复杂了一些,但是换来的优势是:使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组。一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。这种描述风格比较适合大型的状态机,查错和修改比较容易。always@(posedgeClock)

if(!Reset)begin K2=0; K1=0;

end

else

begin

if((nstate==Clear)

&!A) K1=1;

elseK1=0;

if((nstate==Stop)&A) K2=1;

elseK2=0;

end

endmoduleMealy型状态机描述Mealy型状态机描述在前面所列出的例1、例2和例3均是Mealy型状态机,因为它们的输出信号K1、K2的值不仅与当前状态state或cstate有关,还与输入信号A有关。因为输入信号可以直接影响输出信号,不依赖与时钟的同步,所以它属于异步时序电路。以例3为例,可以很容易看出K2、K1最终输出不仅取决于当前状态cstate有关,还与输入信号A有关always@(posedgeClock)

if(!Reset)begin K2=0; K1=0;

end elsebegin if((nstate==Clear)&!A)

K1=1; elseK1=0;

elsebegin

if((nstate==Clear)&!A) K1=1;

elseK1=0;

endMoore型状态机描述Moore型状态机描述根据Moore型状态机的定义可知,输出信号仅为当前状态的函数,与输入信号无关。输入信号对输出信号的影响,只能通过时钟信号到来时输入信号去改变当前状态的值,再由当前状态去改变输出。因此输出信号的改变与时钟同步,属于同步时序电路。仍然以例3为例,我们只需要把最后一个always块的敏感信号表修改为如下形式即可(这样也修改了此状态机的功能)always@(cstate)begin

if(cstate==Clear)K1=1;

elseK1=0;

if(cstate==Stop)K2=1;

elseK2=0;end大纲FSM概述Mealy与Moore型状态机有限状态机的Verilog描述状态编码方式小结状态编码方式常用编码方式在Verilog中编码方式有很多种,如二进制码、余三码、独热码等,用户还可以自定义的任意编码方式。最常用的编码方式有二进制编码(Binary)、格雷码(Gray-code)编码和独热码(One-hot)编码。二进制编码:也可称连续编码,也就是码元值的大小是连续变化的。如:S0=3'd0,S1=3'd1,S2=3'd2,S3=3'd3....格雷码:格雷码的相邻码元值间只有一位是不同的。如:S0=3'b000,S1=3'b001,S2=3'b011,S3=3'b010....独热码:独热码值的每个码元值只有一位是‘1’,其他位都是‘0’。如:S0=3'b001,S1=3'b010,S2=3'b100状态编码方式常用状态编码比较二进制编码、格雷码编码使用最少的触发器,消耗较多的组合逻辑,而独热码编码反之。独热码编码的最大优势在于状态比较时仅仅需要比较一个位,从一定程度上简化了译码逻辑。虽然在需要表示同样的状态数时,独热编码占用较多的位,也就是消耗较多的触发器,但这些额外触发器占用的面积可与译码电路省下来的面积相抵消。在CPLD中,由于器件拥有较多地组合逻辑资源,所以CPLD多使用二进制编码或格雷码,而FPGA更多地提供触发器资源,所以在FPGA中多

温馨提示

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

最新文档

评论

0/150

提交评论