2013-04-30 40 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(到目前为止)