VHDL产生控制信号作为触发器

时间:2014-12-14 09:08:45

标签: vhdl

我使用VHDL创建了一个具有四种状态的有限状态机,但是我很难理解FSM生成的控制信号发生了什么。我期待这些信号是动态生成的,无需将其存储在触发器中,但这种情况不会发生 - 合成会为所有这些信号创建触发器。

为了说明我的问题,我将把部分代码放在这里:

例如,这是我使用的寄存器:

-- register
signal register : STD_LOGIC_VECTOR (2 downto 0);
signal in_register : STD_LOGIC_VECTOR (2 downto 0);
signal c_register : STD_LOGIC;

-

-- register logic
process (clock)
begin
    if (clock = '1' and clock'event) then
        if (reset = '1') then
            register <= "000";
        elsif (c_register = '1') then
            register <= in_register;
        else
            register <= register;
        end if;
    end if;
end process;

我的FSM必须生成c_register信号,它与此类似:

-- FSM
process (clock)
begin
    if (clock = '1' and clock'event) then
         if (reset = '1') then
              c_register <= '0';
              state <= A;
              ...
         else
             case state is
                 when A =>
                     c_register <= '0';
                     state <= B;
                     ...
                 when B =>
                     c_register <= '0';
                     state <= C;
                     ...
                 when C =>
                     if (X) then
                         c_register <= '0';
                     else
                         c_register <= '1';
                     end if;
                     state <= D;
                 when D =>
                     c_register <= '0';
                     state <= A;
             end case;
         end if;
    end if;
end process;

我的FSM与上面显示的完全不同,但正如您所看到的,我在每个状态下都给c_register赋值,只是为了确保VHDL编译器不会认为我想要翻转-flop存储较旧的值。

当我编译它时,c_register信号变为触发器!

我有点困惑。感谢任何帮助!谢谢!

1 个答案:

答案 0 :(得分:1)

您可以将c_register转换为Mealy有限状态机输出,方法是在时钟进程外移动它。

以下内容:

c_register <= '1' when state = A and X = '0' else
              '0';

现在有人查看你不完整的VHDL示例可能会想知道信号名称中的'register'。 c_register是否控制了注册表?

注意除了可以使用的上述并发条件信号分配之外,还有其他几种形式的分配。例如,有一个等效的流程陈述:

process (state,X)
begin
    if state = A and X = '0' then
        c_register <= '1';
    else 
        c_register <= '0';
    end if;
end process;

如果A将一个热值表示为一个状态(其中状态在单独的触发器中彼此独立),则可以更简单地表达并发分配:

 c_register <= A and not X;

非注册Mealy状态机输出的操作思路是,当Paebbels指出分配发生在顺序逻辑推断语句之外(在您的示例中是时钟过程)。