Недооцененная 1-битная защелка (VHDL)

Я программирую 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_tmp - это LATCH, но я не хочу защелки. Мне нужно сделать что-то вроде этого:

состояние 1 => установить sub на "1" или "0" (в зависимости от другого входа)

состояние 2 => выполнять другие операции (но sub должно оставаться в заданном ранее значении) и возвращаться в состояние 1 и т. д.

Для уточнения: в некоторых состояниях моего FSM (не во всех) я устанавливаю значение переменной (назовем это sub_tmp). В других штатах я не меняю его значение. Тогда, скажем, у меня есть выходной PIN-код под названием "sub_out". Теперь, независимо от значения переменной, я хочу вывести ее значение на этот вывод (sub_out <= sub_tmp; или аналогичный).

Что мне не хватает?

1 ответ

Решение

То, что вам не хватает, это поведение, которое вы описываете, это защелка. Все, что с памятью (то есть: "в других состояниях я не изменяю это значение"), является либо защелкой, либо регистром (триггер). Если вам не нужен фиксатор или регистр, вам нужно назначить определенное значение сигналу в каждом пути кода и не дать ему "запомнить" его предыдущее состояние.

Другие вопросы по тегам