不受重视的1位锁存器(VHDL)

时间:2012-12-23 17:32:12

标签: vhdl state-machine flip-flop

我正在编写一个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是一个LATCH,但我不想要一个锁存器。 我需要做这样的事情:

状态1 =&gt;将sub设置为'1'或'0'(取决于另一个输入)

状态2 =&gt;做其他操作(但是sub必须保持之前设置的值)并返回到状态1 等...

澄清更多:在我的FSM的某些状态(不是所有状态)中,我设置变量的值(让我们称之为sub_tmp)。在其他州,我不改变它的价值。然后假设我有一个名为“sub_out”的输出PIN。现在,独立于变量值,我想将其值输出到此引脚(sub_out&lt; = sub_tmp;或类似)。

我错过了什么?

1 个答案:

答案 0 :(得分:3)

您所缺少的是您描述 IS 锁存器的行为。任何带存储器的东西(即:“在其他状态下我不改变它的值”)是锁存器或寄存器(触发器)。如果您不想要锁存器或寄存器,则需要在每个代码路径中为信号指定一个特定值,而不是让它“记​​住”它的先前状态。