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。
VHDL状态机
current_state next_state
PROCESS COM
comb_outputs
图5-1 一般状态机结构框图
第14页/共80页
• 主控时序进程是负责有限状态机状态转化的进程。有限状态机是随外部时 钟信号以同步时序方式工作的。主控时序进程就是保证状态的跳变与时钟 信号同步,即保证在时钟发生有效跳变时,有限状态机的状态才发生变化。 一般地,主控时序进程负责系统的初始和复位的状态设置,不负责下一状 态的具体状态取值。当复位信号到来时,主控时序进程将同步或异步复位 状态;当时钟的有效跳变到来时,时序进程只是机械地将代表次态的信号 next_st中的内容送入到现态的信号cur_st中,而信号next_st中的内容完 全由其他的进程根据实际情况来决定。主控时序进程的设计比较固定、单 一和简单。
第20页/共80页
【例5-1】
LIBRARY IEEE;
USE IEEE.STD_LOGIC_1164.ALL;
ENTITY s_machine IS
PORT ( clk,reset : IN STD_LOGIC;
state_inputs : IN STD_LOGIC_VECTOR (0 TO 1);
TYPE BOOLEAN IS (FALSE,TRUE) ;
第7页/共80页
5.1 状态机设计相关语句
5.1.1 类型定义语句
TYPE my_logic IS ( '1' ,'Z' ,'U' ,'0' ) ; SIGNAL s1 : my_logic ; s1 <= 'Z' ;
SUBTYPE 子类型名 IS 基本数据类型 RANGE 约束范围; SUBTYPE digits IS INTEGER RANGE 0 to 9 ;
VHDL语言中状态机的应用
[知识拓展]VHDL语言中的状态机应用在数字系统设计时,通常将一个较大较复杂的系统划分成数个相对独立的较小较简单模块实现,最简单最基本的模块设计可使用本书项目P1和P3中介绍的组合逻辑电路和时序逻辑电路的设计方法,但这种设计方法仅适用于非常简单的模块设计,当设计比较复杂时,这种设计方法就显得过于复杂而失去了实际功效。
实际设计中,比较复杂的时序逻辑电路的设计可用有限状态机(finited state machine)来实现。
有限状态机没有固定的形式,实现的方式非常接近人们的逻辑思维,通常用于描述数字系统工作的一个完整过程,它具有以下特征:●状态变量定义有限个状态,这些状态概括了系统的工作的完整过程;●具有时钟;●能够进行状态转移控制;在具有外部输入控制信号时,状态的转移由当前状态、时钟与外部输入控制信号共同控制,称为米勒(mealy)型状态机;在没有外部输入控制信号时,状态的转移只受当前状态和时钟的控制,称为摩尔型(moore)状态机;●在不同的状态下对输出信号进行不同的控制;●在系统复位时,指定系统的初始状态并指定在初始状态时系统的各个输出信号的值;在使用VHDL语言实现状态机时,通常先用枚举变量定义系统工作时可能出现的有限个状态,然后在1个或数个进程中用if语句和case语句实现状态的转移控制和输出信号的控制,下面以十字路口的交通灯控制为例,具体说明有限状态机的使用。
在某个十字路口,共有东、西、南、北4个方向的交通信号灯。
其中东西向的信号灯动作完全一致、可由同一个控制器控制,南北向的信号灯动作完全一致,可由另一个控制器控制,即只要东西、南北2组控制信号即可;在每一个路口有左转、直行、右转三组信号灯,每组信号灯均由红、黄、绿3个灯组成,此外还有一个最大99秒的秒计时器。
表4.11包含了交通灯系统所有的工作状态及各个状态下信号灯和秒计时器的状态。
交通灯的工作状态共有10种,按照时间顺序分别为东西向直行(east_a)、东西向直行加右转(east_a_r)、东西向直行变信号(east_a_change)、东西向左转(east_l)、东西向左转变信号(east_l_change)、南北向直行(south_a)、南北向直行加右转(south_a_r)、南北向直行变信号(south_a_change)、南北向左转(south_l)、南北向左转变信号(south_l_change),之后又进入东西向直行状态,在这10状态内反复循环。
EDA教程之VHDL状态机
普通摩尔型状态机的VHDL描述:
5.2.1 多进程状态机设计
例 5-2
5.2.2 单进程Moore状态机
由于以上状态机的输出信号是由组合电路发出 的,所以在一些特定情况下难免出现毛刺现象。
如果这些输出信号用作时钟信号,极易产生错误 的操作,需尽力避免。单进程Moore状态机较容 易构成能避免出现毛刺现象的状态机。
if clr='1' then current_state<=s0; elsif clk'event and clk='1' then current_state<=next_state; end if; end process;
com:process(current_state,din) begin
process(clk,clr) begin if clr='1' then reg<="00000000"; elsif clk'event and clk='1' then reg(0)<=din; reg(7 downto 1)<=reg(6 downto 0); end if; if reg=d then AB<="1010"; else AB<="1011"; end if; end process; end behav;
1
0
0
1
0
0
1
普通Mealy型状态机的VHDL描述:
[例5-5]
当前状态
st0 st1 st2 st3 st4
例5-5的仿真波形
下一状态(datain=x)
X=0
VHDL状态机
一.设计功能与要求:要求设计一个序列检测器,检测序列为1110010。
序列检测器用于检测一组或由二进制码组成的脉冲序列信号,在数字通信中有着广泛的应用。
当序列检测器连续收到一组串行二进制码后,如果这组码与检测器中预先设置的码相同,则输出1,否则输出0。
由于这种检测的关键在于正确码的收到必须是连续的,这就要求检测器必须记住前一次的正确码及正确序列,直到在连续的监测中所收到的每一位码都与预置的对应码相同。
在监测过程中,任何一位不相等都将回到初始状态重新开始监测。
二、设计思路在状态连续变化的数字系统设计中,采用状态机的设计思想有利于提高设计效率,增加程序的可读性,减少错误的发生几率。
同时,状态机的设计方法也是数字系统中一种常用的设计方法,其输出仅仅是当前状态值的函数,并且在时钟上升沿到来时才发生变化。
本实验要从一串二进制码中检测出一个已预置的7位二进制码(1110010),每增加一位二进制相当于增加一个状态,用7个状态可以实现。
一、原理图说明如上图中所示,S1——S8这八个状态之间按照一定的规则进行转换,下一个状态是S1——S8之中的哪个状态,由当前状态和输入条件(0或1)决定。
三、程序代码--Sequence Detector--Check the sequence 1110010library ieee;use ieee.std_logic_1164.all;use IEEE.STD_LOGIC_ARITH.ALL;use IEEE.STD_LOGIC_UNSIGNED.ALL;entity check_state1 isport(clk,clr:in std_logic;din:in std_logic;z:out std_logic);end entity;architecture behavior of check_state1 istype state_type is (s1,s2,s3,s4,s5,s6,s7,s8);signal state:state_type:=s1;beginprocess(clk,clr,state,din)beginif clr='1' thenz<='0';state<=s1;elsif clk'event and clk='1' thencase state iswhen s1 => z<='0';if din='1' thenstate<=s2;end if;when s2 => z<='0';if din='1' thenstate<=s3;elsestate<=s1;end if;when s3 => z<='0';if din='1' thenstate<=s4;elsestate<=s1;end if;when s4 => z<='0';if din='0' thenstate<=s5;elsestate<=s4;end if;when s5 => z<='0';if din='0' thenstate<=s6;elsestate<=s2;end if;when s6 => z<='0';if din='1' thenstate<=s7;elsestate<=s1;end if;when s7 => z<='0';if din='0' thenstate<=s8;elsestate<=s3;end if;when s8 => z<='1';if din='0' thenstate<=s1;elsestate<=s2;end if;end case;end if;end process;end;三、执行结果生成状态图仿真结果当输入的连续7位二进制数据的序列位1110010的时候输出Z=1,其他状态时输出是0。
第二部分 状态机VHDL设计
TYPE FSM_ST IS (s0, s1, s2, s3); SIGNAL current_state, next_state: FSM_ST; BEGIN REG: PROCESS (reset,clk)
PROCESS REG
FSM: s_machine
current_state next_state
PROCESS COM
comb_outputs
主控组合进程的任务是根据外部输入的控制信号(包括来自状态机外部的信号和来自状态机内部
其它非主控的组合或时序进程的信号),或(和)当前状态的状态值确定下一状态(next_state) 的取向,即next_state的取值内容,以及确定对外输出或对内部其它组合或时序进程输出控制信号 的内容。
组合逻 辑
输入
状态 译码器
输
出
输出
译
状态 状态
码
寄存器
器
反馈
3
VHDL综合器易于优化 易构成性能良好的时序逻辑模块 结构模式简单、层次分明、易读易懂、易排错 利用同步时序和全局时钟线可实现高速FSM 运行模式类似于CPU,易于进行顺序控制 高可靠性,非法状态易控制
4
1 状态机设计相关语句
PORT(CP :IN STD_LOGIC; --CP时钟信号 DIN:IN STD_LOGIC; OP :OUT STD_LOGIC);
END CH6_5_1;
19
ARCHITECTURE A OF CH6_5_1 IS
TYPE STATE IS (S0,S1,S2,S3);
--State Type Declare
verilog状态机
基于Verilog应用2007-09-18 16:25:19 来源:电子技术应用关键字:可编程逻辑器件Verilog HDL FIFO FSM随着数字时代的到来,数字技术的应用已经渗透到了人类生活的各个方面。
数字系统的发展在很大程度上得益于器件和集成技术的发展,著名的摩尔定律(Moore's Law)的预言也在集成电路的发展过程中被印证了,数字系统的设计理念和设计方法在这过程中发生了深刻的变化。
从电子CAD、电子CAE到电子设计自动化(EDA),随着设计复杂程度的不断增加,设计的自动化程度越来越高。
目前,EDA技术作为电子设计的通用平台,逐渐向支持系统级的设计发展;数字系统的设计也从图形设计方案向硬件描述语言设计方案发展。
可编程器件在数字系统设计领域得到广泛应用,不仅缩短了系统开发周期,而且利用器件的现场可编程特性,可根据应用的要求对器件进行动态配置或编程,简单易行地完成功能的添加和修改。
在现代工业的发展中,实时测控系统得到广泛应用,这就对高速数字信号处理系统提出了更高的要求。
因为要涉及大量的设计,为了提高运算速度,应用了大量DSP器件。
数字采集系统是整个系统的核心部分之一,传统方法是应用MCU或DSP通过软件控制数据采集的模/数转换,这样必将频繁中断系统的运行从而减弱系统的数据运算,数据采集的速度也将受到限制。
因此,DSP+CPLD的方案被认为是数字信号处理系统的最优方案之一,由硬件控制模/数转换和数据存储,从而最大限度地提高系统的信号采集和处理能力。
1 系统总体方案数据采集系统是基于DSP的信号处理系统中的一部分。
框图如图1所示。
该数字信号处理系统用于随机共振理论在弱信号检测中的应用研究中。
整个系统由信号放大、信号滤波、信号采样、高速数字信号处理、与主计算机的高速数据传输接口等部分组成。
其中,信号放大是对输入信号进行调理以满足采样的要求;信号滤波是防止信号产生“混叠现象”;信号采样是完成模拟信号的数字化;高速数字信号处理是在建立随机共振模型的基础上完成各种算法;与主计算机的高速数据传输接口是满足信号检测的实时性,将DSP处理的数据传给计算机以进行进一步的处理。
基于VHDL语言的状态机设计
摘要 :V DL语言 是一 种硬 件描 述 语言 ,用 于描 述硬件 的行 为和 结构 。与软 件 编程语 言被 翻译 成机 器 指令 不 同 ,V DL语 言是被 H H 翻译 成 数 字 电路 结 构 ,最终在 可 编程 器件 或 专用 集成 电路 A I 中 以电路 结构 的形 式 实现程 序所 描 述的功 能 。在设 计 中 ,状 态机是 最 SC
es lek: =k : +1
n e di i f
e ndi: f e r c s ndp o e s;
( ) 型循 环控 制模 块 : 型循 环控 制模 块是 系统 的核心 部 2花 花 分 ,它 主控 着 8 彩灯 的花 型 。循 环彩 灯控 制模块 主 要 由状态 机 路 设 计 ,用状态 机 设计 灵活 性强 。 按 设计 的要 求实现 8种花 型 : 0 0 1 1 1 0 0 0 、 1 0 0 1 00 11 、00 00 0 10 1 、
数 字 电路 分为 组合 逻辑 电路 和 时序 逻辑 电路 。组 合 逻辑 电路 的输 出只与 当前 输 入有 关 ,时序 逻辑 电路 的输 出不仅 与 当前 输入 有关 ,还与 过 去 的输入 有关 。状 态机 是 一种 广义 的时序 电路 ,它 的输 出不仅 与 当前输 入 信号有 关 ,还 与 当前 的状态 有 关 。 状 态机 有 三个 基本 要素 :状 态 、输 入 、输 出 状 态 是状 态机 中最 根本 的要素 。状 态机 的最 基 本特 点就 是 寄 存 器 中存储 的状态 按照 一 定 的条 件 或规 律进 行 转移 , 并输 出特 定 信号。 输 入信 号 作为 状态 机状 态转 移 的条 件 , 即状 态机 根 据输 入信 号和 当前状 态 决定 下一 个转 移 的状态 。 输 出信 号 一般 由当前状 态和 当前输 入信 号 决定 ,也 可只 由当 前状 态 决定 。 二、状 态机 的特点 ( )状态 机 的结 构模 式相 对简 单 ,设计 方 案相对 固定 。 1 ( )状 态机 的 V L设 计层 次分 明,结构 清晰 ,易读 易懂 。 2 HD () 3 就运 行速 度 而言 ,状态 机 的每一 个状 态 中可 以完成 许 多 并 行 的运算 和控 制 操作 。 ( )就可 靠性 而 言 ,状 态 机也 具有 明显 的优 势 。 4 三 、状 态机 的 分类 状 态机 可 分为 有 限状态 机和 无 限状 态机 ,在 这 里只 讨论 有 限 状态 机 。按 照输 出信号 是否 与输 入信 号 有关 ,可将有 限状态 机分 为 Mor 型和 Mel 型 。Mor 型状 态机 的输 出只与 当前 状态 有 oe ay oe 关 ,Mel 型状 态机 的输 出 不仅 与当 前状 态有 关 ,还 与当 前输 入 a y 有 关 。 oe型和 Me l Mo r a y型状 态机 示 意 图分别 如 图一和 图二 所示 。
实验四 状态机的VHDL设计
实验四状态机的VHDL设计一、实验目的与要求目的:1、熟悉VHDL语言的编程方法2、学会利用VHDL语言设计实现时序逻辑功能器件的逻辑功能。
要求:(1)调试程序要记录调试过程中出现的问题及解决办法;(2)给出每个问题的算法或画出流程图;(3)编写程序要规范、正确,上机调试过程和结果要有记录,并注意调试程序集成环境的掌握及应用,不断积累编程及调试经验;(4)做完实验后给出本实验的实验报告。
二、实验设备、环境PII以上计算机,装有QuartusII软件三、实验步骤、内容、数据处理及分析(一)教师回顾所需知识。
1、回顾有限状态机的特点及功能有限状态机(简称状态机)是相当于一个控制器,它将一项功能的完成分解为为若干步骤,每一步骤对应于二进制的一个状态,通过预先设计的顺序在各状态之间进行转换,状态转换的过程就是实现逻辑功能的过程。
状态机的输出信号逻辑值必然与当前状态有关,但不一定与输入变量有关,因此根据状态机的输出变量是否与输入变量有关,可将状态机分为莫尔型(Moore)状态机与米里型(Mealy)状态机两种。
1、Moore型状态机莫尔型(Moore)状态机的输出逻辑仅与当前状态有关,与输入变量无关,输入变量的作用只是与当前状态一起决定当前状态的下一状态是什么。
莫尔型(Moore)状态机框图如图2-33所示。
2、Mealy型状态机设计米里型(Mealy)状态机的输出逻辑不仅与当前状态有关,还与当前的输入变量有关,输入变量的作用不仅是与当前状态一起决定当前状态的下一状态是什么,还决定当前状态的输出变量的逻辑值。
(二)编写程序1、可供选择进行设计的时序逻辑电路如下,要求规定课时内完成设计。
设计对象选择:Moore型状态机、Mealy型状态机(1) Mealy型状态机LIbrary ieee;use ieee.std_logic_1164.all;entity sm isport( clk,reset :in std_logic;sin:in std_logic_vector ( 0 to 1);cout:out std_logic_vector ( 0 to 1));end sm;architecture a of sm istype states is (st0,st1,st2,st3);signal cs,ns: states;beginreg: process(reset,clk)beginif reset='1' thencs<=st0;elsif clk='1' and clk'event thencs <= ns;end if;end process;com: process(cs,sin)begincase cs iswhen st0 => cout <="00";if sin="00" thenns<=st0;elsens<=st1;end if;when st1=> cout<="01";if sin="00" thenns<=st1;elsens<=st2;end if;when st2=> cout<="10";if sin="11" thenns<=st2;elsens<=st3;end if;when st3=> cout<="11";if sin="11" thenns<=st3;elsens<=st0;end if;end case;end process;end a;(三)对所编写的VHDL程序进行软件仿真,直到仿真结果满足功能要求。
- 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 状态机的非法状态