EDA技术状态机课件_第1页
EDA技术状态机课件_第2页
EDA技术状态机课件_第3页
EDA技术状态机课件_第4页
EDA技术状态机课件_第5页
已阅读5页,还剩55页未读 继续免费阅读

下载本文档

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

文档简介

EDA技术8_状态机深圳大学信息工程学院本章提要有限状态机FSM简介FSM的分类:Moore机和Mealy机FSM的VHDL实现同步系统设计原则方法:所有输入到触发器,寄存器和计数器等部件的时钟,必须是由系统时钟直接驱动的。结果:所有的状态变化均在时钟的有效沿(risingorfallingedges)发生。优势:所有的开关暂态,开关噪声和其他干扰均发生在时钟脉冲间,对系统性能没有影响。*系统的最大时钟频率由最长路径的最大延迟决定深圳大学信息工程学院同步时序电路的构成示意图深圳大学信息工程学院有限状态机的状态转移图图形表示:状态、转移、条件和逻辑开关6FSM是为时序电路设计而创建的特殊模型技术,在针对任务顺序非常明确的电路(如交通灯控制器)是非常实用。理论上,任何时序电路都可以建立FSM模型,但并不总是一种高效的方法。如果一味地追求使用FSM来设计时序电路,可能会导致代码冗长和容易出错。例如,任务简单的寄存器就不必使用FSM方式实现。又例如,虽然任务与顺序很明确,但任务数目太多或者性能要求较高时,也不宜用FSM方式实现。状态机的设计包含两个主要过程,一是状态机的建模,二是状态机的编码。有限状态机(FiniteStateMachine,FSM)7组合逻辑电路时序逻辑电路clkrstoutputinputpr_statenx_state状态机的组成:如图。状态机的种类:

Mealy型:当前状态、当前输入相关Moore型:仅当前状态相关VHDL代码结构:

时序逻辑部分:process内部

组合逻辑部分:在使用FSM方式设计VHDL代码时,通常会在结构体的开始部分插入一个用户自定义的枚举数据类型,其中包含所有可能出现的电路状态。8设计风格#1一种结构清晰、易于实现的FSM设计风格:FSM中的时序逻辑部分和组合逻辑部分分别独立设计;定义一个枚举数据类型,内部包含所有FSM需要的状态;9组合逻辑电路时序逻辑电路clkrstoutputinputpr_statenx_stateFSM中时序逻辑部分的设计特点:确定的输入/输出端口典型的模板可供使用------------lowersection---------------process(clock,reset)beginif(reset='1‘)thenpr_state<=state0;elsif(clock’eventandclock=‘1’)thenpr_state<=nx_state;endif;endprocess;标准的设计寄存器数目少:默认的编码方式下,log2n表现为位宽10组合逻辑电路时序逻辑电路clkrstoutputinputpr_statenx_stateFSM中组合逻辑部分的设计特点:并发代码、顺序代码皆可;顺序代码方式的设计模板process的敏感信号列表完整列出IN/OUT组合无边沿赋值,无寄存器生成------------uppersection---------------process(input,pr_state)begin

casepr_stateiswhenstate0=>//多个条件转移分支if(input=...)thenoutput<=<value>;nx_state<=state1;else....;endif;whenstate1=>if(input=...)thenoutput<=<value>;nx_state<=state2;else....;endif;......endcase;endprocess;11设计风格#1的状态机模板

libraryieee;useieee.std_logic_1164.all;entity<entity_name>isport(input:in<data_type>;reset,clock:instd_logic;output:out<data_type>);end<entity_name>;architecture<arch_name>of<entity_name>is

