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

下载本文档

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

文档简介

数字系统有两大类有限状态机(FiniteStateMachine,FSM):Moore状态机和Mealy状态机。Moore状态机其最大特点是输出只由当前状态确定,与输入无关。Moore状态机的状态图中的每一个状态都包含一个输出信号。这是一个典型的Moore状态机的状态跳转图,x、y、z是输入,a、b、c是输出。elpcfonscom电elpcfonscom电3安抚安Mealy状态机它的输出不仅与当前状态有关系,而且与它的输入也有关系,因而在状态图中每条转移边需要包含输入和输出的信息。状态编码数字逻辑系统状态机设计中常见的编码方式有:二进制码(Binary码)、格雷码(Gray码)、独热码(Onehot码)以及二一^进制码(BCD码)。格雷码的特点:相邻的两个码组之间仅有一位不同。普通二进制码与格雷码之间可以相互转换。二进制码转换为格雷码:从最右边一位起,一次与左边一位''异或”,作为对应格雷码该位的值,最左边的一位不变(相当于最左边是0)。格雷码转换为二进制码:从左边第二位起,将每一位与左边一位解码后的值''异或",作为该解码后的值(最左边的一位依然不变)。独热码又分为独热1码和独热0码,是一种特殊的二进制编码方式。当任何一种状态有且仅有一个1时,就是独热1码,相反任何一种状态有且仅有一个0时,就是独热0码。状态机的描述状态机有三种描述方式:一段式状态机、两段式状态机、三段式状态机。下面就用一个小例子来看看三种方式是如何实现的。

一段式状态机当把整个状态机卸载一个always模块中,并且这个模块既包含状态转移,又含有组合逻辑输入/输出时,称为一段式状态机。不推荐采用这种状态机,因为从代码风格方面来讲,一般都会要求把组合逻辑和时序逻辑分开;从代码维护和升级来说,组合逻辑和书序逻辑混合在一起不利于代码维护和修改,也不利于约束。〃一段式状态机来实现:在异步复位信号的控制下,一段式状态机进入IDLE〃状态,q_sig4被复位,一旦sigl或者sig2有效,状态机进入WAIT状态,如果//sigl和sig2同时有效,那么状态机进入DONE状态,〃如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。5.moduleone_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4,q_sm_state);〃数据声明部分inputclk,reset,sig1,sig2,sig3;9.outputregq_sig4;outputreg[1:0]q_sm_state;

12.13.〃参数声明14.parameterIDLE=2'b00;15.parameterWAIT=2'b01;parameter17.DONE=2'b10;18.〃状态跳转逻辑程序设计19.always@(posedgeclkorposedgereset)20.begin21.if(reset)22.begin23.q_sig4 <=0;24.q_sm_state<=IDLE;25.end26.else27.begin28.case(q_sm_state)29.IDLE:begin30.if(sig1||sig2)31.begin32.q_sm_state<=WAIT;33.q_sig4<=1'b0;34.end35.else36.begin37.q_sm_state<=IDLE;38.q_sig4<=1'b0;39.end40.end41.WAIT:begin42.if(sig2&&sig3)

44.q_sm_state<=DONE;45.q_sig4<=1'b0;46.end47.else48.begin49.q_sm_state<=WAIT;50.q_sig4<=1'b0;51.end52.end53.54.DONE:begin55.if(sig3)56.begin57.q_sm_state<=IDLE;58.q_sig4<=1'b1;59.end60.else61.begin62.q_sm_state<=DONE;63.q_sig4<=1'b0;64.end65.end66.67.default:begin68.q_sm_state<=IDLE;69.q_sig4 <=0;70.end71.endcase72. end73.end74.endmodule复制代码两段式状态机所谓的两段式状态机就是采用一个always语句来实现时序逻辑,另外一个always语句来实现组合逻辑,提高了代码的可读性,易于维护。不同于一段式状态机的是,它需要定义两个状态 现态和次态,然后通过现态和次态的转换来实现时序逻辑。〃本例主要采用两段式状态机:在异步复位信号的控制下,一段式状态机进入IDLE〃状态,q_sig4被复位,一旦sigl或者sig2有效,状态机进入WAIT状态,如果sigl和sig2同时有效,那么〃状态机进入DONE状态,如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。4.moduletwo_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4);〃数据声明部分inputclk,reset,sig1,sig2,sig3;8.outputregq_sig4;10.reg[1:0] current_state,next_state;12.〃参数声明parameter IDLE = 2'b00;parameter WAIT = 2'b01;parameter DONE = 2'b10;17.〃状态跳转程序设计always@(posedgeclkorposedgereset)if(reset)current_state<=IDLE;elsecurrent_state<=next_state;24.〃状态逻辑输出26.always@(current_stateorsig1orsig2orsig3)

