1

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; など)。

私は何が欠けていますか?

4

1 に答える 1

3

あなたが見逃しているのは、あなたが説明する動作がラッチであることです。メモリを備えたもの (つまり、「他の状態では値を変更しない」) は、ラッチまたはレジスタ (フリップフロップ) のいずれかです。ラッチやレジスタが必要ない場合は、すべてのコード パスの信号に特定の値を割り当て、以前の状態を「記憶」させないようにする必要があります。

于 2012-12-23T19:52:17.020 に答える