typestateis(state0,state1,state2,state3,...);signalpr_state,nx_state:state;begin------------lowersection---------------process(clock,reset)beginif(reset='1‘)thenpr_state<=state0;elsif(clock’eventandclock=‘1’)thenpr_state<=nx_state;endif;endprocess;------------uppersection---------------process(input,pr_state)begincasepr_stateiswhenstate0=>if(input=...)thenoutput<=<value>;nx_state<=state1;else....;endif;whenstate1=>if(input=...)thenoutput<=<value>;nx_state<=state2;else....;endif;......endcase;endprocess;end<arch_name>两个进程并发执行12例8.1

模10计数器功能描述:状态转移图特点分析:摩尔型状态机设计分析:状态较多,枚举很不方便,仅作为例子参考,不推荐实际应用。zero(0000)one(0001)two(0010)three(0011)four(0100)five(0101)nine(1001)eight(1000)seven(0111)six(0110)rst13libraryieee;useieee.std_logic_1164.all;entitycounterisport(--无输入数据--rst,clk:instd_logic;count:outstd_logic_vector(3downto0));endcounter;architecturestate_machineofcounteris

typestateis(zero,one,two,three,four,five,six,seven,eight,nine);signalpr_state,nx_state:state;begin------------lowersection---------------process(clk,rst)beginif(rst='1‘)thenpr_state<=

zero;elsif(clk’eventandclock=‘1’)thenpr_state<=nx_state;endif;endprocess;------------uppersection---------------process(pr_state)---无输入数据---begincasepr_stateiswhenzero=>count<=“0000”;nx_state<=one;whenone=>count<=“0001”;nx_state<=two;whentwo=>count<=“0010”;nx_state<=three;......whennine=>count<=“1001”;nx_state<=zero;endcase;endprocess;endstate_machine;两个进程并发执行代码实现:所需寄存器个数:上限[log210]=414例8.2简单的FSM#1功能描述:FSMxabdclkrststateA(x=a)stateB(x=b)d=0d=0d=1d=1rst15entitysimple_fsmisport(a,b,c,d,rst,clk:inBIT;x:outBIT);endsimple_fsm;architecturesimple_fsmofsimple_fsmis

typestateis(stateA,stateB);signalpr_state,nx_state:state;begin------------lowersection---------------process(clk,rst)beginif(rst='1‘)thenpr_state<=

stateA;elsif(clk’eventandclock=‘1’)thenpr_state<=nx_state;endif;endprocess;------------uppersection---------------process(a,b,c,d,pr_state)begincasepr_stateiswhenstateA=>x<=a;if(d=‘1’)thennx_state<=stateB;elsenx_state<=stateA;endif;whenstateB=>x<=b;if(d=‘1’)thennx_state<=stateA;elsenx_state<=stateB;endif;endcase;endprocess;endsimple_fsm;代码实现:所需寄存器个数:1个,用于存储两个状态编码。168.3设计风格#2

在很多应用中(如波形整齐、流水线技术等),需要同步的寄存器输出,即需先使用寄存器存储起来,然后在时钟边沿时才进行更新,如图b:17设计风格#2的状态机模板—使用辅助信号如temp

libraryieee;useieee.std_logic_1164.all;entity<entity_name>isport(input:in<data_type>;reset,clock:instd_logic;output:out<data_type>);end<entity_name>;architecture<arch_name>of<entity_name>istypestateis(state0,state1,state2,state3,...);signalpr_state,nx_state:state;

signaltemp:<data_type>;begin------------lowersection---------------process(clock,reset)beginif(reset='1‘)thenpr_state<=state0;elsif(clock’eventandclock=‘1’)then

output<=temp;pr_state<=nx_state;endif;endprocess;------------uppersection---------------process(pr_state)----Mealy型状态机begincasepr_stateiswhenstate0=>

temp<=<value>;if(condition)thennx_state<=state1;....;endif;whenstate1=>

temp<=<value>;if(condition)thennx_state<=state2;....;endif;......endcase;endprocess;end<arch_name>temp信号将输出结果存储起来,只有当所需时钟边沿到来时才被赋值给输出端口18entitysimple_fsmisport(a,b,c,d,rst,clk:inBIT;x:outBIT);endsimple_fsm;architecturesimple_fsmofsimple_fsmistypestateis(stateA,stateB);signalpr_state,nx_state:state;

signaltemp:BIT;begin------------lowersection---------------process(clk,rst)beginif(rst='1‘)thenpr_state<=stateA;elsif(clk’eventandclock=‘1’)thenpr_state<=nx_state;

x<=temp;endif;endprocess;------------uppersection---------------process(a,b,c,d,pr_state)begincasepr_stateiswhenstateA=>

temp<=a;if(d=‘1’)thennx_state<=stateB;elsenx_state<=stateA;endif;whenstateB=>

temp<=b;if(d=‘1’)thennx_state<=stateA;elsenx_state<=stateB;endif;endcase;endprocess;endsimple_fsm;所需寄存器个数:2个,一个用于存储两个状态编码,另一个用于存储同步输出结果。例8.3:用FSM#2实现例8.2:--同步输出198.4状态机的编码风格—二进制码和独热码(1)状态机编码的概念:在设计状态机时,需要对状态机的状态进行编码,从而决定需要使用的寄存器数目。(2)状态机编码的方式:二进制编码、一位热独码、两位独热码或其它编码方式,默认的方式是二进制编码。例:8状态FSM的状态编码20(3)不同的编码方式所需要的触发器数目和组合逻辑资源是不同的:

二进制编码:需要寄存器数目最少,但所需组合逻辑最多,速度最慢;这些特性对于PAL和门阵列结构是可以接受的。但是因为FPGA具有许多触发器和较少的组合逻辑资源,高编码的状态变量会导致低的FPGA速度和密度的实现效率。一位独热编码(One-HotEncoding):就是使每个状态占用状态寄存器的一位。这种编码方法看起来好像很浪费资源,例如,对于一位热独码编码来说,一个具有16个状态的在限状态机需要16个触发器,但如果使用二进制编码,则只需要4个触发器。但是,一位有效编码方法可以简化组合逻辑和逻辑之间的内部连接。一位热独码编码可以产生较小的并且更快的有效状态机。这对于顺序逻辑资源比组合逻辑资源更丰富的可编程ASIC来说,是比较有效的编码方式。特别是对于FPGA结构来说,一位热独码编码是最好的状态编码方式。另外,One-hot编码所需的组合逻辑最少,触发器最多,工作时钟频率可以做到最高。21双热码:介于二进制编码和独热编码之间,每一次状态变化都会带来两个位的跳变,使用n个寄存器可以实现对n(n-1)/2个状态进行编码。

Gray码:就面积与速度的折中考虑来说是最好的选择,当然Gray码还有其他很多好的特性,暂时不属于这次讨论的范畴。其他编码方式(4)状态机编码方式的选择:一般的综合工具对状态机进行综合时都可以让用户对这三种编码进行选择。对于大的基于FPGA的状态机的实现来说,一位有效编码是最佳的方法。对于较少状态的有限状态机(小于8个状态),二进制编码可能更有效。为了提高状态机的设计性能,可以将大的状态机(大于32个状态)分为几个小的状态机,每个状态机都使用合适的编码方式。主干路(major)次要马路(minor)传感器(sensor)常态:主干路绿灯,次要马路红灯变态:有小车在次要马路行使,主干路红灯,次要马路绿灯。灯变化时,计数器开始工作。记时完成,灯恢复常态。输入次要马路的车,car计数器完成记时,timed输出主干路灯次要马路灯启动计数器(start_timer)例8.4:用FSM实现交通灯控制交通灯控制器major=greenminor=redcarstart_timermajor=redminor=greentimedGR00112态(G,R)状态框,包含输出:主干路灯G,次要路灯R判断框,条件:car,timed条件输出框,与输出信号在同一个周期里被置位(set)交通灯控制器交通灯控制器交通灯控制器交通灯控制器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.NUMERIC_STD.ALL;ENTITYtraffic_light_ctrlISPORT(clk:INSTD_LOGIC;car:INSTD_LOGIC;timed:INSTD_LOGIC;major_green:OUTSTD_LOGIC;manir_gree:OUTSTD_LOGIC;start_timer:OUTSTD_LOGIC);ENDtraffic_light_ctrl;交通灯控制器ARCHITECTURErtlOFtraffic_light_ctrlISTYPEstate_typeIS(G,R);SIGNALp_state,n_state:state_type;

BEGIN交通灯控制器seq_proc:PROCESS(clk)ISBEGINIFRISING_EDGE(clk)THENp_state<=n_state;ENDIF;ENDPROCESSseq_proc;交通灯控制器comb_proc:PROCESS(car,timed,p_state)BEGINstart_timer<='0';CASEp_stateISWHENG=>major_green<='1';minor_green<='0';IF(car='1')THENstart_timer<='1';n_state<=R;ELSEn_state<=G;ENDIF;交通灯控制器WHENR=>major_green<='0';minor_green<='1';IF(timed='1')THENn_state<=G;ELSEn_state<=R;ENDIF;ENDCASE;ENDPROCESScomb_proc;

ENDrtl;同步有限状态机种类Moore和Mealy机Moore机仅输出当前状态的函数Mealy机输出的是当前状态和输入的函数深圳大学信息工程学院Mealy状态机

下一个状态=F(当前状态,输入信号);

输出信号=G(当前状态,输入信号);

深圳大学信息工程学院Moore状态机

下一个状态=F(当前状态,输入信号)

输出信号=G(当前状态);

算法状态机ASM算法状态机(AlgorithmicStateMachine)和软件的流程图相似,但包含隐含的时序信息比状态图更容易让人理解电路的执行过程常用来描述复杂的时序系统用状态的变化来描述系统算法状态机ASM状态输出值Y=AJ01Z=1(a)状态框(b)判断框(c)条件输出框1011判断框深圳大学信息工程学院J01判断框表示状态变量对控制器工作的影响注意:判断框不占用时间状态框深圳大学信息工程学院如果一个信号没有被赋值,则它在此状态被置位,而在其它状态被复位。一个状态框占用一个时钟脉冲周期条件输出框深圳大学信息工程学院条件框的入口必定与判断框的输出相连。注意:条件输出框的输出信号与它所属的状态框的输出信号(包括判断框)在同一时钟周期内被置位。深圳大学信息工程学院ASM图的综合–状态赋值状态越多,可能的赋值数目随之增加如果状态表中有m个状态

,则需要n个触发器

One-hot编码,需要m个触发器

三个状态:001,010,100每次只有一个触发器被置位次态逻辑可能比较简单对于可编程的逻辑器件,‘one-hot’编码系统使用的的资源可能会比用最少数量触发器的系统使用少检查系统故障相对容易些ASMEXAMPLE1-

序列检测器检测输入X中是否含有101串如果输入X中含有101时,那么当输入串101中最后一个1出现时,与此同步就有输出Z=1,且Z=1时电路不复位。X=0011011001010100Z=0000010000010100Mealy机 VS Moore机Moore机需要更多的状态,不过更容易设计和调试Moore机的输出不是在状态转移过程中产生的,而是完全由状态本身决定Mealy机Moore机s0Z=0X=1Z=1Z=0X=0Z=0X=1s1s2TTTFFF000110s0Z=0X=1Z=0X=0Z=0X=1s1s2TTTFFF000111Z=1X=1s3T10ASM图的综合–序列检测器(Mealy)当前状态下一状态当前输出ZX=0X=1X=0X=1S0S0S100S1S2S100S2S0S101ABA’B’ZX=0X=1X=0X=1S0000100S1100100S2000101布尔量状态表One-hotvs.Binarystateassignments0Z=0X=1Z=1Z=0X=0Z=0X=1s1s2TTTFFF000110ASM图的综合–序列检测器(Mealy)XAB010000011011XX1000XAB010001010111XX1001XAB010000010011XX1001B’=XZ=XandAA’B’Z输出由当前状态及输入决定A’=(notX)andBASM图的综合–序列检测器(Mealy)次态逻辑寄存器输出逻辑B’=XZ=XandAA’=(notX)andBASM图的综合–序列检测器(Moore)当前状态下一状态当前输出ZX=0X=1X=0X=1S0S0S100S1S2S100S2S0S300S3S2S111ABA’B’ZX=0X=1S000010S110010S200110S310011布尔量状态表s0Z=0X=1Z=0X=0Z=0X=1s1s2TTTFFF000110Z=1X=1s3T11ASM图的综合–序列检测器(Moore)XAB010000011010011110XAB010001010110011101XAB0000010100111B’=XZ=AandBA’B’Z输出由当前状态决定A’=(AandnotBandX)or(BandnotX)深圳大学信息工程学院ASM图的综合–序列检测器(Moore)次态逻辑寄存器输出逻辑A’=ABX+BXB’=XZ=ABFSM的VHDL实现FSM中时序逻辑部分设计FSM中组合逻辑部分设计

在比较复杂的状态机设计过程中,往往把状态的变化与输出开关的控制分成两部分来考虑。使用这种方法进行设计时,FSM中的状态变化(时序逻辑部分)和开关控制(组合逻辑部分)分开独立设计。

FSM中时序逻辑部分设计时序逻辑部分包含寄存器,clock和reset都与之相连,在process中实现,任何一种顺序描述语句都可以使用。51 PROCESS(reset,Clock) BEGIN IF(reset='1')THEN

pre_state<=state0; ELSIF(Clock‘eventandclock=‘1’)

THENpre_state<=nx_state;ENDIF; ENDPROCESS;FSM中组合逻辑部分设计对于组合逻辑电路而言,通常采用并发代码实现,但是通常在process中使用顺序代码来实现FSM输出控制部分。52 PROCESS(input,pr_state) BEGINCASEpr_stateIS WHENstate0=>

IF(input=…)THEN

output<=<value1>;

nx_state<=state1;

ELSE…

ENDIF;WHENstate1=>

IF(input=…)THEN

output<=<value2>;

nx_state<=state2;

ELSE…

ENDIF;

WHENstate2=>

IF(input=…)THEN

output<=<value2>;

nx_state<=state2;

ELSE…

ENDIF;

WHENstate3=>

IF(input=…)THEN

output<=<value3>;

nx_state<=state3;

ELSE…

ENDIF;

ENDCASE; ENDPROCESS;ASM图的VHDL描述-序列检测器LIBRARYIEEE;USEIEEE.STD_LOGIC_1164.ALL;USEIEEE.NUMERIC_STD.ALL;

--sequentialdetector--MealymachineENTITYseq_detectorISPORT(clk:INstd_logic;i_X:INstd_logic;o_Z:OUTstd_logic);ENDseq_detector;ASM图的VHDL描述-序列检测器ARCHITECTURErtlOFseq_detectorIS--binarystateassignmenttypestate_typeis(s0,s1,s2);signalpresent_state,next_state:state_type:=s0;

--one-hotencoder--constants0:std_logic_vector(2downto0):="001";--constants1:std_logic_vector(2downto0):="010";--constants2:std_logic_vector(2downto0):="100";

--signalpresent_state,next_state:std_logic_vector(2downto0);

--actualassignment--present_state<=s0;

BEGINProcess(clk)Beginif(clk’eventandclk=‘1’)thenpresent_state<=next_state;endEndprocess;comb_proc:process(next_state,i_X)isbegino_Z<='0';casepresent_stateiswhens0=>ifi_X='1'thennext_state<=s1;endif;whens1=>ifi_X='0'thennext_state<=s2;endif;ASM图的VHDL描述-序列检测器whens2=>ifi_X='1'thennext_state<=s1;o_Z<='1';elsenext_state<=s0;endif;

endcase;endprocesscomb_proc;

ENDrtl;ASM图的VHDL描述-序列检测器57功能描述:特点分析:波形在clk的上升沿才发生跳变,是与例8.6的最大不同之处。设计方法:

1、FSM方法;2、传统的方法:周期计数。clk波形1个周期EXAMPLE3---信号发生器58采用FSM方法进行设计:设计思路:①使用8个状态的FSM,并使用模8计数器的计数值代表这8个状态。当count为0时,进入第一个状态,将输出电平置为低电平;当count为1时,进入第二个状态,将输出电平置为高电平;以此类推,即可得图中输出波形。②另外,由于信号发生器中不允许出现毛刺,须使用FSM设计风格#2,

温馨提示

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

评论

0/150

提交评论