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

ここでの本当の問題は、両方のプロセスがほぼ同時に同じ制御信号とアドレスバスに書き込みを行っているため、一方のプロセスが勝つことです。開始時に 1 つを 50ps オフセットすると、両方のプロセスが実行されていることがわかりますが、実際の問題は解決しません。

両方のプロセスがこれらのシグナルを共有できるようにする何らかの手段が必要です。たとえば、リーダーとライターに独自の制御信号とアドレス信号を与え、それらを 3 番目のプロセス (アービターと呼ばれる) で組み合わせて、それらの間で調停を行い、交互にメモリにアクセスできるようにします。

また、クロックを使用してこれらのプロセスを同期し、間違いやすい多くのカスタム遅延の代わりに「raising_edge(clk) まで待機」を使用することも通常です。

clk <= not clk after 50 ps;クロック信号発生器は、速度を変更したい場合、変更する数値が 8 つではなく 1 つだけであるという単純なものにすることができます(これまでのところ!)

于 2013-05-01T10:51:04.247 に答える