27.begin28.case(current_state)29.IDLE:begin30.if(sig1||sig2)31.begin32.next_state=WAIT;33.q_sig4 =1'b0;34.end35.else36.begin37.next_state=IDLE;38.q_sig4 =1'b0;39.end40.end41.WAIT:begin42.if(sig2&&sig3)43.begin44.next_state=DONE;45.q_sig4 =1'b0;46.end47.else48.begin49.next_state=WAIT;50.q_sig4 =1'b0;51.end52.end53.54.DONE:begin55.if(sig3)56.begin57.next_state=IDLE;58.q_sig4 =1'b1;

60.else61.begin62.next_state=DONE;63.q_sig4 =1'b0;64.end65.end66.67. default:begin68.next_state=IDLE;69.q_sig4 =0;70.end71. endcase72.73.end74.endmodule59.end复制代码三段式状态机三段式状态机与两段式状态机的区别:两段式直接采用组合逻辑输出,而三段式则通过在组合逻辑后再增加一级寄存器来实现时序逻辑输出。这样做的好处是可以有效地滤去租个逻辑输出的毛刺,同时可以有效地进行时序计算与约束,另外对于总线形式的输出信号来说,容易使总线数据对其,从而减小总线数据间的偏移,减小接收端数据采样出错的频率。三段式状态机的基本格式是:第一个always语句实现同步状态跳转;第二个always语句实现组合逻辑;第三个always语句实现同步输出。〃本例主要采用三段式状态机:在异步复位信号的控制下,一段式状态机进入IDLE〃状态,q_sig4被复位,一旦sigl或者sig2有效,状态机进入WAIT状态,如果sigl和sig2同时有效,那么〃状态机进入DONE状态,如果sig4还有效,那么q_sig4置位,同时状态机进入IDLE状态。4.modulethree_seg_fsm(clk,reset,sig1,sig2,sig3,q_sig4);〃数据声明部分7.inputclk,reset,sig1,sig2,sig3;7.8.9.outputregq_sig4;10.11.reg[1:0]current_state,next_state;11.reg[1:0]current_state,next_state;12.13.〃参数声明14.parameterIDLE=2'b00;15.parameterWAIT=2'b01;16.parameterDONE=2'b10;14.parameterIDLE=2'b00;15.parameterWAIT=2'b01;16.parameterDONE=2'b10;17.18.〃状态跳转程序设计19.always@(posedgeclkorposedgereset)19.20.if(reset)21.currentstate<=IDLE;22.else23.currentstate<=next_state;20.if(reset)21.currentstate<=IDLE;22.else23.currentstate<=next_state;24.25.〃状态跳转输出26.always@(current_stateorsig1orsig2orsig3)27.begin28.case(current_state)29.IDLE:begin30.if(sig1||sig2)31.begin32.nextstate33.34.35.36.WAIT;endelsebeginnextstateIDLE;26.always@(current_stateorsig1orsig2orsig3)27.begin28.case(current_state)29.IDLE:begin30.if(sig1||sig2)31.begin32.nextstate33.34.35.36.WAIT;endelsebeginnextstateIDLE;37.end38.end39.WAIT:begin40.if(sig2&&sig3)41.begin42.next_stateDONE;43.end44.else45.begin46.next_stateWAIT;47.end48.end49.50.DONE:begin51.if(sig3)52.begin53.next_stateIDLE;54.end55.else56.begin57.next_stateDONE;58.end59.end60.61.default:begin62.next_state=IDLE;63.end6

温馨提示

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

评论

0/150

提交评论