第九章同步状态机_第1页
第九章同步状态机_第2页
第九章同步状态机_第3页
第九章同步状态机_第4页
第九章同步状态机_第5页
已阅读5页,还剩42页未读 继续免费阅读

下载本文档

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

文档简介

第九章同步状态机设计周晓波北京交通大学电子信息学院xbzhou@516836269/12/20231内容提要9.1状态机的结构9.2Mealy状态机和Moore状态机9.3描述可综合的状态机9/12/202329.1状态机的结构有限状态机(FSM)设计是时序电路设计中很常用的方式控制模块case,if-else9/12/202339.1状态机的结构组合逻辑和时序逻辑的组合寄存器用于存贮状态组合电路用于状态译码和产生输出信号状态机的下一个状态不仅和输入信号相关,而且和当前状态相关同步时序表示方法:状态图、状态表、流程图9/12/20234状态机逻辑表达式下一个状态=F(当前状态,输入信号);输出信号=G(当前状态,输入信号);9/12/20235状态图表示StateNext_Statein/outin/out9/12/20236内容提要9.1状态机的结构9.2Mealy状态机和Moore状态机9.3描述可综合的状态机9/12/20237状态机分类Mealy状态机Moore状态机9/12/20238Moore状态机输出信号=G(当前状态);GF9/12/20239Mealy状态机GF输出信号=G(当前状态,当前输入);9/12/202310内容提要9.1状态机的结构9.2Mealy状态机和Moore状态机9.3描述可综合的状态机9/12/202311可综合的状态机设计最常用:alwayscase9/12/202312状态转移图Idle

Start

Stop

Clear

A/G=0

!AA/F=1

!Reset/F=0G=0!Reset/F=0G=0

!Reset|!A/F=0G=1状态转移图!Reset/F=0G=09/12/202313状态转移图上面的状态转移图表示了一个四状态的有限状态机,它的同步时钟是Clock,输入信号是A和Reset,输出信号是F和G。状态的转移只能在同步时钟(Clock)的上升沿时发生,往哪个状态的转移则取决于目前所在的状态和输入的信号(Reset和A)。9/12/202314VerilogHDL中,状态必须明确赋值,通常使用参数(parameters)或宏定义(define)语句加上赋值语句来实现。使用参数(parameters)语句赋状态值见下例:9/12/202315parameterstate1=2'h1,state2=2'h2;...current_state=state2; //把currentstate设置成2'h2...使用宏定义(define)语句赋状态值见下例:`definestate12'h1`definestate22'h2...current_state=`state2;//把currentstate设置成2'h29/12/2023169.3.1用可综合的Verilog模块

设计状态机的典型办法modulefsm(Clock,Reset,A,F,G);inputClock,Reset,A;outputF,G;regF,G;reg[1:0]state;parameterIdle=2’b00,Start=2’b01,Stop=2’b10,Clear=2’b11;例19/12/202317always@(posedgeClock)if(!Reset)beginstate<=Idle;F<=0;G<=0;endelsecase(state)idle:beginif(A)beginstate<=Start;G<=0;endelsestate<=idle;endstart:beginif(!A)state<=Stop;elsestate<=start;endStop:beginif(A)beginstate<=Clear;F<=1;endelsestate<=Stop;endClear:beginif(!A)beginstate<=Idle;F<=0;G<=1;endelsestate<=Clear;endendcaseendmodule9/12/202318状态编码状态编码二进制Grayone-hotstate000000000000001state100100100000010state201001100000100state301101000001000state410011000010000state510110000100000state611010101000000state7111111100000009/12/2023199.3.2独热码表示状态的状态机modulefsm(Clock,Reset,A,F,G);inputClock,Reset,A;outputF,G;regF,G;reg[3:0]state;parameterIdle=4’b1000,Start=4’b0100,Stop=4’b0010,Clear=4’b0001;例29/12/2023209.3.2独热码表示状态的状态机[例2]与[例1]的主要不同点是状态编码,[例2]采用了独热编码,而[例1]则采用Gray码,究竟采用哪一种编码好要看具体情况而定。对于用FPGA实现的有限状态机建议采用独热码,因为虽然采用独热编码多用了两个触发器,但所用组合电路可省下许多,因而使电路的速度和可靠性有显著提高,而总的单元数并无显著增加。采用了独热编码后有了多余的状态,就有一些不可到达的状态,为此在CASE语句的最后需要增加default分支项,以确保多余状态能回到Idle状态。9/12/202321我们还可以再用另一种风格的VerilogHDL模型来表示同一个有限状态,在这个模型中,我们分别用沿触发的always语句和电平敏感的always语句把状态机的触发器部分和组合逻辑部分分成两部分来描述。9/12/202322modulefsm(Clock,Reset,A,F,G);inputClock,Reset,A;outputF,G;reg[1:0]state,Nextstate;parameterIdle=2’b00,Start=2’b01,Stop=2’b10,Clear=2’b11;always@(posedgeClock)beginif(!Reset)beginstate<=Idle;endelsestate<=Nextstate;end9/12/202323always@(stateorA)beginF=0;G=0;

if(state==Idle)beginif(A)Nextstate=Start;else

beginNextstate=Idle;G=1;end

end

else

if(state==Start)if(!A)Nextstate=Stop;elseNextstate=Start;else

