如何允许两个进程更改同一信号的值

时间:2014-05-09 18:57:01

标签: vhdl

我有两个使用信号在它们之间进行同步的过程,使用的信号是以下方式:

type state_machine_1 is
    (st1_state_idle, st1_state_1, st1_state_2, st1_state_3,
     st1_state_4,st1_state_5,st1_state_6);
type state_machine_2 is
    (st2_state_idle, st2_state_1, st2_state_2);

--...

signal st1      : state_machine_1;
signal st2      : state_machine_2;
signal sync_sig : std_logic;

--...

st1_proc: process (CLK, RESET)
begin
    if (RESET = '1') then
        st1                                 <=  st1_state_idle;
        sync_sig                            <=  '0';
    elsif rising_edge(CLK) then
        case st1 is
            when st1_state_idle =>
                --...
                sync_data_is_ready_for_cau  <=  '0';
                if (START = '1') then
                    st1             <= st_state_1;
                else
                    st1             <= st1_state_idle;
                end if;
            ----------------
            when st_state_1 =>
                --...
                st1                 <=  st_state_2;
            ----------------
            when st_state_2 =>
                --...
                st1                 <=  st_state_3;
            ----------------
            when st_state_3 =>
                --...
                if (sync_sig = '0') then
                    st1             <=  st_state_5;
                else
                    st1             <=  st_state_4;
                end if;
            ----------------
            when 4  =>
                if (sync_sig = '0') then
                    st1             <=  st_state_5;
                else
                    st1             <=  st_state_4;
                end if;
            ----------------
            when st_state_5 =>
                --...
                sync_sig    <=  '1';
                st1             <=  st_state_1;
        end case;
    end if;
end process;

st2_proc: process (CLK, RESET, reset_for_st2)
begin
    if (RESET = '1' or reset_for_st2 = '1') then
        st2                 <= st2_state_idle;
    elsif (rising_edge(CLK)) then
        case st2 is
            when st2_state_idle =>
                if (sync_sig = '1') then
                    st2     <=  st2_state_1;
                else
                    st2     <=  st2_state_idle;
                end if;
            ----------------
            when st2_state_1 =>
                --...
                st2     <=  st2_state_2;
            ----------------
            when st_state_2 =>
                --...
                st2           <= st2_state_3;
            ----------------
            when st2_state_3 =>
                --...
                sync_sig  <= '0';
                st2           <= st2_state_idle;
            ----------------
        end case;
    end if;
end process;

所有--...都是不接触同步信号的逻辑,而不是状态信号(在某些情况下,如果有等待某个信号来推进状态)。因此,放入同步信号的值之间不会发生任何冲突,但模拟(Altera Model-Sim)会给信号一个U值。如何使用信号在进程之间进行同步?

1 个答案:

答案 0 :(得分:0)

&#39; U&#39; (未初始化)只有在模拟开始时没有reset处于活动状态时才会出现。你应该真正得到&#39; X&#39;当两个FSM冲突时,sync_sig上有多个驱动程序。当您在已解析类型上有多个驱动程序时,这是正常和预期的行为。

看起来您希望每个FSM在{1}之间切换sync_sig的状态。和&#39; 0&#39;。这可以通过在单独的过程中描述JK触发器来实现,其中每个FSM自己驱动设置和清除信号。这样做将消除多个驱动程序并允许FSM进行互操作。

为了避免将来摆脱此问题,请考虑使用未解析的std_ulogicstd_ulogic_vector。如果您错误地描述了多个驱动程序,则会出现编译器错误。已解决的类型实际上非常适合行为模拟和管理双向IO。他们应该从未成为&#34;默认&#34;对于整个设计的信号。