2.6.4.2基于状态机的工程设计方法学习利用quartusII软件中的状态机编辑器设计一个1110010序列检测器。1.建立工程文件工程文件的建立主要包括指定工程文件名称、选择添加的文件和库及选择目标器件3个过程。在quartusII菜单栏中选择File→NewProjectWizard,在弹出的图2.6.8对话框中输入新建工程所在的文件夹名称(exp_detect3)、工程名称(exp_detect3)和顶层实体名称(exp_detect3),然后点击Next,选择目标器件EPF10K20TC144-3,其他取系统默认设置,继续点击Next按钮,直至进入如图2.6.9所示的对话框,该对话框可以查看设置信息是否正确。正确则单击Finish按钮,完成工程文件的建立。图2.6.8创建新工程文件1(指定工程文件名称)图2.6.9工程创建结束对话框2.输入状态机⑴建立文件在quartusII菜单栏中选择File→New,或单击工具栏中的按钮,在弹出的新建文件对话框中,选择StateMachineFile,单击OK按钮,进入如图2.6.10所示的状态机编辑器窗口。图2.6.10quartusII的状态机编辑窗口⑵创建状态机在quartusII的状态机编辑窗口的菜单栏中选择Tools→StateMachineWizard,弹出如图2.6.11所示的状态机创建向导选择对话框。在该对话框中选择Editanexistingstatemachinedesign,点击OK按钮,进入如图2.6.12所示的状态机向导4步中的步骤1对话框。图2.6.11状态机创建向导选择对话框①状态机向导步骤1:在图2.6.12对话框中,选择复位Reset信号模式:同步(Synchronous)或者异步(Asynchronous),该序列检测器设计选择异步复位;选中复位信号Reset高电平有效(Resetisactive-high);选中输出端的输出方式为寄存器方式(Registertheoutputports),点击Next按钮,进入状态机向导步骤2对话框如图2.6.13。图2.6.12状态机向导步骤1②状态机向导步骤2:状态转换在图2.6.13状态转换对话框中,在States栏中输入1110010序列检测器的状态名称s0、s1…s7,在Inputports栏中输入该检测器状态机的输入时钟信号clock、复位信号reset以及串行数据输入信号din。在Statetransitions栏中依据该序列检测器设计的状态图依次输入各种状态转换,设置完后点击Next,进入状态机向导步骤3的对话框,如图2.6.14图2.6.13状态机向导步骤2(状态转换)③状态机向导步骤3:在图2.6.14所示对话框中,在Outputports栏下的OutputPortName中输入该序列检测器设计的输出信号z,在OutputState栏中选择Nextclockcycle;在Actioncondition栏下的OutputPort中输入该设计的输出信号z,在OutputValue栏以及INState栏中输入该设计的检测结果1极其状态s7。设置完后点击Next进入如图2.6.15所示的状态机向导步骤4。图2.6.14状态机向导步骤3④状态机向导步骤4:在图2.6.15所示对话框中显示出状态机的设置情况。点击Finish,关闭状态机向导,生成所需的状态机,将该状态机的各状态位置做适当调整,得到我们所需的状态图,如图2.6.16。图2.6.15状态机向导步骤4图2.6.16利用状态机向导完成的状态图⑶保存文件单击菜单栏中的按钮,在弹出的“另存为|”对话框中,默认该设计文件为exp_detect3.smf,选中Addfiletocurrentproject,点击保存按钮,完成文件保存。⑷生成对应的VHDL文件选择Tool→GenerateHDLFile,在弹出的对话框2.6.17中选择产生程序代码HDL语言的种类,选择VHDL,点击OK按钮,则自动生成对应的余状态机文件名相同的VHDL文本文件exp_detect3.vhd,在文本编辑窗口中打开该状态机的VHDL代码。图2.6.17生成HDL文件对话框基于状态机输入的1110010序列检测器的VHDL代码:exp_detect3.vhdLIBRARYieee;USEieee.std_logic_1164.all;ENTITYexp_detect3ISPORT(clock:INSTD_LOGIC;reset:INSTD_LOGIC:='0';din:INSTD_LOGIC:='0';z:OUTSTD_LOGIC);ENDexp_detect3;ARCHITECTUREBEHAVIOROFexp_detect3ISTYPEtype_fstateIS(s0,s1,s2,s3,s4,s5,s6,s7);SIGNALfstate:type_fstate;SIGNALreg_fstate:type_fstate;SIGNALreg_z:STD_LOGIC:='0';BEGINPROCESS(clock,reg_fstate)BEGINIF(clock='1'ANDclock'event)THENfstate=reg_fstate;ENDIF;ENDPROCESS;PROCESS(fstate,reset,din,reg_z)BEGINIF(reset='1')THENreg_fstate=s0;reg_z='0';z='0';ELSEreg_z='0';z='0';CASEfstateISWHENs0=IF((din='1'))THENreg_fstate=s1;ELSIF(NOT((din='1')))THENreg_fstate=s0;--Inserting'else'blocktopreventlatchinferenceELSEreg_fstate=s0;ENDIF;WHENs1=IF((din='1'))THENreg_fstate=s2;ELSIF(NOT((din='1')))THENreg_fstate=s0;--Inserting'else'blocktopreventlatchinferenceELSEreg_fstate=s1;ENDIF;WHENs2=IF((din='1'))THENreg_fstate=s3;ELSIF(NOT((din='1')))THENreg_fstate=s0;--Inserting'else'blocktopreventlatchinferenceELSEreg_fstate=s2;ENDIF;WHENs3=IF(NOT((din='1')))THENreg_fstate=s4;ELSIF((din='1'))THENreg_fstate=s2;--Inserting'else'blocktopreventlatchinferenceELSEreg_fstate=s3;ENDIF;WHENs4=IF(NOT((din='1')))THENreg_fstate=s5;ELSIF((din='1'))THENreg_fstate=s1;--Inserting'else'blocktopreventlatchinferenceELSEreg_fstate=s4;ENDIF;WHENs5=IF((din='1'))THENreg_fstate=s6;ELSIF(NOT((din='1')))THENreg_fstate=s0;--Inserting'else'blocktopreventlatchinferenceELSEreg_fstate=s5;ENDIF;WHENs6=IF(NOT((din='1')))THENreg_fstate=s7;ELSIF((din='1'))THENreg_fstate=s2;--Inserting'else'blocktopreventlatchinferenceELSEreg_fstate=s6;ENDIF;WHENs7=IF((din='1'))THENreg_fstate=s1;ELSIF(NOT((din='1')))THENreg_fstate=s0;--Inserting'else'blocktopreventlatchinferenceELSEreg_fstate=s7;ENDIF;reg_z='1';WHENOTHERS=reg_z='X';reportReachundefinedstate;ENDCASE;z=reg_z;ENDIF;ENDPROCESS;ENDBEHAVIOR;⑸综合出的RTLviewer图2.6.18exp_detect3的(rtlviewer)⑹仿真验证图用状态机输入法完成的1110010序列检测器设计的仿真验证结果如图26.19。图2.6.19用状态机输入法完成的1110010序列检测器设计的仿真结果图⑺下载硬件验证,观察实验结果并记录实验数据⑻实验数据记录①波形图②波形仿真参数设置③波形说明