VHDL有限状态机

时间:2016-04-24 10:27:02

标签: architecture vhdl fsm quartus

如何在不让编译器知道它是有限状态机的情况下实现设计有限状态机的VHDL代码。 在给出的代码中,您将看到我们如何在类中实现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; 

1 个答案:

答案 0 :(得分:1)

如果禁用状态机提取,则合成设计不会更快或更小,因为合成编译器可以在合成状态机时从多个编码中进行选择。您可以通过菜单&#34; Assignments&#34;关闭状态机提取。 - &GT; &#34;设置&#34; - &GT; &#34;分析&amp;合成设置&#34; - &GT; &#34;更多设置&#34; - &GT; &#34;提取VHDL状态机&#34;。

让我们从提取开启的默认设置开始。 例如,如果我们使用Cyclone IV FPGA,则综合编译器将为状态机选择单热编码。您将在编辑报告中的&#34; Analysis&amp;合成&#34; - &GT; &#34;国家机器&#34;。需要4个组合功能(LUT)和3个逻辑寄存器。设计速度的初步估计可以从通过菜单&#34;工具&#34;可访问的综合网表中推断出来。 - &GT; &#34;网表浏览者&#34; - &GT; &#34;技术地图查看器(后映射)&#34;:

Netlist with FSM extraction (点击)

如我们所见,最多有:

  • 任意两个寄存器之间的1级逻辑
  • 输入和寄存器之间的1级逻辑
  • 输出和寄存器之间的1级逻辑

所以它非常快,最终时间仅取决于路由延迟。

如果我们禁用FSM提取,则只需要2个LUT和2个寄存器,因为state现在编码为二进制。网表将如下所示:

Netlist without FSM extraction (点击)

有一个小的改进:输出现在可以由寄存器state[1]直接驱动。因此,您的设计现在可能具有更小的时钟到输出时间。

这里可以在关闭状态机提取后进行改进。但是,通常情况并非如此,因为它完全取决于类型state_type的实际编码。如果我们禁用FSM提取并将state_type的声明更改为:

  type state_type is (s3,s1,s2,s4);  

然后合成结果再次恶化:需要3个LUT和2个寄存器,寄存器和输出之间有1个逻辑电平。