第8章 Verilog有限状态机设计

整理文档很辛苦,赏杯茶钱您下走!

免费阅读已结束,点击下载阅读编辑剩下 ...

阅读已结束,您可以下载文档离线阅读编辑

资源描述

第8章Verilog有限状态机设计8.1有限状态机(FSM)有限状态机(FiniteStateMachine,FSM)1、适于设计数字系统的控制模块,适于用FPGA实现;2、认为是组合逻辑和寄存器逻辑的特殊组合,寄存器用于存储状态,组合逻辑用于状态译码和产生输出信号;8.1有限状态机摩尔型(Moore)状态机米里型(Mealy)状态机摩尔型状态机与米里型状态机1、状态机的概念摩尔型moore状态机:输出只与当前状态有关,需等待时钟的到来;米里型mealy状态机:输出与当前状态和输入有关,不依赖时钟信号的同步;2、moore状态机的实现:用case(检查当前状态)语句和else-if(决定下一状态)语句实现。3、有三种表示方法:状态图(StateDiagram)、状态表(StateTable)流程图状态机的应用实现各种计数器;实现各种序列发生器;实现序列检测;其它时序电路。应用1--用状态机设计计数器可看成是按照固定的状态转移顺序进行转换的状态机。【例8.1】两个always过程【例8.2】单过程P196,输出信号z比【例8.1】的延后了一个时钟周期的时间用状态机设计计数器【例8.1】两个always过程【例8.2】单过程用状态机设计模5计数器?modulefsm(clk,clr,z,qout);inputclk,clr;outputregz;outputreg[2:0]qout;always@(posedgeclkorposedgeclr)//此过程定义状态转换beginif(clr)qout=0;//异步复位elsecase(qout)3'b000:qout=3'b001;3'b001:qout=3'b010;3'b010:qout=3'b011;3'b011:qout=3'b100;3'b100:qout=3'b000;default:qout=3'b000;/*default语句*/endcaseendalways@(qout)/*此过程产生输出逻辑*/begincase(qout)3'b100:z=1'b1;default:z=1'b0;endcaseendendmodulemodulefsm52(clk,clr,z);inputclk,clr;outputregz;outputreg[4:0]state;Parameters0=5'b00001,s1=5'b00010,s2=5'b00100,s3=5'b01000,s4=5'b10000;/*状态编码,采用一位热码方式*/always@(posedgeclkorposedgeclr)//此过程定义状态转换beginif(clr)state=s0;//异步复位elsecase(state)s0:state=s1;s1:state=s2;s2:state=s3;s3:state=s4;s4:state=s0;default:state=s0;/*default语句*/endcaseendalways@(state)/*此过程产生输出逻辑*/begincase(state)s4:z=1'b1;default:z=1'b0;endcaseendendmodule例1:用状态机实现模7计数器S0/0S1/0S2/0S3/0S4/0S5/0S6/1模7计数器状态图modulecounter_fsm(clk,clear,co,q);inputclk,clear;outputco;output[3:0]q;regco;reg[3:0]current,next,q;parameterST0=0,ST1=1,ST2=2,ST3=3,ST4=4,ST5=5,ST6=6;always@(negedgeclearorposedgeclk)beginif(!clear)beginq=0;co=0;next=ST1;endelsecase(current)ST0:beginq=current;co=0;next=ST1;endST1:beginq=current;co=0;next=ST2;endST2:beginq=current;co=0;next=ST3;endST3:beginq=current;co=0;next=ST4;endST4:beginq=current;co=0;next=ST5;endST5:beginq=current;co=0;next=ST6;endST6:beginq=current;co=1;next=ST0;enddefault:next=ST0;endcasecurrent=next;endendmodule注意进位的处理。(1)用三个过程描述:即现态(CS)、次态(NS)、输出逻辑(OL)各用一个always过程描述。(2)双过程描述(CS+NS、OL双过程描述):使用两个always过程来描述有限状态机,一个过程描述现态和次态时序逻辑(CS+NS);另一个过程描述输出逻辑(OL)。(3)双过程描述(CS、NS+OL双过程描述):一个过程用来描述现态(CS);另一个过程描述次态和输出逻辑(NS+OL)。(4)单过程描述:在单过程描述方式中,将状态机的现态、次态和输出逻辑(CS+NS+OL)放在一个always过程中进行描述。好处是相当于采用时钟信号来同步输出信号,克服输出逻辑信号出现毛刺的问题;但输出信号比双过程的延后了一个时钟周期的时间。8.2有限状态机的几种描述方式应用2--“101”序列检测器的Verilog描述(三个过程)modulefsm1_seq101(clk,clr,x,z);inputclk,clr,x;outputregz;reg[1:0]state,next_state;parameterS0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;/*状态编码,采用格雷(Gray)编码方式*/always@(posedgeclkorposedgeclr)/*该过程定义当前状态*/beginif(clr)state=S0;//异步复位,s0为起始状态elsestate=next_state;endalways@(stateorx)/*该过程定义次态*/begincase(state)S0:beginif(x)next_state=S1;elsenext_state=S0;endS1:beginif(x)next_state=S1;elsenext_state=S2;endS2:beginif(x)next_state=S3;elsenext_state=S0;endS3:beginif(x)next_state=S1;elsenext_state=S2;enddefault:next_state=S0;/*default语句*/endcaseendalways@(state)/*该过程产生输出逻辑*/begincase(state)S3:z=1'b1;default:z=1'b0;endcaseendendmodule“101”序列检测器的Verilog描述(三个过程)“101”序列检测器(单过程描述)modulefsm4_seq101(clk,clr,x,z);inputclk,clr,x;outputregz;reg[1:0]state;parameterS0=2'b00,S1=2'b01,S2=2'b11,S3=2'b10;/*状态编码,采用格雷(Gray)编码方式*/always@(posedgeclkorposedgeclr)Beginif(clr)state=S0;//异步复位,s0为起始状态elsecase(state)S0:beginif(x)beginstate=S1;z=1'b0;endelsebeginstate=S0;z=1'b0;endendS1:beginif(x)beginstate=S1;z=1'b0;endelsebeginstate=S2;z=1'b0;endendS2:beginif(x)beginstate=S3;z=1'b0;endelsebeginstate=S0;z=1'b0;endendS3:beginif(x)beginstate=S1;z=1'b1;endelsebeginstate=S2;z=1'b1;endenddefault:beginstate=S0;z=1'b0;end/*default语句*/endcaseendendmodule8.3状态编码◆顺序编码(SequentialStateMachineEncoding)◆格雷编码(GrayCode)◆约翰逊编码(JohnsonStateMachineEncoding)◆一位热码(One-HotEncoding)采用n位(或n个触发器)来编码具有n个状态的状态机。1.常用的编码方式表8.1.四种编码方式的对比b3b2b1b023222120表8.1四种编码方式的对比状态编码方式顺序编码格雷编码约翰逊编码一位热码0000state0000000000000000000000000000000010001State1000100010000000100000000000000100010State2001000110000001100000000000001000011State3001100100000011100000000000010000100State4010001100000111100000000000100000101State5010101110001111100000000001000000110State6011001010011111100000000010000000111State7011101000111111100000000100000001000State8100011001111111100000001000000001001State9100111011111111000000010000000001010State10101011111111110000000100000000001011State11101111101111100000001000000000001100State12110010101111000000010000000000001101State13110110111110000000100000000000001110State14111010011100000001000000000000001111state1511111000100000001000000000000000顺序编码与一位热码如共有16个状态需要编码,顺序编码需要4位;一位热码需要16位,即24=16;多用了触发器,但可有效节省和简化译码电路。对于FPGA,建议采用一位热码。表8.1P204例8.8P206--自动转换量程频率计控制器一位热码编码选择对话框(QuartusⅡ)一位热码(One-HotEncoding)2.状态编码的定义在Verilog语言中,有两种方式可用于定义状态编码,分别用parameter和'define语句实现,比如要为state0、state1、state2、state3四个状态定义码字为:00、01、11、10,可采用下面两种方式。方式1:用parameter参数定义parameterstate1=2'b00,state2=2'b01,state3=2'b11,state4=2'b10;……case(state)state1:…;//调用state2:…;……要注意两种方式定义与调用时的区别,一般情况下,更倾向于采用方式1来定义状态编码。一般使用case、casez和casex语句来描述状态之间的转换,用case语句表述比用if-else语句更清晰明了。状态编码的定义方式2:用'define语

1 / 29
下载文档,编辑使用

©2015-2020 m.777doc.com 三七文档.

备案号:鲁ICP备2024069028号-1 客服联系 QQ:2149211541

×
保存成功