专业编程基础技术教程

网站首页 > 基础教程 正文

VHDL状态机表述的三种方法 moore状态机vhdl代码

ccvgpt 2024-10-31 12:44:04 基础教程 10 ℃

引言

使用VHDL逻辑语言描述硬件电路实体,通常采用状态机描述电路的工作时序和状态变换。VHDL语言中描述状态转移的语言为if elsif ... end if 语句或 case X is ..... end case 语句。

状态机的关键点

输入条件、状态判断、输出结果

VHDL状态机表述的三种方法 moore状态机vhdl代码



状态机分类

无限状态机(Infinite State Machine,ISM)和有限状态机(Finite State Machine,FSM)。顾名思义,无限状态机就是状态数无限;有限状态机就是状态数有限。逻辑状态的设计一般是有限状态的。状态机也根据信号输出方式来进行划分,比如输出仅和当前状态有关的为同步输出状态及(Moor 型),其输入的变换需要等待时钟信号的到来。Mealy型属于异步输出状态机,其输出是当前状态和所有输入信号的函数,其输出是在输入之后立即发生的。通常使用的状态机描述方法是Moor 有限状态机。

Moor有限状态机

通常Moor有限状态机的描述方法有三种:1. 一段式状态机描述方法(条件判断、状态转移、输出同时完成);2. 二段式状态机描述方法(条件判断、状态转移为一段;输出为另外一段);3. 三段式状态机描述方法(状态存储一段-时序逻辑;状态转移一段-时序逻辑;结果输出-组合逻辑)。

三种描述方法各有优劣,一段式状态机描述符合广大逻辑工程师常规思维,语言简洁,但是时序逻辑和组合逻辑混合在一起,不容易维护,不容易优化时序。二段式描述介于一段和三段之间,时序逻辑和组合逻辑分开,语言描述更清晰,容易维护。三段式描述符合状态底层实现方式,编译器更容易识别和综合。

三种描述方法的模板


通常状态机描述定义状态常量,在VHDL语言描述状态常量通常常用枚举类型,eg

type states is (zero,one,two,three,four,five,six,seven,eight,nine,ten); 或

constant zero:std_logic_vector(3 downto 0):=x"0";

.......

constant ten :std_logic_vector(3 downto 0):=x"a";

在verilog 语言描述状态常量可以定义参数,eg

//状态声明和状态编码

reg [3:0] state;

parameter [3:0] S0=4'b0000;

parameter [3:0] S1=4'b0001;

parameter [3:0] S2=2'b0010;

parameter [3:0] S3=2'b0011;


VHDL 语言状态机描述模板



在使用VHDL描述状态机时,通常从状态机的三个基本模块入手,可以分为一段式、二段式和三段式FSM描述方法,有的地方也称为单进程、两进程和三进程FMS描述方法。

一段式状态机描述

状态机的三个模块合并起来,写到一个进程里面,在该进程中描述状态转移,又描述状态的输入和输出。




二段式状态机描述

用2个进程来描述状态机,其中当前状态寄存器用一个同步时序进程来描述,用另外一个组合逻辑进程来描述输出逻辑和次状态合并起来。

  • 状态转移


  • 判断输出


三段式状态机描述

状态机的三个模块分别用三个进程来描述,一个同步时序进程描述状态寄存器,一个组合逻辑进程描述次状态状态逻辑,最后输出逻辑单独用一个进程来描述。

典型三状态机描述程序框架如下:

定义两个状态:当前状态和下一状态

type states is (zero, one, two, three,four,five,six,seven,eight,nine,ten);

signal current_state , next_state: states

进程一: 同步时序进程描述状态寄存器

process(rst_n,clk)

begin

if ( rst_n='0') then

current_state<=zero;

elsif clk'event and clk='1' then

current_state<=next_state;

end if;

end process;

该进程表达语句简单,对当前状态变量进行初始化,然后时钟沿获取下一状态值。

进程二:描述次状态逻辑的进程

process(current_state, 其他输入信号)

begin

next_state<=current_state;

case current_state is

when state1=>

-----

next_state<=某个状态;

------

when state2=>

------

end case;

end process;


进程2根据输入信号进行条件判断,然后对当前状态进行改变。

进程三:描述输出逻辑的进程

process(current_state, 其他输入信号)

begin

output<=默认值;

case current_state is

when state1=>

-----

output<=xxx;

------

when state2=>

------

output<=xxx;

------

end case;

end process;

三种状态机描述方法通常推荐采用二段式或三段式,不建议采用一段式描述。一段式描述代码风格——编码自由程度高,规范性差,代码的可靠性和可维护程度低,不利于时序约束和综合的布局布线。两段式描述代码相对一段和三段式而言,代码简洁程度高,代码可靠性较高。总的说来,三段式代码的可靠性最高的。优先推荐采用三段式描述状态机,然后二段式,不推荐采用一段式描述。

最近发表
标签列表