2014-05-09 28 views
0

我有兩個進程使用的信號它們之間進行同步的值,則使用的信號是休耕的方式:如何讓兩個過程來改變相同的信號

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值。我如何使用信號在進程之間進行同步?

+0

也許[this](http://stackoverflow.com/questions/9084975/vhdl-driving-signal-from-different-processes)可以幫助你。 – hr0m

回答

0

只有在模擬開始時沒有reset激活時纔會出現'U'(未初始化)。由於您在sync_sig上有多個驅動程序,因此在兩個FSM衝突時實際應該獲得'X'。如果解析類型有多個驅動程序,這是正常和預期的行爲。

看起來您希望每個FSM都在'1'和'0'之間切換sync_sig的狀態。這可以通過在單獨的過程中用每個FSM驅動的置位和清除信號來獨立描述JK觸發器來實現。這樣做將消除多個驅動程序並允許FSM互操作。

爲了在未來避免此問題,請考慮使用未解決的std_ulogicstd_ulogic_vector來代替。如果您錯誤地描述了多個驅動程序,則會出現編譯器錯誤。解決的類型確實非常適合行爲模擬和管理雙向IO。他們應該從未成爲整個設計信號的「默認」。

相關問題