1

我正在尝试在 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);

请帮我解决这个问题。

4

2 回答 2

1

这里真正的问题是两个进程几乎同时写入相同的控制信号和地址总线,因此一个进程获胜。如果您在开始时将其偏移 50ps,您可以看到两个进程都在运行,但这并不能解决真正的问题。

您需要一些方法来允许两个进程共享这些信号。例如,通过为读写器提供自己的控制和地址信号,并将它们组合在第三个进程(称为仲裁器)中,在它们之间进行仲裁,以允许它们轮流访问内存。

使用时钟来同步这些进程并使用“等到上升边缘(clk)”而不是大量容易出错的自定义延迟也是正常的。

时钟信号发生器可以很简单,clk <= not clk after 50 ps;如果你想改变速度,你只需要改变一个数字而不是 8(到目前为止!)

于 2013-05-01T10:51:04.247 回答
0

进程总是无限运行,除非你告诉它们停止。

添加一个wait;以使它们在您希望它们停止时停止。

于 2013-05-01T08:51:55.800 回答