状态机
如果状态机的输出信号不仅与电路当前状态有关,还与当前输入有关,则这种状态机称为米勒(Mealy)型状态机。
如果状态机的输出信号仅仅与电路当前状态有关,则称为摩尔(Moore)型状态机。
下图是一种相对通用的状态机原理图,主要由组合逻辑电路和时序逻辑电路两部分组成,
状态机的设计比较灵活多样,下面介绍两种相对常见的结构清晰,易于理解的状态机设计风格
设计风格1
该风格设计状态机时,将时序逻辑电路和组合逻辑电路进行分开设计,需要先定义一个枚举类型,包含状态机需要的所有状态。
首先时时序逻辑部分的设计
process (reset, clock)
begin
if(reset = '1') then
pr_state <= state0;
elsif (clock'event and clock = '1') then
pr_state <= nx_state;
end if;
end process;
这种设计风格的优点是时序电路的设计方法基本上是标准的。此外,这种风格占用的寄存器数量最少。这段代码综合得到的寄存器的数量等于对状态机所有状态进行编码所需要的位数。
状态机中时序逻辑电路的设计
process(input, pr_state)
begin
case pr_state is
when state0 =>
if(input=...)then
output <= <value>;
nx_state <= state1;
else...
end if;
when state1 =>
if(input=...)then
output <= <value>;
nx_state <= state2;
else...
end if;
when state2 =>
if(input=...)then
output <= <value>;
nx_state <= state3;
else...
end if;
...
end case;
end process;
整个代码中,由于没有任何信号的赋值是通过其他某个信号的跳变来触发的,所以不会生成寄存器
下面给出完整的模板
library ieee;
use ieee.std_logic_1164.all;
entity <entity_name> is
port(
input: in <data_type>;
reset, clock: in std_logic;
output: out <data_type>;
);
end <entity_name>;
architecutre <arc_name> of <entity_name> is
type state is (state0,state1,state2,state3...);
signal pr_state,nx_state: state;
begin
process(reset,clock)
begin
if(reset = '1') then
pr_state <= state0;
elsif (clock'even

本文介绍了状态机的基础知识,包括米勒型和摩尔型状态机的定义,以及两种常用的设计风格。在VHDL中,设计风格1将时序和组合逻辑分开,而风格2则引入内部信号以确保输出在时钟边沿更新。此外,文章还讨论了状态编码的不同方式,如二进制、双热和独热码,并提供了实际的计数器和序列检测器电路的VHDL实现示例。
最低0.47元/天 解锁文章
 状态机&spm=1001.2101.3001.5002&articleId=131294311&d=1&t=3&u=7c2bf08719724fe7bfc939e74f9974ad)
2087

被折叠的 条评论
为什么被折叠?



