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

标签 vhdl state-machine

我正在上一门关于嵌入式系统设计的类(class),我的一个同学上了一门类(class),声称另一门类(class)的讲师不会让他们实现这样的状态机:

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;

但相反,他们必须这样做:
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;

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

我的同学无法给我任何理由解释为什么他的讲师不让他们使用其他方式来实现它,所以我试图找出每种方法的优缺点。
他们中的任何一个在行业中都是首选吗?为什么我要避免其中之一?

最佳答案

单流程形式更简单、更短。仅此一项就减少了它包含错误的机会。

然而,它也消除了困扰其他组合过程的“不完整的敏感性列表”问题的事实 应该 使其成为明显的赢家,而不管其他任何考虑。

然而,有太多的文本和教程提出相反的建议,没有适本地证明该建议的合理性,或者(至少在一种情况下我找不到 atm)将一个愚蠢的错误引入到单一流程形式中并以以下为由拒绝整个想法那个错误。

唯一(AFAIK)单进程形式做得不好的是非时钟输出。无论如何,这些都是(IMO)糟糕的做法,因为它们可以在最好的时候进行比赛,并且只有在您确实必须这样做时才能通过该输出的单独组合过程来处理。

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

如果这些讲师看到可以通过现代综合工具传递的信息:整数、枚举、记录类型、循环、函数和程序更新信号(Xilinx ISE 现在可以很好地处理这些问题。某些版本的 Synplicity 有问题)函数,但接受带有 Out 参数的相同过程)。

另一条评论:我更喜欢 if Rst = '1' then 而不是 if (Rst = '1') then 。它看起来不像线路噪声(或 C)。

关于VHDL 状态机差异(用于综合),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19463359/

相关文章:

c - C中不同变量的状态机

design-patterns - 状态机设计模式

vhdl - 如何使用 VUnit 为 ModelSim 添加编译选项?

caching - 使用 MESI 协议(protocol),写入命中也会使处理器停止运行,对吗?

vhdl - VHDL 中 `std_logic` 枚举类型的目的是什么?

java - 如何在java中为实体实现状态转换?

c - 采访 : function pointers vs switch case

logic - VHDL 正交解码器 : Sequential/Combinatorial Logic

vhdl - 对象已使用但未声明?

amazon-web-services - 如何暂停 AWS 步骤函数并恢复它?