【问题标题】:enumerated type signal is not substituted the value枚举类型信号未被替换的值
【发布时间】:2021-11-06 01:48:36
【问题描述】:

我正在创建一个简单的有限状态机。

编译器好像没有识别出它是FSM。

网上不断引用FSM的例子,之前也写过简单的FSM代码。

但是,我感觉不到我之前写的 FSM 和现在不工作的 FSM 之间的区别。

为什么下面写的代码不能识别状态,FSM不工作?

为什么signal_test通过IF输出,而state没有输入到st中?

enter image description here

library ieee;
use ieee.std_logic_1164.all;

entity aaa is port(
    reset: in std_logic;
    clk: in std_logic;
    input: in std_logic;
    signal_test: out std_logic);
end aaa;

architecture beh of aaa is    
type state is (s0,s1,s2,s3);
signal st: state :=s0;

begin
        process(reset, clk)
        begin
        if reset = '0' then st <= s0;
            else
                if falling_edge(clk) then
                    case st is
                        when s0 =>
                            if input='1' then st<=s1;
                                              signal_test<= '1';
                            else signal_test<= '0';
                            end if;
                        when s1 =>
                            if input='1' then st<=s2;
                                              signal_test<= '1';
                            else signal_test<= '0';
                            end if;
                        when s2 =>
                            if input='1' then st<=s3;
                                              signal_test<= '1';
                            else signal_test<= '0';
                            end if;
                        when s3 =>
                            if input='1' then st<=s0;
                                              signal_test<= '1';
                            else signal_test<= '0';
                            end if;
                    end case;
                end if;
            end if;
        end process;
        
end beh;

【问题讨论】:

  • 您的代码有一些语法错误。例如,文字null 不是character,我假设您的意思是NUL。它还不清楚您的图像与代码的关系。 st 变量是枚举类型state,但波形显示了各个状态位。这是合成后的波形吗?因此,这与您的问题有何关系?

标签: vhdl quartus fsm


【解决方案1】:

您使用的模拟器不符合 VHDL 标准。请注意,它不支持信号 st 没有元素的标量枚举类型状态。使用 .vwf 波形文件作为激励源并模拟 Quartus 波形是一个缺点。

在此处提供Minimal Complete and Verifiable example 提供一个测试平台来为 VHDL 模拟器提供刺激,而不是使用波形编辑器,并且它的相关模拟器证明您的 aaa 设计描述是有效的:

library ieee;
use ieee.std_logic_1164.all;

entity aaa_tb is
end entity;

architecture foo of aaa_tb is
    signal reset:       std_logic;
    signal clk:         std_logic := '0';
    signal input:       std_logic := '0';
    signal signal_test: std_logic;
begin
    dut:
    entity work.aaa
        port map (
            reset => reset,
            clk => clk,
            input => input,
            signal_test => signal_test
        );
CLOCK:
    process
    begin
        wait for 10 ns;
        clk <= not clk;
        if now > 220 ns then
            wait for 3 ns;
            wait;
        end if;
    end process;
STIMULI:
    process
    begin
        wait for 1 ns;
        reset <= '1';
        wait for 40 ns;
        input <= '1';
        wait for 40 ns;
        input <= '0';
        wait for 40 ns;
        input <= '1';
        wait for 40 ns;
        input <= '0';
        wait for 40 ns;
        input <= '1';
        wait for 33 ns;
        wait;
    end process;
end architecture;

生成的波形是使用 ghdl 2.0.0-dev (1.0.0.r419.g983236ac, a nightly release)、它的原生转储文件格式和 gtkwave v3.3 107 在 2020 年末 Macbook Air 上生成的M1 运行 MacOS 11.5.1 Big Sur 和提供的使用 x86_64 仿真的测试台(使用 Rosetta 2,ghdl 的 LLVM 版本还需要安装 Xcode 命令行工具以及 Homebrew brew install 与 arch=x86_64 和 llvm 12 安装提供共享库来匹配​​使用最新 llvm 版本的构建过程,使用 ghdl mcode version 安装会更简单,只需要命令行工具,而 llvm 版本支持协同仿真)。

大多数商业模拟器和波形转储文件显示都能够处理用户定义的 VHDL 枚举类型,尽管某些波形显示历史上需要加载表来获取枚举值。 Intel/Actel 的 .vwf 波形编辑器从 Quartus II 继承的仿真不具备该能力,该仿真预计硬件中的热编码。

除了使用符合 VHDL 的工具方法之外,您还可以避免使用枚举类型状态,而是将其值声明为单一热实现中的信号,从而使波形作为激励方法获得成功。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-14
    • 2023-02-21
    • 2018-10-18
    • 2019-03-31
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多