EDA实验六-用状态图输入法实现序列检测器

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

EDA实验六用状态图输入法实现序列检测器

一、实验目的:

了解序列检测器的基本原理,Mealy型和Moore型状态机的基本原理,

掌握状态图输入法实现序列检测器的方法,并进行分析和仿真验证。

二、实验内容:

本实验内容是:用状态图输入法设计一个序列检测器,若检测器收到一组码流1110010则输出为1,否则输出为0。

三、实验方法:

实验方法:

采用基于FPGA进行数字逻辑电路设计的方法。

采用的软件工具是QuartusII软件仿真平台,采用的硬件平台是Altera EPF10K20TI144_4的FPGA试验箱。

实验步骤:

1、绘制状态图。打开QuartusII软件平台,建立工程文件夹,工程文件夹名称为exp_detect3。然后点击File中的New建立一个状态图文件(用State Machine File命令),然后设置并生成状态图。

2、按照实验箱上FPGA的芯片名更改编程芯片的设置。操作是点击Assign/Device,选取芯片的类型。

3、编译与调试。确定状态图文件为当前工程文件,点击Complier进行文件编译。编译结果有错误或警告,则将要调试修改直至文件编译成功。

4、波形仿真及验证。在编译成功后,点击Waveform开始设计波形。点击“insert the node”,按照程序所述引脚,任意设置各输入节点的输入波形…点击保存按钮保存。

5、FPGA芯片编程及验证,应记录实验结果进行分析。

四、实验过程:

用状态图输入法实现序列检测器:

1、建立工程文件,工程文件夹的名称为exp_detect3,工程名和顶层实体名称为exp_detect3。

工程建立过程中平台设置设置如下图所示:

2、工程建好后,即进行状态图的输入。

具体过程如下:

选择菜单File->New->State Machine File命令,打开State Machine Editor 窗口,如下图所示:

然后选择Tools->State Machine Wizard 命令,弹出如下所示状态机创建向导对话框。在该对话框中选择Create a new state machine design 单选按钮,点击OK按钮进入下一个页面,如下所示:

然后在下一个对话框中选择复位Reset信号为异步Asynchronous,高电平有效,输出端无寄存器。单击Next按钮进入下一个页面。

在状态转换对话框中设置状态转换。States栏中输入状态名称s0~s6。Input ports栏中输入时钟信号clock、复位信号reset以及串行数据输入信号din。State transitions 栏中依据书中状态图指定的状态转换,设置完成后点击Next 按钮,进入下一页面:

在output ports栏Output Port Name 列中输入z,Output State 状态设为Current clock cycle 。Action condition 栏设为s6状态且Additional Conditions为“~din”成立时信号,z输出为1 。设置完成后单击next按钮进入下一个页面:

在下图对话框中显示状态机的设置情况。单击Finish按钮,关闭状态机向导,生成所需的状态机。布局适当调整,得到所需的状态图,状态图如下图所示:

生成并调整后的状态图:

3、保存该设计文件为exp_detect3.smf,并添加到工程文件夹。

4、选择菜单Tools->Gennrate HDL File 命令,打开Gennrate HDL File对话框,如下图所示,从中选择VHDL单选项,单击OK按钮,分析成功后则自动生成exp_detect3.vhd。

生成的VHDL代码如下:

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);

SIGNAL fstate : type_fstate;

SIGNAL reg_fstate : type_fstate;

BEGIN

PROCESS (clock,reset,reg_fstate)

BEGIN

IF (reset='1') THEN

fstate <= s0;

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

fstate <= reg_fstate;

END IF;

END PROCESS;

PROCESS (fstate,din)

BEGIN

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;

相关文档
最新文档