Posts Issued on August 5, 2019

posted by sakurai on August 5, 2019 #141

さて、サブシステムの共有メモリを実装する際には、実機では図141.1のようにメインCPUがサブCPUをHALTさせてアクセスしています。前稿のように、共有メモリは128ByteとなっていてメインCPUとサブCPUの間に物理的な128Byteのメモリがあるように思えますが、実態はサブCPUの物理メモリ(MB8416, 2KB SRAM)の半分しか使用しておらず(\$D000~\$D3FFの1KB SRAMとして使用)、さらにそのうちのメインCPUから見える窓が128Byteであり、メインCPUが使用する際にはHALTをかけてサブCPUのバスを開放し、メインCPUがアクセスするという構造のようです。

図%%.1
図141.1 共有メモリ回路図

物理メモリのMB8416がシングルポートで同時にアクセス不可であるため、HALTによりバスを開放させています。FPGA実装では、デュアルポートRAMが可能なので同時アクセス可なのですが、同時にアクセスすると、サブCPUがコマンドを読み出し中に、メインCPUが書き換えてしまうという論理的なデータ競合の問題が起こります。従って、メインCPUとサブCPUの論理的な同期化のために、HALT信号が必要です。

ところが、図138.2をみてもわかるように、本IPの信号はLSIの6809と異り、HALT端子がありません。従って、HALTREQ、HALTACK端子を実装します。

IPの6809のソースを追うと、FSMの最初に割込み受信のコードが存在します。その辺に以下のような疑似コードを挿入します。HALTREQ信号をhaltreq変数に入れているのは、HALTREQ信号を見るのは一か所にしたかったためです。逆に複数個所でHALTREQ信号を見ると、状態の不一致が起きる可能性があります。

もしHALTREQ信号がHならば、
 haltreq変数をHにし、
 現stateがSEQ_HALTで無い場合にのみ、stateを戻りステートとして保存し、
 次のサイクルでSEQ_HALTに移行
そうでなければ
 haltreq変数をLにする

SEQ_HALT:
 もしhaltreq変数がHならば、
  HALTACKをHにし、
  次のサイクルでSEQ_HALTに移行
 そうでなければ、
  HALTACKをLにし、
  次のサイクルで戻りステートに移行

これをVerilogで記述すれば、

図%%.2
図141.2 Verilogコード

となります。


左矢前のブログ 次のブログ右矢