基于状态机的工程设计

基于状态机的工程设计
基于状态机的工程设计

2.6.4.2 基于状态机的工程设计方法

学习利用quartusII软件中的状态机编辑器设计一个1110010序列检测器。

1.建立工程文件

工程文件的建立主要包括指定工程文件名称、选择添加的文件和库及选择目标器件3个过程。

在quartusII菜单栏中选择Fil e→New Project Wizard,在弹出的图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菜单栏中选择Fil e→New,或单击工具栏中的按钮,在弹出的新建文件对话框中,选择State Machine File,单击OK按钮,进入如图2.6.10所示的状态机编辑器窗口。

图2.6.10 quartusII的状态机编辑窗口

⑵创建状态机

在quartusII的状态机编辑窗口的菜单栏中选择Tool s→State Machine Wizard,弹出如图2.6.11所示的状态机创建向导选择对话框。在该对话框中选择Edit an existing state machine design,点击OK按钮,进入如图2.6.12所示的状态机向导4步中的步骤1对话框。

图2.6.11 状态机创建向导选择对话框

①状态机向导步骤1:

在图 2.6.12对话框中,选择复位Reset信号模式:同步(Synchronous)或者异步(Asynchronous),该序列检测器设计选择异步复位;选中复位信号Reset高电平有效(Reset is active-high);选中输出端的输出方式为寄存器方式(Register the output ports),点击Next 按钮,进入状态机向导步骤2对话框如图2.6.13。

图2.6.12 状态机向导步骤1

②状态机向导步骤2:状态转换

在图2.6.13状态转换对话框中,在States栏中输入1110010序列检测器的状态名称s0、s1…s7,在Input ports栏中输入该检测器状态机的输入时钟信号clock、复位信号reset以及串行数据输入信号din。在State transitions栏中依据该序列检测器设计的状态图依次输入各种状态转换,设置完后点击Next,进入状态机向导步骤3的对话框,如图2.6.14

图2.6.13 状态机向导步骤2(状态转换)

③状态机向导步骤3:

在图2.6.14所示对话框中,在Output ports栏下的Output Port Name中输入该序列检测器设计的输出信号z,在Output State栏中选择Next clock cycle;在Action condition栏下的Output Port中输入该设计的输出信号z,在Output V alue栏以及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,选中Add file to current project,点击保存按钮,完成文件保存。

⑷生成对应的VHDL文件

选择Too l→Generate HDL File,在弹出的对话框2.6.17中选择产生程序代码HDL语言的种类,选择VHDL,点击OK按钮,则自动生成对应的余状态机文件名相同的VHDL文本文件exp_detect3.vhd,在文本编辑窗口中打开该状态机的VHDL代码。

图2.6.17 生成HDL文件对话框

基于状态机输入的1110010序列检测器的VHDL代码:exp_detect3.vhd

LIBRARY ieee;

USE ieee.std_logic_1164.all;

ENTITY exp_detect3 IS

PORT

( clock : IN STD_LOGIC;

reset : IN STD_LOGIC := '0';

din : IN STD_LOGIC := '0';

z : OUT STD_LOGIC );

END exp_detect3;

ARCHITECTURE BEHAVIOR OF exp_detect3 IS

TYPE type_fstate IS (s0,s1,s2,s3,s4,s5,s6,s7);

SIGNAL fstate : type_fstate;

SIGNAL reg_fstate : type_fstate;

SIGNAL reg_z : STD_LOGIC := '0';

BEGIN

PROCESS (clock,reg_fstate)

BEGIN

IF (clock='1' AND clock'event) THEN

fstate <= reg_fstate;

END IF;

END PROCESS;

PROCESS (fstate,reset,din,reg_z)

BEGIN

IF (reset='1') THEN

reg_fstate <= s0;

reg_z <= '0';

z <= '0';

ELSE

reg_z <= '0';

z <= '0';

CASE fstate IS

WHEN s0 =>

IF ((din = '1')) THEN

reg_fstate <= s1;

ELSIF (NOT((din = '1'))) THEN

reg_fstate <= s0;

-- Inserting 'else' block to prevent latch inference

ELSE

reg_fstate <= s0;

END IF;

WHEN s1 =>

IF ((din = '1')) THEN

reg_fstate <= s2;

ELSIF (NOT((din = '1'))) THEN

reg_fstate <= s0;

-- Inserting 'else' block to prevent latch inference ELSE

reg_fstate <= s1;

END IF;

WHEN s2 =>

IF ((din = '1')) THEN

reg_fstate <= s3;

ELSIF (NOT((din = '1'))) THEN

reg_fstate <= s0;

-- Inserting 'else' block to prevent latch inference ELSE

reg_fstate <= s2;

END IF;

WHEN s3 =>

IF (NOT((din = '1'))) THEN

reg_fstate <= s4;

ELSIF ((din = '1')) THEN

reg_fstate <= s2;

-- Inserting 'else' block to prevent latch inference ELSE

reg_fstate <= s3;

END IF;

WHEN s4 =>

IF (NOT((din = '1'))) THEN

reg_fstate <= s5;

ELSIF ((din = '1')) THEN

reg_fstate <= s1;

-- Inserting 'else' block to prevent latch inference ELSE

reg_fstate <= s4;

END IF;

WHEN s5 =>

IF ((din = '1')) THEN

reg_fstate <= s6;

ELSIF (NOT((din = '1'))) THEN

reg_fstate <= s0;

-- Inserting 'else' block to prevent latch inference

ELSE

reg_fstate <= s5;

END IF;

WHEN s6 =>

IF (NOT((din = '1'))) THEN

reg_fstate <= s7;

ELSIF ((din = '1')) THEN

reg_fstate <= s2;

-- Inserting 'else' block to prevent latch inference

ELSE

reg_fstate <= s6;

END IF;

WHEN s7 =>

IF ((din = '1')) THEN

reg_fstate <= s1;

ELSIF (NOT((din = '1'))) THEN

reg_fstate <= s0;

-- Inserting 'else' block to prevent latch inference

ELSE

reg_fstate <= s7;

END IF;

reg_z <= '1';

WHEN OTHERS =>

reg_z <= 'X';

report "Reach undefined state";

END CASE;

z <= reg_z;

END IF;

END PROCESS;

END BEHAVIOR;

⑸综合出的RTL viewer

图2.6.18 exp_detect3的(rtl viewer)

⑹仿真验证图

用状态机输入法完成的1110010序列检测器设计的仿真验证结果如图26.19。

图2.6.19 用状态机输入法完成的1110010序列检测器设计的仿真结果图

⑺下载硬件验证,观察实验结果并记录实验数据

⑻实验数据记录

①波形图

②波形仿真参数设置

③波形说明

相关主题
相关文档
最新文档