关闭

综合性实验五、有限状态机的硬件描述语言设计方法

标签: 硬件
879人阅读 评论(3) 收藏 举报
分类:

电子设计自动化实验 实验五

EDA


一.实验名称:综合性实验五、有限状态机的硬件描述语言设计方法

二.实验目的:

1、 熟悉用硬件描述语言(VHDL)设计一般状态机所包含的几个基本部分;
2、 掌握用硬件描述语言(VHDL)设计 Moore 型和 Mealy 型有限状态机的方法; 
3、 了解状态机在信号输出方式、结构方式、状态表达方式和编码方式的差异。 
4、 学习用状态机实现序列检测器的设计,并对其进行仿真和硬件测试; 

三.实验内容:

1、 说明附件中例 5-11 的代码表达的是什么类型的状态机,它的优点是什么?** 
2、 利用 QuartusII 对例 5-11 进行文本编辑输入、仿真测试并给出仿真波形,了解控制信 号的时序;** 
3、 对例 5-11 进行引脚锁定并用实验箱完成硬件验证实验,采用 NO.8 电路结构;** 
4、 根据例 5-11 写出由两个主控进程构成的相同功能的符号化 Moore 型有限状态机,画 出状态图,并给出其仿真测试波形**。 
5、 将 8 位待检测序列数作为外部输入信号,即可随时改变序列检测器的检测序列数。写 出此功能的符号化有限状态机,并用你学号末两位的十进制码进行验证。** 

四.例5-11

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
ENTITY SCHK IS 
  PORT(DIN,CLK,CLR : IN STD_LOGIC;     
     AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); 
END SCHK; 

ARCHITECTURE BEHAV OF SCHK IS  
    SIGNAL Q : INTEGER RANGE 0 TO 8;  
        SIGNAL D : STD_LOGIC_VECTOR(7 DOWNTO 0);
  BEGIN   D<="11100101";  
       PROCESS(CLK,CLR)   
       BEGIN   
          IF CLR = '1' THEN Q<=0;   ELSIF CLK'EVENT AND CLK='1' THEN  
             CASE Q IS       
               WHEN 0=> IF DIN=D(7) THEN Q<=1; ELSE Q<=0; END IF;
               WHEN 1=> IF DIN=D(6) THEN Q<=2; ELSE Q<=0; END IF;
               WHEN 2=> IF DIN=D(5) THEN Q<=3; ELSE Q<=0; END IF;
               WHEN 3=> IF DIN=D(4) THEN Q<=4; ELSE Q<=0; END IF; 
               WHEN 4=> IF DIN=D(3) THEN Q<=5; ELSE Q<=0; END IF;  
               WHEN 5=> IF DIN=D(2) THEN Q<=6; ELSE Q<=0; END IF;    
               WHEN 6=> IF DIN=D(1) THEN Q<=7; ELSE Q<=0; END IF;
               WHEN 7=> IF DIN=D(0) THEN Q<=8; ELSE Q<=0; END IF; 
               WHEN OTHERS => Q<=0;   
            END CASE;  
           END IF;   
       END PROCESS;  
       PROCESS(Q) 
    BEGIN  
   IF Q=8 THEN AB<="1010";   
    ELSE AB<="1011";  
    END IF;  
 END PROCESS; 
 END BEHAV;

五.设计原理:

1.例子5-11

  1. 分析5-11代码可知,该段代码的功能是,检测一段由8位数字构成的序列。当完整输入该序列时,输出结果“1010”;反之则输出“1011”。在VHDL实体描述部分用作电路模块端口的有四个,下面分析其功能:
CLK:用作时钟,当检测到上升沿到来时,读入由DIN输入的数据。
CLR:用作清零信号,当为高电平时,将系统状态清零,即从Q<=0开始。
DIN:用于输入01组成的序列
AB: 用于输出一个4位的数,即"1010""1011"

同时,在结构体说明部分定义了两个信号,下面分析其功能:

Q:定义了从08的整数,共9个。用于描述状态。
D:定义了被检测序列,用于和由DIN输入的序列做对比。

2.波形仿真
SCHK仿真
由功能仿真图可以看出,由DIN输入数据,当CLK的上升沿到来时DIN数据,当检测出这个序列式,输出AB从”1011”变为”1010”。

3.硬件实现
在进行硬件实现时,根据具体的硬件,可将单个输入均接到三个按键上,如下图中的键6~8;输出可接一个带译码器的数码管,如下图译码器6。
这里写图片描述
在输入数据时,可将DIN所绑定引脚(如键8)置为1,此时CLK按键每按下一次代表一个时钟上升沿,便读入一个1;同理,将DIN置为0时,便可读入一个0。
按下CLR(如键7)时,系统状态清零,不管已输入多少,均清零重新检测。
这里写图片描述
由于数码管有译码功能,所以在显示时,读入数据或者检测不到正确的数列时显示为’b’(“1011”),检测到正确的数列时即变为’A’(“1010”)。

2.MOORE型有限状态机

将上述例子所实现的功能用由两个主控进程构成的MOORE型有限状态机来设计。
1.代码如下:

