VHDL 有限状态机
VHDL Finite State Machine
如何在不让编译器知道它是有限状态机的情况下实现设计有限状态机的 VHDL 代码。
在给出的代码中,您将看到我们如何在 class 中实现 FSM,但它在 RTL 查看器中显示了状态图,我怎么能不让编译器知道它是 FSM 而不绘制状态图。
而且,我的教授说,如果编译器不识别FSM,设计会更快。
library IEEE;
use IEEE.std_logic_1164.all;
entity fsm is
port ( clk, reset, x1 : IN std_logic;
outp : OUT std_logic);
end entity;
architecture beh1 of fsm is
type state_type is (s1,s2,s3,s4);
signal state, next_state: state_type ;
begin
process1: process (clk,reset)
begin
if (reset ='1') then
state <=s1;
elsif (clk='1' and clk'Event) then
state <= next_state;
end if;
end process process1;
process2 : process (state, x1)
begin
case state is
when s1 => if x1='1' then
next_state <= s2;
else
next_state <= s3;
end if;
when s2 => next_state <= s4;
when s3 => next_state <= s4;
when s4 => next_state <= s1;
end case;
end process process2;
process3 : process (state)
begin
case state is
when s1 => outp <= '1';
when s2 => outp <= '1';
when s3 => outp <= '0';
when s4 => outp <= '0';
end case;
end process process3;
end beh1;
如果禁用状态机提取,则综合设计不一定更快或更小,因为综合编译器在综合状态机时可以从多种编码中进行选择。您可以通过菜单 "Assignments" -> "Settings" -> "Analysis & Synthesis Settings" -> "More Settings" -> "Extract VHDL State Machines".
关闭状态机提取
让我们从启用提取的默认设置开始。
例如,如果我们使用 Cyclone IV FPGA,综合编译器将为状态机选择一种一次性编码。您将在 "Analysis & Synthesis" -> "State Machines" 下的编译报告中看到它。需要 4 个组合功能 (LUT) 和 3 个逻辑寄存器。可以从通过菜单 "Tools" -> "Netlist Viewers" -> "Technology Map Viewer (Post-Mapping)":
访问的综合网表中推导出设计速度的初步估计
(可点击)
正如我们所见,最多有:
- 任意两个寄存器之间的1级逻辑
- 输入和寄存器之间的 1 级逻辑
- 输出和寄存器之间的 1 级逻辑
所以速度还是挺快的,最后的时间只取决于路由延迟。
如果我们禁用 FSM 提取,则只需要 2 个 LUT 和 2 个寄存器,因为 state
现在是二进制编码。网表将如下所示:
(可点击)
有一个小改进:输出现在可以直接由寄存器驱动state[1]
。因此,您的设计现在可能具有更短的时钟到输出时间。
关闭状态机提取后,这里可以进行改进。但是,通常情况并非如此,因为这完全取决于类型 state_type
的实际编码。如果我们禁用 FSM 提取并将 state_type
的声明更改为:
type state_type is (s3,s1,s2,s4);
那么综合结果又更差了:需要3个LUT和2个寄存器,一个寄存器和输出之间需要1级逻辑。
如何在不让编译器知道它是有限状态机的情况下实现设计有限状态机的 VHDL 代码。 在给出的代码中,您将看到我们如何在 class 中实现 FSM,但它在 RTL 查看器中显示了状态图,我怎么能不让编译器知道它是 FSM 而不绘制状态图。 而且,我的教授说,如果编译器不识别FSM,设计会更快。
library IEEE;
use IEEE.std_logic_1164.all;
entity fsm is
port ( clk, reset, x1 : IN std_logic;
outp : OUT std_logic);
end entity;
architecture beh1 of fsm is
type state_type is (s1,s2,s3,s4);
signal state, next_state: state_type ;
begin
process1: process (clk,reset)
begin
if (reset ='1') then
state <=s1;
elsif (clk='1' and clk'Event) then
state <= next_state;
end if;
end process process1;
process2 : process (state, x1)
begin
case state is
when s1 => if x1='1' then
next_state <= s2;
else
next_state <= s3;
end if;
when s2 => next_state <= s4;
when s3 => next_state <= s4;
when s4 => next_state <= s1;
end case;
end process process2;
process3 : process (state)
begin
case state is
when s1 => outp <= '1';
when s2 => outp <= '1';
when s3 => outp <= '0';
when s4 => outp <= '0';
end case;
end process process3;
end beh1;
如果禁用状态机提取,则综合设计不一定更快或更小,因为综合编译器在综合状态机时可以从多种编码中进行选择。您可以通过菜单 "Assignments" -> "Settings" -> "Analysis & Synthesis Settings" -> "More Settings" -> "Extract VHDL State Machines".
关闭状态机提取让我们从启用提取的默认设置开始。 例如,如果我们使用 Cyclone IV FPGA,综合编译器将为状态机选择一种一次性编码。您将在 "Analysis & Synthesis" -> "State Machines" 下的编译报告中看到它。需要 4 个组合功能 (LUT) 和 3 个逻辑寄存器。可以从通过菜单 "Tools" -> "Netlist Viewers" -> "Technology Map Viewer (Post-Mapping)":
访问的综合网表中推导出设计速度的初步估计正如我们所见,最多有:
- 任意两个寄存器之间的1级逻辑
- 输入和寄存器之间的 1 级逻辑
- 输出和寄存器之间的 1 级逻辑
所以速度还是挺快的,最后的时间只取决于路由延迟。
如果我们禁用 FSM 提取,则只需要 2 个 LUT 和 2 个寄存器,因为 state
现在是二进制编码。网表将如下所示:
有一个小改进:输出现在可以直接由寄存器驱动state[1]
。因此,您的设计现在可能具有更短的时钟到输出时间。
关闭状态机提取后,这里可以进行改进。但是,通常情况并非如此,因为这完全取决于类型 state_type
的实际编码。如果我们禁用 FSM 提取并将 state_type
的声明更改为:
type state_type is (s3,s1,s2,s4);
那么综合结果又更差了:需要3个LUT和2个寄存器,一个寄存器和输出之间需要1级逻辑。