我使用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
信号变为触发器!
我有点困惑。感谢任何帮助!谢谢!
答案 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指出分配发生在顺序逻辑推断语句之外(在您的示例中是时钟过程)。