if(state==Stop)if(A)Nextstate=Clear;elseNextstate=Stop;

else

if(state==Clear)beginif(!A)Nextstate=Idle;elseNextstate=Clear;

F=1;end

elseNextstate=Idle;endendmodule黄色是我加的,怀疑老师写错了例39/12/2023249.3.3由输出指定的码

表示状态的状态机输出直接指定为状态码状态码指定与状态机控制的输出联系起来状态变化=>输出适用于高速状态机设计9/12/2023259.3.3由输出指定的码

表示状态的状态机前面的例子当状态转移到clear时,输出G=1当状态转移到idle时,输出F=1因此,G=state[3];F=state[0];9/12/2023269.3.3由输出指定的码

表示状态的状态机

assignG=state[3];assignF=state[0];parameter//----------------------G_i_j_F---------//Zero=4’b0_0_0_0,Idle=4’b0_0_0_0,start=4’b0_0_0_0,stop=4’b0_0_0_0,clear=4’b0_0_0_0,例49/12/202327上面四个例子是同一个状态机的四种不同的VerilogHDL模型,它们都是可综合的,在设计复杂程度不同的状态机时有它们各自的优势。如用不同的综合器对这四个例子进行综合,综合出的逻辑电路可能会有些不同,但逻辑功能是相同的。9/12/2023284.3.4多输出状态机把状态的变化与输出信号的控制分成两部分来考虑;还常常把每一个输出信号写成一个独立的always模块来考虑。9/12/202329有限状态机设计的一般步骤逻辑抽象,得出状态转换图状态化简状态分配选定触发器的类型并求出状态方程、驱动方程和输出方程

按照方程得出逻辑图

9/12/202330状态机设计的一般原则状态机的编码one-hot消耗触发器多,组合逻辑少:FPGAgray消耗触发器少,组合逻辑多:CPLD三段式状态机9/12/202331三段式状态机三段式建模描述FSM的状态机输出时,只需指定case敏感表为次态寄存器,然后直接在每个次态的case分支中描述该状态的输出即可,不用考虑状态转移条件。

三段式描述方法虽然代码结构复杂了一些,但是换来的优势是使FSM做到了同步寄存器输出,消除了组合逻辑输出的不稳定与毛刺的隐患,而且更利于时序路径分组,一般来说在FPGA/CPLD等可编程逻辑器件上的综合与布局布线效果更佳。9/12/202332三段式状态机示列如下://第一个进程,同步时序always模块,格式化描述次态寄存器迁移到现态寄存器always@(posedgeclkornegedgerst_n)

//异步复位if(!rst_n)current_state<=IDLE;elsecurrent_state<=next_state;//注意,使用的是非阻塞赋值9/12/202333三段式状态机//第二个进程,组合逻辑always模块,描述状态转移条件判断always@(current_state)

//电平触发begin

case(current_state)S1:if(...)next_state=S2;

//阻塞赋值...endcaseend

9/12/202334三段式状态机//第三个进程,同步时序always模块,格式化描述次态寄存器输出always@(posedgeclkornegedgerst_n)...//初始化case(next_state)S1:out1<=1‘b1;

//注意是非阻塞逻辑S2:out2<=1'b1;default:...

//default的作用是免除综合工具综合出锁存器。endcaseend9/12/202335用VerilogHDL语言设计可综合的状态机

的指导原则

因为大多数FPGA内部的触发器数目相当多,又加上独热码状态机(onehotstatemachine)的译码逻辑最为简单,所以在设计采用FPGA实现的状态机时往往采用独热码状态机(即每个状态只有一个寄存器置位的状态机)。9/12/202336用VerilogHDL语言设计可综合的状态机

的指导原则建议采用case,casex,或casez语句来建立状态机的模型,因为这些语句表达清晰明了,可以方便地从当前状态分支转向下一个状态并设置输出。不要忘记写上case语句的最后一个分支default,并将状态变量设为'bx,这就等于告知综合器:case语句已经指定了所有的状态,这样综合器就可以删除不需要的译码电路,使生成的电路简洁,并与设计要求一致。9/12/202337用VerilogHDL语言设计可综合的状态机

的指导原则状态机应该有一个异步或同步复位端,以便在通电时将硬件电路复位到有效状态,也可以在操作中将硬件电路复位(大多数FPGA结构都允许使用异步复位端)。同步设计(一个时钟沿触发)9/12/202338状态机的置位与复位状态机的异步置位与复位状态机的同步置位与复位9/12/202339状态机的异步置位与复位异步置位与复位是与时钟无关的.列入always块的事件控制括号内就能触发always块的执行事件控制语法@(<沿关键词时钟信号or沿关键词复位信号or沿关键词置位信号>)9/12/202340状态机的异步置位与复位事件控制实例1)异步、高电平有效的置位(时钟的上升沿)@(posedgeclkorposedgeset)2)异步低电平有效的复位(时钟的上升沿)@(posedgeclkornegedgereset)3)异步低电平有效的置位和高电平有效的复位(时钟的上升沿)@(posedgeclkornegedgesetorposedgereset)9/12/202341状态机的异步置位与复位4)带异步高电平有效的置位与复位的always块样板always@(posedgeclkorposedgesetorposedgereset)beginif(reset)begin/*置输出为0*/endelseif(set

温馨提示

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

评论

0/150

提交评论