10 第十章 使用VHDL语言来设计状态机
状态机VHDL讲解

VHDL的结构非常适合编写状态机,而且编写方式不唯一,电路的集成也会随着编写的方式而改变。
状态机的设计主要用到case when 和if else 两种语句。
Case when 用来指定并行的行为,而if then else 用来设计优先度的编码逻辑。
分析状态机有如下特点:1.对于状态的描述一般先声明一个枚举数据类型,语句如下:Type state_type is(idle,tap1,tap2,tap3,tap4);2.对于存储当前状态的对象一般用是一个信号,即:Signal state: state_type;3.对于状态机的下一个状态的判断一般是通过对时钟上升沿判断的if then else 语句内嵌case when 语句4.对于状态机的输出则可以用一个条件或者选择信号声明语句,或者再用一个case语句来实现信号输出。
状态机分为三大类型:1.Moore状态机:次态=f(现状),输出=f(现状),即输出信号是直接由状态寄存器译码得到2.Mealy状态机:次态=f(现状,输入),输出=f(现状,输入),即以现时的输入信号结合即将变成次态的现状编码成信号输出。
3.混合型状态机我们用一个序列信号发生器的实例来做练习。
(状态机将在以后的很多实例中加以运用,请掌握其编写方法)序列信号就是一些串行的周期性信号,这些信号在每个循环周期内1和0数码按一定的规则顺序排列。
下面所讲解的序列发生器能够按规定输出8位’0’,’1’序列。
代码如下:逐行解释:10:清零复位信号,高电平复位清零。
12:序列信号输出。
因为是8位的端口,但序列信号是串行的,所以相当于有8路的序列信号,任取一位端口就是一个序列信号输出。
17:用type声明一种枚举类型。
共8中状态,每个状态都对应唯一的一种输出,至于在什么状态输出什么信号则由程序决定。
18:定义一个state类型信号量,其初始的状态为s0。
19-26:用constant定义一些常量,这些常量将作为在不同状态时的输出信号。
VHDL状态机

ST0 ST1
ST2
ST3 ST4
42
st0 对0809初始化
LOCK:
0-→1 由LOCK 信号锁 存转换 好的数
据
st4 OE=’1'
st1
数据输出 有效
采样周 期等待
st3
st2
启动AD 转换 EOC=
‘0’正 在转换
EOC=‘1'转换结束
图8-6 控制ADC0809采样状态图
43
PROCESS
30
31
32
33
34
35
36
37
38
以下以ADC0809为例 ,说明状态机的设计 方法。用状态机对 0809进行采样控制首 先必须了解工作时序 ,然后据此作出状态 图,最后写出相应的 VHDL代码。
ADC0809 ALE
sin START OE
clk ADDA EOC D[7..0]
VHDL状态机设计
1
2
3
4
5
6
Moore型有限状态机的结构图
7
Mealy型有限状态机的结构图
8
9
10
11
12
13
14
用户自定义数据类型定义语句
这里介绍与有限状态机设计有重要联 系的其它语法现象,即用户自定义数据类 型定义语句及相关的语法现象。如枚举型 、整数类型、数组类型、记录类型、时间 类型、实数类型等。
39
ADC0809工作时序 地址锁存信号
转换启动控制 进入转换状态 转换状态结束
输出有效控制
输出数据 稳定 40
时序图中,START为转换启动控制 信号,高电平有效;ALE为模拟信号输 入选通端口地址锁存信号,上升沿有效; 一旦START信号有效后,状态信号EOC 即变为低电平,表示进入转换状态。转换 结束后,EOC将变为高电平。此后外部 控制可以使OE由低电平变为高电平(输 出有效),此时,0809的输出数据总线 D[7..0]从原来的高阻态变为输出数据有效 。
《VHDL状态机》课件

