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;
これが 2 番目のプロセスです。
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;
ご覧のとおり、sub の値を変更する必要があるのは 2 つのケース (減算とテスト) のみですが、他のケースでは変更する必要はありません。
問題は、このコードを合成しようとすると、sub_tmp が LATCH であることが判明することですが、ラッチは必要ありません。私はこのようなことをする必要があります:
状態 1 => サブを '1' または '0' に設定 (別の入力に応じて)
状態 2 => 他の操作を行い (ただし、sub は以前に設定された値のままにしておく必要があります)、状態 1 に戻ります。
さらに明確にするために、FSM の特定の状態 (すべてではない) で、変数の値を設定します (sub_tmp と呼びましょう)。他の州では、その値を変更しません。次に、「sub_out」という出力 PIN があるとします。ここで、変数の値とは別に、その値をこのピンに出力したいと思います (sub_out <= sub_tmp; など)。
私は何が欠けていますか?