第2节 VHDL状态机设计(2)
第2节 VHDL状态机设计(2)
One hot 编码
- 当我们在强调状态机速度时,可以使用one hot编码,
--由于状态向量中的状态位直接表示机器状态,所以状态译码很简单,不需要额外的逻辑,它的速度独立于状态数量,而仅与转移到特定状态的转移数量有关;
--占用较多触发器资源(适合FPGA);
- 与之相比,压缩状态编码在状态增加时速度会明显下降;当然带来的负面影响是控制逻辑的面积会有增大。
两进程描述
- 有的设计者采用两个进程来描述状态机,
--它就是将输出逻辑进程和状态转移逻辑合并起来,采用一个组合逻辑进程来描述。
- 通常状况下,综合工具都可较好的识别出这两部分逻辑并进行优化,
--但我们建议如果不是输出逻辑非常简单,还是采用两个不同的进程来描述,这样综合工具可以明确下状态转移逻辑,优化效果较好。
另外一种两进程描述
- 将下状态转移逻辑和当前状态寄存器描述结合,省略中间变量:
next_state:
process(rst,clk)
begin
if rst=‘1’ then
current_state<=…;
elsif clk’event and clk=‘1’ then
if cond=x then
current_state<=…;
elsif …….
Current_state<=….;
……
End process
单进程描述
- 有的设计者采用一个进程来描述状态机, 它就是将状态机的三个逻辑单元合并起来,采用一个进程来描述。
- 适用于简单的设计;
- 对于复杂的状态机,可读性差,易出错,不利于EDA软件的优化。
Moore型的例子

实体和结构体中的变量定义
- --Moore machine
entity MOORE is
port( RST: in std_logic;
CLOCK: in std_logic;
X: in std_logic;
Z: out std_logic);
end MOORE;
architecture BEHAVIOR of MOORE is
type STATE_TYPE is (S0,S1,S2,S3);
signal CURRENT_STATE, NEXT_STATE : STATE_TYPE;
begin
状态寄存器描述
- 描述状态寄存器的进程
SYNCH : process
begin
wait until CLOCK’event and CLOCK = ‘1’;
if rst=‘1’ then
CURRENT_STATE<=S1;
else
CURRENT_STATE <= NEXT_STATE;
end if;
end process;
- 下状态转移逻辑进程
STATE_TRANS : process (CURRENT_STATE, X)
begin
NEXT_STATE<=CURRENT_STATE; --default assignment
case CURRENT_STATE is
when S0 =>
if X = ‘0’ then
NEXT_STATE <= S0;
else
NEXT_STATE <= S2;
end if;
when S1 =>
if X = ‘0’ then
NEXT_STATE <= S0;
else
NEXT_STATE ,+ S2;
end if;
when S2 =>
if X = ‘0’ then
NEXT_STATE <= S2;
else
NEXT_STATE <= S3;
end if;
when S3 =>
if X = ‘0’ then
NEXT_STATE <= S3;
else
NEXT_STATE <=S1;
end if;
end case;
end process;
- 输出逻辑
OUTPUT_GEN: process (CURRENT_STATE, X)
begin
Z<=’0’;--default assignment
case CURRENT_STATE is
when S0 =>
Z <= ‘0’;
when S1 =>
Z <= ‘1’;
when S2 =>
Z <= ‘1’;
when S3 =>
Z <= ‘0’;
end case;
end process;
end BEHAVIOR
使用状态机注意的地方
- 在使用状态机时,尽量不要再使用其他控制信号来区分某个状态下要做的操作,也就是说:尽量使用状态机的输出信号直接控制数据通路,而不要使用输出信号再和其它信号运算后去控制数据通路。
- 这样做使得控制相对明了,提高了程序的可读性,降低了调试的难度。相当于将其它控制逻辑也参与了状态机编码。
- 大的状态机有较多输入和反馈;
- 绝大多数FPGA基于4输入查找表;
- 为了实现高速状态机:
- One Hot编码,
- 每状态输入不超过 4 个.
- 复杂状态机的分割:
Xilinx的状态机设计工具-StateCAD

- 用HDL简洁、完备、安全的描述状态机需要一定的功底和经验;
- Xilinx的状态机设计工具-StateCAD
--使状态机的设计、优化、测试变得简单快捷;
--符合人们设计状态机的习惯;
-表达状态机最自然的方式就是状态转移图,在StateCAD中只要画出状态转移图即可;
-StateCAD自动转换为HDL语言并根据用户的设置进行优化,转换出来的代码规范、可读性好、可综合;
-StateCAD自动检测状态机的完备性和正确性;
-StateCAD自动生成测试激励

- 状态机向导:
--根据用户所选的状态机转移图类型(列状、双列状、行状、网状)、复位模式(同步、异步)、状态数目等条件生成一个基本的状态转移图模板;
--减轻绘制状态转移图的工作量。
- 逻辑向导:
--对逻辑功能进行辅助设计,支持计数器、多路选择器、移位寄存器、加法器、乘法器等常用功能结构。
- 优化向导:
--对状态机进行优化,使整个设计在速度、面积等方面达到优化结果。
- 代码生成:
--首先对设计进行检查;
--如果没有任何错误,则生成HDL代码,并打开代码窗口显示HDL代码。
- 测试激励生成:
--生成状态机的测试激励,并进行功能仿真或时序仿真,还可以对测试激励的覆盖率进行总结。
<<上一节 下一节>>