总结与展望
1 VHDL 状态机对数字电路设计的重要性
VHDL状态机能够将数字电路行为直观地表示出来,提高设计效率。
2 VHDL 状态机在工业自动化控制中的作用
VHDL状态机在自动化控制系统中扮演着重要的角色,提高系统的智能化。
3 VHDL 状态机的发展前景
随着数字电路和自动化技术的不断发展,VHDL状态机将继续发挥重要作用。
《VHDL状态机》PPT课件
VHDL状态机是一种描述数字电路行为的建模语言,本课件将介绍VHDL状态机 的定义、作用以及其在数字电路设计中的重要性。
什么是 VHDL 状态机
定义
VHDL状态机是一种用于描述数字电路中组合逻辑与时序逻辑之间关系的建模方法。
作用
VHDL状态机能够将数字电路行为清晰地表示出来,方便设计者进行分析和调试。
VHDL 状态机的设计方法
1
状态定义
确定所需的状态数量,并为每个状态指定一个唯一的编码。
2
状态转移
根据输入信号和当前状态,定义状态之间的转移条件。
3
输出定义
根据当前状态和输入信号,定义对应的输出信号。
1 VHDL 状态机设计实例
设计一个灯泡控制系统,根据不同输入信号以及当前状态控制灯泡的亮、灭。
VHDL 状态机的调试技巧
VHDL 状态机的基本结构
状态寄存器
用于存储当前状态信息,决 定下一状态的变化。
组合逻辑
根据输入信号和当前状态, 决定下一状态。
输出逻辑
根据当前状态和输入信号, 产生输出信号。
1 VHDL 状态机的两种类型
Moore 状态机:输出只与当前状态有关;Mealy 状态机:输出与当前状态和输入信号有关。
用VHDL设计有限状态机的方法

用VHDL设计有限状态机的方法现代数字系统的设计一般都采用自顶向下的模块化设计方法。
即从整个系统的功能出发,将系统分割成若干功能模块。
在自顶向下划分的过程中,最重要的是将系统或子系统按计算机组成结构那样划分成控制器和若干个受控制的功能模块。
受控部分通常是设计者们所熟悉的各种功能电路,设计较为容易。
主要任务是设计控制器,而其控制功能可以用有限状态机来实现。
因而有必要深入探讨有限状态机的设计方法。
1 状态机设计的一般方法 传统的设计方法是首先绘制出控制器的状态利用VHDL设计状态机,不需要进行繁琐的状态分配、绘制状态表和化简次态方程。
设计者不必使用卡诺(1)根据系统要求确定状态数量、状态转移的条件和各状态输出信号的赋值,并画出状态转移(2)按照状态转移(3)利用EDA工具对状态机的功能进行仿真验证。
下面以离心机定时顺序控制器的设计为例,说明状态机的设计方法。
2 定时顺序控制状态机的设计 在化工生产中,离心机用于固、液分离的工艺流程,如系统工作方式如下:当系统处于初始状态或复位信号reset有效时,系统处于复位状态。
按下自动工作键C0,系统进入加料工序并开始自动控制离心机的运行。
以加水工序为例,首先在加水预置数状态(water_ld)时,状态机输出信号FO,开启加水电磁阀及指示灯,同时输出信号G控制选通加水时间预置数,在LD1信号的控制下,将预置数送入COUNTER1。
此时ENA1=1,J=1,使计数器为减计数状态。
然后,在下一个时钟周期进入加水工作状态(water),并开始减计时。
当计时为零时,计数器发出借位信号R1作为此工序结束的信号送入状态机,使其转入。
基于VHDL语言的有限状态机设计方法

