有限状态机课件_第1页
有限状态机课件_第2页
有限状态机课件_第3页
有限状态机课件_第4页
有限状态机课件_第5页
已阅读5页,还剩20页未读 继续免费阅读

下载本文档

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

文档简介

EDA技术实用教程第8章有限状态机什么是状态机?状态机不仅仅是一种时序电路设计工具,它更是一种思想方法状态机简介:时序电路的输出(outputs)不仅与周围环境接收到的输入值(inputs)有关,而且与过去的结果(即存储元件中现在的状态)有关。

Combinational

Circuit

(組合邏輯電路)

Flip-flops

(記憶元件)

inputs

outputs

Nextstate

present

state

clocksignal

什么是状态机?为什么要使用状态机?控制灵活结构模式相对简单性能良好的同步时序逻辑什么是有限状态机?FSM(FiniteStateMachine)有限状态机一旦定义,那么它在每一个状态对每一个消息的反应都固定了。无限状态机就是一个给定的储存状态的库,不过可以储存所有你想要的状态。也就是说状态可以改变。时序进程组合进程有限状态机的一般结构输出仅为当前状态的函数,输入发生变化时,必须到下一时钟,输出才发生变化.MooreFSM仿真波形使用Verilog描述状态机需要注意的问题建议使用case语句来描述状态机模型在有缺省状态时,要写上case语句的最后一个分支:default为状态机设置同步或异步复位两段式FSM描述方法虽然有很多好处,但是它有一个明显的弱点就是其输出一般使用组合逻辑描述,而组合逻辑易产生毛刺等不稳定因素,并且在FPGA/CPLD等逻辑器件中过多的组合逻辑会影响实现的速率(这点与ASIC设计不同)。所以在两段式FSM描述方法中,如果时序允许插入一个额外的时钟节拍,则尽量在在后级电路对FSM的组合逻辑输出用寄存器寄存一个节拍,则可以有效地消除毛刺。但是很多情况下,设计并不允许额外的节拍插入(Latency),此时,解决之道就是采用3段式FSM描述方法。三段式描述方法与两段式描述方法相比,关键在于使用同步时序逻辑寄存FSM的输出。一段式描述方法将状态转移判断的组合逻辑和状态寄存器转移的时序逻辑混写在同一个always模块中,不符合将时序和组合逻辑分开描述的CodingStyle(代码风格),而且在描述当前状态时要考虑下个状态的输出,整个代码不清晰,不利于维护修改,并且不利于附加约束,不利于综合器和布局布线器对设计的优化。两段式写法是推荐的FSM描述方法之一,在此我们仔细讨论一下代码结构。两段式FSM的核心就是:一个always模块采用同步时序描述状态转移;另一个模块采用组合逻辑判断状态转移条件,描述状态转移规律。那么怎样采用三段式描述方法?有限状态机MOORE机MEALY机MooreFSMOutputIsaFunctionofaPresentStateOnly输出仅为当前状态的函数PresentState

RegisterNextStatefunctionOutputfunctionInputsPresentStateNextStateOutputsclockreset输入发生变化时,必须到下一时钟,输出才发生变化Y=F[Q]

