我正在编写一个 N 位非恢复分频器,但我遇到了一个小问题。
我有一个操作部分(组合)和一个控制部分(有限状态机)。控制部分有 2 个进程 FSM,1 个用于更新下一个状态,1 个用于“状态序列”。
update: process(clk_in, next_state)
begin
if rising_edge(clk_in) then
current_state <= next_state;
end if;
end process;
这是第二个过程:
control: process(current_state, start, S_in, counted)
variable sub_tmp : STD_LOGIC := '0';
begin
[...]
sub <= sub_tmp; -- sub is an output signal of my entity that goes in the Operative Part
case current_state is
when idle =>
if start='1' then
next_state <= init;
else
next_state <= idle;
end if;
when init =>
-- [...]
next_state <= subtract;
when subtract =>
en_A <= '1';
sub_tmp := '1';
next_state <= test;
when test => -- shift
en_Q <= '1';
if S_in='0' then
sub_tmp := '1';
else
sub_tmp := '0';
end if;
if counted=N/2-1 then
next_state <= finished;
else
next_state <= operation;
end if;
when operation =>
en_A <= '1';
next_state <= test;
when finished =>
stop <= '1';
next_state <= idle;
end case;
end process;
如您所见,我只需要在 2 种情况下(减法和测试)更改 sub 的值,而在其他情况下我不必更改。
问题是当我尝试合成这段代码时,结果发现 sub_tmp 是一个锁存器,但我不想要一个锁存器。我需要做这样的事情:
状态 1 => 将 sub 设置为“1”或“0”(取决于另一个输入)
状态 2 => 执行其他操作(但 sub 必须保持之前设置的值)并返回状态 1 等...
为了澄清更多:在我的 FSM 的某些状态(不是全部)中,我设置了一个变量的值(我们称之为 sub_tmp)。在其他州,我不会改变它的价值。然后假设我有一个名为“sub_out”的输出 PIN。现在,独立于变量值,我想将其值输出到此引脚(sub_out <= sub_tmp; 或类似)。
我错过了什么?