计算机技术与应用进展 ・ 0 2 4 0
硬币,则给出 1 盒饮料的同时找回5 角钱。 这是一个属于M a 型状态机问 el y 题。 状态机的状态转换图 如图4 所示, 投币 信号是输入逻辑变量, 用 A和 B表示,A 1 = 表示投入一枚 1 元硬币,B 1 = 表示投入一枚 5 角硬币。输出信号用 Y和 Z表示, Y1 = 表示售出一盒饮料,Z 1 = 表示找回 5 角钱。
E I Y OOR I NT T M EI S
PR( O T
C , I S D L G C 一C O K PR : T _ I; d N O LC
AB: T e I; - I u - , I S D L GC N s O pt n S nl ia g S nl ia g
BE N GI
R G : R C S (dC ) O E S , E IP R P
BE N GI
I R =' T N F d 0 HE '
C r nSa < S ; ur tt e O e t =
E SE 'VE L I CPE NTAND CP=' T N 1 HE '
态译码电路较少。
3 o 型状态机的描述 Mor e
用V D 描述状态转换图如图3 HL 所示的状态机, 该状态 机属于 Mor型,状态机有四种状态,分别是 S , , , o e O S S l 2 S 。有一个状态输入信号 A和一个状态输出信号 Y 3 o 用V D 描述 M O E型 HL O R 状态机时, 需要区分组合逻辑 电 路部分和时序逻辑电路部分。用一个 P O E S R C S 语句描述 N 组合逻辑电路和输出组合逻辑电路, S 用另一个 P O E S R CS 语句描述当前状态寄存器, 属于时序逻辑电路。 P O E S 用 R CS 语句描述时序逻辑电路要用到 I C ' E T D F E N A C PV N P=1 1 . TE H N语句,并且要把时钟信号引入敏感信号列表中。因为 M O E型状态机的输出只与当前的状态有关,所以在描述 OR 图3 o 型状态机状态转换图 Mor e 组合逻辑电路的进程中用 C S- E 语句判别有限状态 A EWH N F LEE D语 - 机的四个状态, 把输出 信号变量的赋值语句放在 I-L EE D语句之后,而不能放在 I E S-N F S-N E
10进制加减计数器状态机的VHDL设计

10进制加减计数器状态机的VHDL设计一、【设计目的】学习并掌握Quartus II 开发系统的基本操作。
掌握用Quartus II进行文本输入法进行电路设计、编译和仿真方法。
掌握CPLD/FPGA的开发流程。
掌握EDA实验开发系统的使用。
掌握状态机的原理。
掌握简单状态机的VHDL设计方法掌握计数器的设计方法。
掌握带有复位和和时钟使能的10进制计数器的原理。
掌握通用计数器的设计方法。
学习使用VHDL进行时序逻辑电路的设计。
学习利用真值表编写VHDL程序。
学习掌握7段数码显示译码器设计的原理。
掌握VHDL语言方式设计7段数码显示译码器。
学习掌握8位数码管动态扫描显示电路的原理。
掌握VHDL语言设计8位数码管动态扫描显示电路学习VHDL语言设计较复杂的电路方法。
二、【设计任务】设计要求用VHDL语言设计一个状态机,要求具有以下状态和功能中的四种或者四种以上:A.复位功能B.8、10或者16进制加法计数C.8、10或者16进制减法计数D.数码管以任何方式闪动E.8个LED灯以任何方式闪动F.蜂鸣器发声或者播放一段音乐G.并用两位数码管将结果显示出来本次设计选用的功能状态为:A.复位功能B.十进制加法计数C.十进制减法计数D.数码管闪动E.8个led灯闪动F.并用两位数码管将结果显示出来功能实现说明Clk为50MHz的时钟信号输入;rst为复位控制按键(低电平有效);en(0-2)通过三个按键分别控制3种状态(低电平有效)。
1.当en(0)=`0`时,启动加法计数并将结果动态显示到两位数码管上,同时另外的两位数码管的6段以相反方向按顺序闪烁2.当en(1)=`0`时,启动减法计数并将结果动态显示到两位数码管上,同时另外的两位数码管的6段以相反方向按顺序闪烁,闪烁方向与加法的相反;3.当en(2)=`0`时,启动LED闪烁功能,LED灯按顺序逐个流水闪动;4.当rst=`0`时,复位清零;三、【设计代码】library IEEE;use IEEE.STD_LOGIC_1164.ALL;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;-----------------------------------------------------------------------------ENTITY cnt16 ISPORT (clk : IN std_logic; --50MHz时钟信号输入rst : IN std_logic; ---复位功能输入en : IN std_logic_vector(2 DOWNTO 0); ---状态选择输入led8 : OUT std_logic_vector(7 DOWNTO 0); --各段数据输出com8 : OUT std_logic_vector(7 DOWNTO 0)); ---各位数据输出END cnt16;-----------------------*****对各个信号进行定义****------------------------------------- ARCHITECTURE arch OF cnt16 ISsignal cnt : std_logic_vector(25 downto 0 );signal data : std_logic_vector(3 downto 0);signal led8_xhdl : std_logic_vector(7 downto 0);signal com8_xhdl : std_logic_vector(7 downto 0);signal coud1 : std_logic_vector(3 downto 0);signal coud2 : std_logic_vector(3 downto 0);signal s1 : std_logic;signal s2 : std_logic;signal s3 : std_logic;signal coud : std_logic_vector(3 downto 0);signal first : std_logic_vector(3 downto 0); --0000signal second : std_logic_vector(3 downto 0); --0000 0000 0000 1001 signal jinwei: std_logic;------------------------------------------------------------------------------------------------------------- beginled8<=led8_xhdl;com8<=com8_xhdl;----------------------- *****状态控制部分*************--------------------------------------------- process(en)beginif en="110"then ----状态控制,低电平有效s1<='1';s2<='0';s3<='0';else if en="101"thens2<='1';s1<='0';s3<='0';else if en="011"thens3<='1';s1<='0';s2<='0';end if;end if;end if;end process;-------------------------------------------------------------------------------------------------------------------------------**********时钟分频部分********----------------------------------process(clk,rst)beginif(rst='0')thencnt<="00000000000000000000000000";elsif(clk'event and clk='1')thencnt<=cnt+1; -----来一个时钟信号cnt加1end if;end process;----------------------------------------------------------------------------------------------------------------------*****-加减计数器的个位-*******------------------------------- process(cnt(24),rst,s1,s2)beginif(rst='0')thenfirst<="0000";jinwei<='0';elsif(cnt(24)'event and cnt(24)='1')then ---每隔(1/50)*48=0.96s计数一次if (s1='1')thenif(first="1001")then ---10进制计数first<="0000";jinwei<='1';elsejinwei<='0';first<=first+1; ---加法计数end if;else if(s2='1')thenif(first="0000")thenfirst<="1001";jinwei<='1';elsejinwei<='0';first<=first-1; ---减法计数end if;end if;end if;end if;end process;-------------------------------------------------------------------------------------------------------------------*********-加减计数器的十位*******-------------------------- process(jinwei,rst,s1,s2)beginif(rst='0')thensecond<="0000";elsif(jinwei'event and jinwei='1')then ---每来1个位产生的进位信号则十位加(减)1if (s1='1')thenif(second="1001")thensecond<="0000";elsesecond<=second+1;end if;else if(s2='1')thenif(second="0000")thensecond<="1001";elsesecond<=second-1;end if;end if;end if;end if;end process;------------------------------------------------------------------------------------------------------------------------------------------------*****闪动数码管的计数***--------------------------------------- process(cnt(23),rst,s1,s2)beginif(rst='0')thencoud<="0000";else if(cnt(23)'event and cnt(23)='1')then ----每隔(1/50)*46=0.92s计数一次if(s1='1')thenif(coud="0101")thencoud<="0000";elsecoud<=coud+1;end if;else if(s2='1')thenif(coud="0000")thencoud<="0101";elsecoud<=coud-1;end if;end if;end if;end if;end if;end process;--------------------------------------------------------------------------------------------------------------------------***码变换****---------------------------------------------process(coud,rst)begincase coud iswhen"0000" => coud1<="1010";coud2<="1010";when"0001" => coud1<="1011";coud2<="1111";when"0010" => coud1<="1100";coud2<="1110";when"0011" => coud1<="1101";coud2<="1101";when"0100" => coud1<="1110";coud2<="1100";when"0101" => coud1<="1111";coud2<="1011";when others => coud1<="0000";coud2<="0000";end case;end process;--------------------------------------------------------------------------------------------****************显示部分***************--process(rst,s1,s2,s3,cnt(17 downto 16),cnt(25 downto 23))beginif(rst='0')thencom8_xhdl<="11110000";led8_xhdl <= "00000000";else if s1='1'or s2='1'then ----计数以及数码管闪动部分的扫描case cnt(17 downto 16) iswhen"10" => com8_xhdl<="11111110";data<=first;when"01" => com8_xhdl<="11111101";data<=second;when"00" => com8_xhdl<="01111111";data<=coud1;when"11" => com8_xhdl<="10111111";data<=coud2;end case;case data isWHEN "0000" =>led8_xhdl <= "00111111"; --0WHEN "0001" =>led8_xhdl <= "00000110"; --1WHEN "0010" =>led8_xhdl <= "01011011"; --2WHEN "0011" =>led8_xhdl <= "01001111"; --3WHEN "0100" =>led8_xhdl <= "01100110"; --4WHEN "0101" =>led8_xhdl <= "01101101"; --5WHEN "0110" =>led8_xhdl <= "01111101"; --6WHEN "0111" =>led8_xhdl <= "00000111"; --7WHEN "1000" =>led8_xhdl <= "01111111"; --8WHEN "1001" =>led8_xhdl <= "01101111"; --9WHEN "1010" =>led8_xhdl <= "00000001";WHEN "1011" =>led8_xhdl <= "00000010";WHEN "1100" =>led8_xhdl <= "00000100";WHEN "1101" =>led8_xhdl <= "00001000";WHEN "1110" =>led8_xhdl <= "00010000";WHEN "1111" =>led8_xhdl <= "00100000";WHEN OTHERS =>led8_xhdl <= "00000011";END CASE;else if s3='1'then ----8个LED灯闪动的扫描,闪动周期为0.92s-1s case cnt(25 downto 23) iswhen"000" => com8_xhdl<="11111110";led8_xhdl<="10000000" ;when"001" => com8_xhdl<="11111101";led8_xhdl<="10000000" ;when"010" => com8_xhdl<="11111011";led8_xhdl<="10000000" ;when"011" => com8_xhdl<="11110111";led8_xhdl<="10000000" ;when"100" => com8_xhdl<="11101111";led8_xhdl<="10000000" ;when"101" => com8_xhdl<="11011111";led8_xhdl<="10000000" ;when"110" => com8_xhdl<="10111111";led8_xhdl<="10000000" ;when"111" => com8_xhdl<="01111111";led8_xhdl<="10000000" ;end case;end if;end if;end if;end process;end arch;。
《VHDL语言程序设计》课程教学大纲

《VHDL语言程序设计》课程教学大纲课程简介课程简介:本课程为软件工程专业嵌入式专业方向的专业课,是开发基于FPGA/CPLD嵌入式系统的必备基础。
主要内容包括FPGA/CPLD目标器件的结构和工作原理、EDA技术和工作流程、VHDL基础知识、VHDL实用方法和设计深入、原理图输入法、LPM宏功能模块实用方法、状态机设计以及EDA优化设计。
目的是为后续课程的学习和嵌入式系统的设计作必须的基础准备。
课程大纲一、课程的性质与任务:本课程是软件工程专业的专业方向课程。
教学任务主要包括使学生了解EDA技术的工作流程,正确使用开发平台,掌握以VHDL为代表的硬件描述语言的基本知识、编程实用方法和工程设计方法,掌握原理图设计法、状态机设计法,能够正确使用IP Core和LPM等宏功能模块。
本课程是软件工程专业嵌入式专业方向的第一门专业方向课,是后续课程的必备基础,具有较重要的地位。
二、课程的目的与基本要求:本课程涉及到的学科基础知识面广,要求软硬件兼备,需要较好的学科基础。
通过本课程的学习,最终达到能够设计基于FPGA/CPLD的ASIC,并能进行EDA优化的目的。
三、面向专业:软件工程四、先修课程:《计算系统基础》五、本课程与其它课程的联系:本课程的先行课程是计算系统基础。
服务的主要后续课程包括基于FPGA的嵌入式软件开发、基于ARM的嵌入式软件开发等。
六、教学内容安排、要求、学时分配及作业:第一章概述(2学时)1.1 EDA技术及其发展(C)1.2 硬件描述语言硬件描述语言种类、自顶向下设计方法、EDA工程设计流程。
(A)1.3 面向FPGA/CPLD的开发流程设计输入、分析综合、布局布线、仿真、下载和硬件测试。
(A)1.4 IP Core 及EDA技术发展趋势。
(C)第二章 FPGA硬件特性与编程技术(8学时)2.1 PLD发展历程及其分类(c)2.2 低密度PLD工作原理PROM、PLA、PAL、GAL。
《VHDL语言程序设计》课程教学大纲

GDOU-B-11-213《VHDL语言程序设计》课程教学大纲课程简介课程简介:本课程为软件工程专业嵌入式专业方向的专业课,是开发基于FPGA/CPLD嵌入式系统的必备基础。
主要内容包括FPGA/CPLD目标器件的结构和工作原理、EDA技术和工作流程、VHDL基础知识、VHDL实用方法和设计深入、原理图输入法、LPM宏功能模块实用方法、状态机设计以及EDA优化设计。
目的是为后续课程的学习和嵌入式系统的设计作必须的基础准备。
课程大纲一、课程的性质与任务:本课程是软件工程专业的专业方向课程。
教学任务主要包括使学生了解EDA技术的工作流程,正确使用开发平台,掌握以VHDL为代表的硬件描述语言的基本知识、编程实用方法和工程设计方法,掌握原理图设计法、状态机设计法,能够正确使用IP Core和LPM等宏功能模块。
本课程是软件工程专业嵌入式专业方向的第一门专业方向课,是后续课程的必备基础,具有较重要的地位。
二、课程的目的与基本要求:本课程涉及到的学科基础知识面广,要求软硬件兼备,需要较好的学科基础。
通过本课程的学习,最终达到能够设计基于FPGA/CPLD的ASIC,并能进行EDA优化的目的。
三、面向专业:软件工程四、先修课程:《计算系统基础》五、本课程与其它课程的联系:本课程的先行课程是计算系统基础。
服务的主要后续课程包括基于FPGA的嵌入式软件开发、基于ARM的嵌入式软件开发等。
六、教学内容安排、要求、学时分配及作业:第一章概述(2学时)1.1 EDA技术及其发展(C)1.2 硬件描述语言硬件描述语言种类、自顶向下设计方法、EDA工程设计流程。
(A)1.3 面向FPGA/CPLD的开发流程设计输入、分析综合、布局布线、仿真、下载和硬件测试。
(A)1.4 IP Core 及EDA技术发展趋势。
(C)第二章 FPGA硬件特性与编程技术(8学时)2.1 PLD发展历程及其分类(c)2.2 低密度PLD工作原理PROM、PLA、PAL、GAL。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
第十章 使用VHDL语言来设计状态机
思考和练习——填空题
1、所有的时序电路从理论上都可以表示为____。 2、数字系统一般可分为____和____,数据通道通常由组合逻辑电路
构成,而控制单元通常由时序逻辑电路构成。 3、输出信号只和当前状态有关的状态机称为____型状态机。 4、在状态机的设计中,需要对状态机的各个状态设定唯一对应的
己控制编码方式。
第十章 使用VHDL语言来设计状态机
10.1.4 状态机的非法状态
在状态机的正常运行中是不需要出现或者 未被定义的状态,被称为状态机的非法状 态。
对非法状态的处理就是状态机设计中的容 错技术,即状态机进入错误的状态之后的 处理。
第十章 使用VHDL语言来设计状态机
10.2 状态机的VHDL语言实现
第十章 使用VHDL语言来设计状态机
10.3.1 序列信号发生器
本应用是一个按照规定输出8位“0”、“1” 序列的信号发生器,其实质是一个8位的计 数器,计数器的每一位都可以输出位长为8 的“0”、“1”周期序列信号。
第十章 使用VHDL语言来设计状态机
10.3.2 循环彩灯控制器
循环彩灯控制器用于控制红绿黄三个LED 按照黄色LED亮1秒,红色LED亮2秒,绿色 LED亮3秒的方式循环点亮,其时钟频率为 1Hz
____。 5、状态机的每一个状态在实际电路中都是以一组____的当前状态组
合来表示的。 6、直接状态编码有顺序编码、____和一位有效的热码状态编码这三
种常用的编码方式。 7、在状态机的正常运行中是不需要出现或者未被定义的状态,通常
称为____。 8、状态机设计的关键是如何把一个实际的时序逻辑关系抽象成一个
c) 建立状态机进程,并在进程中定义状态的转移。
第十章 使用VHDL语言来设计状态机
10.1.3 状态机的状态编码
在状态机的设计中,需要对状态机的各个 状态设定唯一对应的数字编码,即状态机 的状态编码,其可以采用两种方式:
采用文字符号定义各状态变量,可以便于程序的阅读和理解。 直接用具体的二进制数组合来进行状态变量的定义,可以由设计者自
____。
第十章 使用VHDL语言来设计状态机
思考和练习——综述题
1、请简述使用VHDL语言设计有限状态机 的步骤。
2、请简述使用VHDL语言描述有限状态机 的编码原则。
3、在设计状态机的状态编码的时候,如果 采用直接状态编码,有哪三种常用的编码 方式?
第十章 使用VHDL语言来设计状态机
10.1.1 状态机的分类
有限状态机根据输出信号与当前状态以及输入信 号的关系来分,可以分为Moore型和Mealy型两种 。
Moore型状态机的输出信号仅为当前状态的函数, 与输入信号无关,属于同步时序电路。
Mealy型状态机的输出信号不仅与当前状态有关, 而且与输入信号有关,因此输入信号可以直接影 响输出信号,不依赖与时钟的同步,属于异步时 序电路。
状态机设计的关键是如何把一个实际的时 序逻辑关系抽象成一个时序逻辑函数 。
状态机的设计主要用到CASE_WHEN语句 和IF_THEN_ELSE语句,前者用来描述并 行的行为,后者用来实现优先级的设定。
第十章 使用VHDL语言来设计状态机
10.3 状态机的实际应用
10.3.1 序列信号发生器 10.3.2 循环彩灯控制器
第十章 使用VHDL语 言来设计状态机
第十章 使用VHDL语言来设计状态机
概论
状态机就是一组触发器的输出状态随着时 钟和输入信号按照一定的规律变化的一种 机制或过程,所有的时序电路从理论上都 可以表示为有限状态机(Finite State Machine,FSM),有限状态机是实现高可 靠逻辑控制的重要途径,是大型数字系统 设计中的重要组成部分,尤其是进行复杂 时序逻辑电路的实现。
第十章 使用VHDL语言来设计状态机
Moore型有限状态机
input
次态逻辑
next_state
clk reset
状态寄存器
current_state
输出逻辑
output
第十章 使用VHDL语言来设计状态机
Mealy型有限状态机
次态逻辑
next_state
clk reset
状态寄存器
current_state
输出逻辑计状态机
10.1.2 状态机的VHDL语言描述方法
有限状态机的一般设计步骤如下:
a) 根据系统功能描述,建立有限状态机状态转换图或状态 转换表。
b) 根据状态转换图采用VHDL语言定义可枚举的数据类型, 枚举值即状态机的各个状态,并利用可枚举的数据类型 定义状态变量。
第十章 使用VHDL语言来设计状态机
10.1 状态机基础 10.2 状态机的VHDL语言实现 10.3 状态机的实际应用
第十章 使用VHDL语言来设计状态机
10.1 状态机基础
10.1.1 状态机的分类 10.1.2 状态机的VHDL语言描述方法 10.1.3 状态机的状态编码 10.1.4 状态机的非法状态