2013-04-30 37 views
1

我試圖模擬VHDL中的微處理器作爲分配的一部分。它是一個非常基本的模型,甚至不需要包含所有的操作碼。我想解決以下問題。在VHDL中運行多個進程

我必須在mw_process之後運行mr_process。但是,只有mw_process可以無限運行,如波形圖所示。

BEGIN 
m : CODEMEM PORT MAP(addbus, data_in, data_out, control); 

mw_process : process -- Write the entered commands 

begin 
    addbus <= "00000000"; -- mvi a, 0f 
    data_in <= "00001111"; 
    control <= '1'; 
    wait for 100 ps; 
    addbus <= "00000001"; 
    data_in <= "00001111"; 
    control <= '1'; 
    wait for 100 ps; 
    addbus <= "00000010"; -- mvi b,08 
    data_in <= "00001000"; 
    control <= '1'; 
    wait for 100 ps; 
    addbus <= "00000011"; 
    data_in <= "00001000"; 
    control <= '1'; 
    wait for 100 ps;  

end process; 

mr_process : process -- Read the entered commands 

begin 
    addbus <= "00000000"; -- mvi a, 0f 
    control <= '0'; 
    wait for 100 ps;  
    addbus <= "00000001"; 
    control <= '0'; 
    wait for 100 ps; 
    a <= data_out; 

    addbus <= "00000010"; -- mvi b,08 
    control <= '0'; 
    wait for 100 ps; 
    addbus <= "00000011"; 
    control <= '0'; 
    wait for 100 ps;  
    b <= data_out; 

end process; 

L1: ALU PORT MAP(A, B, '1', "001", RES, CARRY, ZERO); 

請幫我解決這個問題。

回答

0

過程總是無限地運行,你告訴他們停止。

添加一個wait;讓他們停下來,當你想要他們。

0

這裏真正的問題是,兩個進程都在大致相同的時間寫入相同的控制信號和地址總線,以便一個進程獲勝。你可以看到兩個進程都在運行,如果你在開始時偏移了50ps,但這並不能解決真正的問題。

您需要一些允許兩個進程共享這些信號的方法。例如,通過給讀寫器自己的控制和地址信號,並將它們組合在第三個過程中(稱爲仲裁器),它們在它們之間進行仲裁以允許它們輪流訪問存儲器。

使用時鐘同步這些進程並使用「等到rising_edge(clk)」而不是很多容易出錯的自定義延遲也是正常的。

時鐘信號發生器可以像clk <= not clk after 50 ps;簡單這時如果你想改變的速度,你只有一個數字來改變,而不是8(到目前爲止)