VHDL状态机差异(用于合成)

eva*_*ing 3 state-machine vhdl

我参加了一个关于嵌入式系统设计的课程和我的一个同学,他们采取了另一种方法,声称另一门课程的讲师不会让他们实现这样的状态机:

architecture behavioral of sm is
    type state_t is (s1, s2, s3);
    signal state : state_t;
begin
    oneproc: process(Rst, Clk)
    begin
        if (Rst = '1') then
            -- Reset
        elsif (rising_edge(Clk)) then
            case state is
                when s1 =>
                    if (input = '1') then
                        state <= s2;
                    else
                        state <= s1;
                    end if;
                    ...
                    ...
                    ...

            end case;
        end if;
    end process;
end architecture;
Run Code Online (Sandbox Code Playgroud)

但相反,他们必须这样做:

architecture behavioral of sm is
    type state_t is (s1, s2, s3);
    signal state, next_state : state_t;
begin
    syncproc: process(Rst, Clk)
    begin
        if (Rst = '1') then
            --Reset
        elsif (rising_edge(Clk)) then
            state   <= next_state;
        end if;
    end process;

    combproc: process(state)
    begin
        case state is
            when s1 =>
                if (input = '1') then
                    next_state <= s2;
                else
                    next_state <= s1;
                end if;
                ...
                ...
                ...

        end case;
    end process;
end architecture;
Run Code Online (Sandbox Code Playgroud)

对于我来说,非常缺乏经验的人,第一种方法看起来更加简单,因为一切都是时钟的,并且引入锁存器的风险较小(没有?).

我的同学不能给我任何理由说明为什么他的讲师不会让他们使用其他方式来实现它,所以我试图找到每个人的利弊.他们中的任何人都喜欢工业吗?为什么我要避免一个或另一个?

Bri*_*ond 6

单一流程形式更简单,更短.仅这一点就减少了它包含错误的可能性.

然而,它也消除了困扰对方组合过程的"不完全敏感性列表"问题,这一事实应该使其成为明显的赢家,无论其他任何考虑因素如何.

然而,有如此多的文本和教程提供相反的建议,没有正确地证明这些建议或(至少在一种情况下我无法找到atm)在单一流程形式中引入一个愚蠢的错误,并以此为由拒绝整个想法.那个错误.

唯一的事情(据我所知)单进程形式做得不好是无时钟输出.这些都是(IMO)糟糕的做法,因为它们可以在最好的时候进行比赛,并且只有在你真的需要时才可以通过单独的组合过程来处理.

我猜它背后原本有一些实际的原因; 可能是20世纪90年代中期的综合工具,无法可靠地处理单一流程形式,并使其成为讲师从中学习的原始文档.就像那些爆破的非标准std_logic_arith库一样.所以这个神话一直延续下去......

如果他们看到可以通过现代综合工具的东西,那些相同的讲师可能会很合适:整数,枚举,记录类型,循环,函数和程序更新信号(Xilinx ISE现在很好用这些.一些版本的Synplicity有问题函数,但接受与Out参数相同的过程).

另外一个评论:我喜欢if Rst = '1' thenif (Rst = '1') then.它看起来不像线路噪音(或C).