LIBRARY IEEE; 
USE IEEE.STD_LOGIC_1164.ALL; 
ENTITY MOORE_SCHK IS 
  PORT(DIN,CLK,CLR : IN STD_LOGIC;     
        AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); 
END MOORE_SCHK; 

ARCHITECTURE BEHAV OF MOORE_SCHK IS
  TYPE states IS (s0,s1,s2,s3,s4,s5,s6,s7,s8);  --定义各状态
  SIGNAL ST, NST : states :=s0;  --设定现态变量和次态变量
  SIGNAL D : STD_LOGIC_VECTOR(7 DOWNTO 0);

 BEGIN   
  COM: PROCESS(ST,DIN)   BEGIN --组合进程,规定各状态的转换方式
  D<="11100101";  
 CASE ST IS       --11100101
   WHEN s0=> IF DIN=D(7) THEN NST<=s1; ELSE NST<=s0; END IF;
   WHEN s1=> IF DIN=D(6) THEN NST<=s2; ELSE NST<=s0; END IF;
   WHEN s2=> IF DIN=D(5) THEN NST<=s3; ELSE NST<=s0; END IF;
   WHEN s3=> IF DIN=D(4) THEN NST<=s4; ELSE NST<=s0; END IF; 
   WHEN s4=> IF DIN=D(3) THEN NST<=s5; ELSE NST<=s0; END IF;  
   WHEN s5=> IF DIN=D(2) THEN NST<=s6; ELSE NST<=s0; END IF;    
   WHEN s6=> IF DIN=D(1) THEN NST<=s7; ELSE NST<=s0; END IF;
   WHEN s7=> IF DIN=D(0) THEN NST<=s8; ELSE NST<=s0; END IF;
   WHEN s8=> IF DIN=D(0) THEN NST<=s2; ELSE NST<=s0; END IF;
   WHEN OTHERS => NST<=s0;   
 END CASE;  
 END PROCESS;  

 REG:PROCESS (CLK,CLR)   BEGIN  --时序进程
   IF CLR = '1' THEN ST<=s0;   
      ELSIF CLK'EVENT AND CLK='1' THEN ST<=NST;
   END IF;
 END PROCESS REG;   
  AB <= "1010" WHEN ST=s8 ELSE "1011";
END BEHAV;

当有正确序列进入时,变为状态s8,输出序列AB变为”1010”,而当下一位数据为1时,即DIN=1,进入状态s2。这是因为测出的数据11恰好与原序列数的前两位相同。

波形仿真和硬件仿真均与上例没有区别。

3.具有”记忆”性的序列检测器

在上面两例中,检测器均不具有记忆功能,即若该输入数与检测序列不同时,状态就会被清零,不管前面已输入哪些数。例如上例中,第四位为’0’,而此时如果再输入一个’1’,状态就会被清零,重新开始检测。如果来’1’,状态不清零,而是保持在原状态,等待下一个’0’来进入下一个状态的话。因此,系统便具有”记忆“功能。
要实现以上功能,只需修改一句代码,即为”1”不清零,维持原状态。用例5-11举例。

WHEN 3=> IF DIN=D(4) THEN Q<=4; ELSE Q<=3; END IF; 

4.可随时改变检测序列数的检测器

以上三个例子中,检测的数列是固定在程序内部的,无法随时更改。要实现可随时更改待检测的序列,要将固定在程序内部的序列改为由外部输入,将SIGNAL D改为一个输入端口PORT,即在实体定义时加入D的输入端口,同时删除SIGNAL D。
1.代码如下:

ENTITY MOORE_SCHK IS 
  PORT(DIN,CLK,CLR : IN STD_LOGIC;     
       D : IN STD_LOGIC_VECTOR(7 DOWNTO 0);      
       AB : OUT STD_LOGIC_VECTOR(3 DOWNTO 0)); 
END MOORE_SCHK; 

2.波形仿真:
这里写图片描述
举个例子,输入的待检测序列为’3’(即00000011B)
由图片可以看出,当清零信号为’0’后开始检测序列,当连续输入六个’0’和一个’1’后,系统输入AB从’11’(即1011B)变为’10’(即1010B)。

3.硬件实现:
在硬件实现时,可将外部输入D(8位)绑定到键3和键4,一个按键控制4位。

0
0

猜你在找
深度学习基础与TensorFlow实践
【在线峰会】前端开发重点难点技术剖析与创新实践
【在线峰会】一天掌握物联网全栈开发之道
【在线峰会】如何高质高效的进行Android技术开发
机器学习40天精英计划
Python数据挖掘与分析速成班
微信小程序开发实战
JFinal极速开发企业实战
备战2017软考 系统集成项目管理工程师 学习套餐
Python大型网络爬虫项目开发实战(全套)
查看评论
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
    个人资料
    • 访问:173987次
    • 积分:2378
    • 等级:
    • 排名:第14875名
    • 原创:85篇
    • 转载:2篇
    • 译文:2篇
    • 评论:50条
    文章分类
    最新评论