实验七有限状态机设计一、实验目的1、掌握利用有限状态机实现一般时序逻辑分析的方法;2、掌握用VHDL或Verilog编写可综合的有限状态机的标准模板;3、掌握用VHDL或Verilog编写序列检测器以及其他复杂逻辑电路的设计;二、实验内容1、用MOORE型状态机设计一个具有双向步进电动机控制实验:该控制电路有三个输入信号:clk时钟信号,clr复位信号,dir方向控制信号。输出信号为phase[3..0]用来控制步进电机的动作。当dir=1时要求phase[3..0]按照“0001”,“0010”,“0100”,“1000”的顺序变化;当dir=0时要求phase[3..0]按照“0001”,“1000”,“0100”,“0010”的顺序变化。2、设计一个简单的状态机,功能是检测一个5位的二进制序列“10010”。3、设计一个串行数据检测器,要求是:连续4个或4个以上为1时输出为1,其他输入情况为0。(选做)4、根据状态图,写出对应于结构图b,分别由主控组合进程和主控时序进程组成的VERILOG有限状态机描述。(选做)三、实验步骤实验一:1、建立工程2、创建VerilogHDL文件3、输入程序代码并保存modulemoore1(clk,clr,dir,phase);inputclk,clr,dir;output[3:0]phase;reg[3:0]phase;reg[1:0]state;parameters0='b00,s1='b01,s2='b10,s3='b11;always@(posedgeclk)beginif(clr)beginphase='b0000;state=s0;endelsebegincase(state)s0:if(dir)beginphase='b0010;state=s1;endelsebeginphase='b1000;state=s3;ends1:if(dir)beginphase='b0100;state=s2;endelsebeginphase='b0001;state=s0;ends2:if(dir)beginphase='b1000;state=s3;endelsebeginphase='b0010;state=s1;ends3:if(dir)beginphase='b0001;state=s0;endelsebeginphase='b0100;state=s2;endendcaseendendendmodule4、进行综合编译5、新建波形文件6、导入引脚,设置信号源并保存7、功能仿真,结果分析由仿真波形图可以看出当dir=1时,phase[3..0]按照0001,0010,0100,1000的顺序变化,当dir=0时phase[3..0]按照0001,1000,0100,0010的顺序变化。所以设计正确。实验二:1、建立工程2、创建VerilogHDL文件3、输入程序代码并保存moduleseqdet(x,z,clk,rst,state);inputx,clk,rst;outputz;output[2:0]state;reg[2:0]state;wirez;parameterIDLE='d0,A='d1,B='d2,C='d3,D='d4,E='d5,F='d6,G='d7;assignz=(state==E&&x==0)?1:0;always@(posedgeclk)if(!rst)beginstate=IDLE;endelsecasex(state)IDLE:if(x==1)beginstate=A;endA:if(x==0)beginstate=B;endB:if(x==0)beginstate=C;endelsebeginstate=F;endC:if(x==1)beginstate=D;endelsebeginstate=G;endD:if(x==0)beginstate=E;endelsebeginstate=A;endE:if(x==0)beginstate=C;endelsebeginstate=A;endF:if(x==1)beginstate=A;endelsebeginstate=B;endG:if(x==1)beginstate=F;enddefault:state=IDLE;endcaseendmodule//测试代码`timescale1ns/1nsmoduleseqdet_Top;regclk,rst;reg[23:0]data;wire[2:0]state;wirez,x;assignx=data[23];always#10clk=~clk;always@(posedgeclk)data={data[22:0],data[30]};initialbeginclk=0;rst=1;#2rst=0;#30rst=1;data='b1100_1001_0000_1001_0100;#500$stop;endseqdetm(x,z,clk,rst,state);endmodule4、进行综合编译5、新建波形文件6、导入引脚7、设置信号源并保存8、功能仿真9、仿真结果分析由波形图可以看出状态由000-001-010-011-100,即对应IDLE-A-B-C-D-E的状态转换即10010.所以设计正确。实验三:1、建立工程2、创建VerilogHDL文件3、输入程序代码并保存modulejiance_ljj(clk,clr,a,out);inputclk,clr,a;outputout;regout;reg[2:0]t;always@(posedgeclkorposedgeclr)beginif(clr)begint=0;out=0;endelsebegincase(t)'b000:beginif(a)t='b001;elset='b000;out=0;end'b001:beginif(a)t='b010;elset='b000;out=0;end'b010:beginif(a)t='b011;elset='b000;out=0;end'b011:beginif(a)t='b100;elset='b000;out=0;end'b100:begint='b000;if(a)out=1;elseout=0;endendcaseendendendmodule4、进行综合编译5、新建波形文件6、导入引脚7、设置信号源并保存8、生成网表9、仿真结果分析由仿真波形可知结果正确