modulemealy1(clk,din1,din2,rst,q);inputclk,din1,din2,rst;output[4:0]q;reg[4:0]q;reg[4:0]pst;parameterst0=0,st1=1,st2=2,st3=3,st4=4;always@(posedgeclkorposedgerst)beginif(rst)pst<=st0;elsebegincase(pst)st0:if(din1==1'b1)pst<=st1;elsepst<=st0;st1:if(din1==1'b1)pst<=st2;elsepst<=st1;st2:if(din1==1'b1)pst<=st3;elsepst<=st2;st3:if(din1==1'b1)pst<=st4;elsepst<=st3;st4:if(din1==1'b0)pst<=st0;elsepst<=st4;default:pst<=st0;endcaseendendalways@(pstordin2)begincase(pst)st0:if(din2==1'b1)q<=5'h10;elseq<=5'h0a;st1:if(din2==1'b0)q<=5'h17;elseq<=5'h14;st2:if(din2==1'b1)q<=5'h15;elseq<=5'h13;st3:if(din2==1'b0)q<=5'h1b;elseq<=5'h09;st4:if(din2==1'b1)q<=5'h1d;elseq<=5'h0d;default:q<=5'h0;endcaseendendmoduleinput=0input=0input=1st0st1rst=1st2st301010st410011当输入信号或状态发生变化,输出信号即刻发生变化。modulemealy2(clk,din1,din2,rst,q);inputclk,din1,din2,rst;output[4:0]q;reg[4:0]q;reg[4:0]pst;parameterst0=0,st1=1,st2=2,st3=3,st4=4;always@(posedgeclkorposedgerst)beginif(rst)pst<=st0;elsebegincase(pst)st0:beginbeginif(din2==1'b1)q<=5'h10;elseq<=5'h0a;endbeginif(din1==1'b1)pst<=st1;elsepst<=st0;endendst1:beginbeginif(din2==1'b0)q<=5'h17;elseq<=5'h14;endbeginif(din1==1'b1)pst<=st2;elsepst<=st1;endendst2:beginbeginif(din2==1'b1)q<=5'h15;elseq<=5'h13;endbeginif(din1==1'b1)pst<=st3;elsepst<=st2;endendst3:beginbeginif(din2==1'b1)q<=5'h1b;elseq<=5'h09;endbeginif(din1==1'b1)pst<=st4;elsepst<=st3;endendst4:beginbeginif(din2==1'b1)q<=5'h1d;elseq<=5'h0d;endbeginif(din1==1'b1)pst<=st0;elsepst<=st4;endenddefault:beginpst<=st0;q<=5'h0;endendcaseendendendmodulemodulemealy1(clk,din1,din2,rst,q);inputclk,din1,din2,rst;output[4:0]q;reg[4:0]q;reg[4:0]pst;parameterst0=0,st1=1,st2=2,st3=3,st4=4;always@(posedgeclkorposedgerst)beginif(rst)pst<=st0;elsebegincase(pst)st0:if(din1==1'b1)pst<=st1;elsepst<=st0;st1:if(din1==1'b1)pst<=st2;elsepst<=st1;st2:if(din1==1'b1)pst<=st3;elsepst<=st2;st3:if(din1==1'b1)pst<=st4;elsepst<=st3;st4:if(din1==1'b0)pst<=st0;elsepst<=st4;default:pst<=st0;endcaseendendalways@(pstordin2)begincase(pst)st0:if(din2==1'b1)q<=5'h10;elseq<=5'h0a;st1:if(din2==1'b0)q<=5'h17;elseq<=5'h14;st2:if(din2==1'b1)q<=5'h15;elseq<=5'h13;st3:if(din2==1'b0)q<=5'h1b;elseq<=5'h09;st4:if(din2==1'b1)q<=5'h1d;elseq<=5'h0d;default:q<=5'h0;endcaseendendmodule状态A方向(红绿黄)B方向(红绿黄)S0010100S1001100S2100010S3100001交通灯的全部状态及输出:S0————010100S1————001100S3————100001S2————100010modulejtd(clk,rst,out);inputclk,rst;output[5:0]out;parameters0=0,s1=1,s2=2,s3=3;reg[5:0]c_state,next_state,out;always@(posedgeclk,posedgerst)beginif(rst)c_state<=s0;elsec_state<=next_state;endalways@(c_state)begincase(c_state)s0:beginnext_state<=s1;out<=6'b010100;ends1:beginnext_state<=s2;out<=6'b001100;ends2:beginnext_state<=s3;out<=6'b100010;ends3:beginnext_state<=s0;out<=6'b100001;endendcaseendendmodule其中CLK的时钟周期应该是10S扩充功能:实现10秒倒计时,在数码管上显示。当数码管从9-0时,红绿灯状态转换。如何实现10秒倒计时?思路...1.先将40MHz的CLK分频至1Hz2.计数10次3.显示译码3.显示译码alwa

温馨提示

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

评论

0/150

提交评论