我试图在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 :(得分:1)
这里的真正问题是两个进程几乎同时写入相同的控制信号和地址总线,因此一个进程获胜。如果你在开始时用50ps偏移一个进程就可以看到两个进程都在运行,但这并不能解决真正的问题。
您需要一些方法来允许两个进程共享这些信号。例如,通过给读写器提供自己的控制和地址信号,并将它们组合在第三个进程(称为仲裁器)中,在它们之间进行仲裁,以允许它们轮流访问内存。
使用时钟同步这些进程并使用“wait until rising_edge(clk)”而不是很多容易出错的自定义延迟也是正常的。
时钟信号发生器可以像clk <= not clk after 50 ps;
一样简单,那么如果你想改变速度,你只需要改变一个数而不是8(到目前为止!)
答案 1 :(得分:0)
进程总是无限运行,除非你告诉他们停止。
添加wait;
,以便在需要时停止。