IO16#信号

IO16#信号とSH3 (SH7709) CPUのバスサイジングの話。ユーザーボードを設計するときはココに注意してください。

  • CAT709はSH3 CPUを使っていて、拡張バスは16bitバスになっている。
  • CPUがワード幅転送(mov.w)を実行するとき、CPUはCE1#(下位バイトストローブ)とCE2#(上位バイトストローブ)を出力し、16bit幅アクセスを試みる。
  • I/O側回路はIO16#信号をCPUに返す必要がある。I/Oが16bit幅ならL,8bit幅ならHを返す。
  • CPUはIO16#がHだったときに、バイト幅転送命令を2回実行する(ダイナミックバスサイジング)
  • 実際にI/Oが16bit幅で,IO16#がLを返したときは何の問題も無いが、I/Oが8bit幅でIO16#にHを返すときに以下の問題点が発生する。

問題が発生するパターン

シナリオ。奇数番地からのバイト転送命令

20031104a.gif
  • 奇数アドレスのバイトリードなので、(1)のサイクルで、CPUはA0=H, CE2#=L(上位バイトレーンイネーブル), IORD#=L(リードクロック)を出力する。
  • しかし、IO16=Hを読み取るので今のアクセスは無効と判断し、再度(2)のサイクルでCE1#=L(下位バイトレーンイネーブル), IORD#=L(リードクロック)を出力する。
  • 結果、IO16=Hならば、偶数アドレスも奇数アドレス時もD7〜D0を使用するのだが、(1)のサイクルが存在することが問題だ。

なぜ問題になるか

  1. IORD# リードクロックが2回出力される。このため IOレジスタ側でフラグがクリアされたり(割り込み要因レジスタなど)、インデックスが進んだりしてしまう(FIFO等)
  2. 2回のIORD# リードクロック間でウェイトが入らない。デバイスのアクセスタイムが守られない可能性がある。

以上の2点はCAT709の問題ではなく、SH3 CPUの仕様的な問題点だ。ライトのときもまったく同じで、IOWR# ライトクロックが2回出力される。

関連リンク
http://www.epsondevice.com/card/technical/errata_shcard_02.html

対策

  • 8bitバスデバイスは偶数アドレスに配置する。A0をA1に、A1をA2につなぎ、奇数番地はつかわず飛び番号にする(一番簡単)
  • アドレスデコーダのイネーブル信号にはCE12*を使い、IO16*(H/L)を制御するが、チップに対するチップセレクト信号にはCE12*を使わずにCE1*を使えば問題なさそう。

それから、世の中のCFカードはチップセレクトを入れてないときもIO16#信号を常時出力しているらしい。EB709のソケット(socket1, 2)になんらかのCFカードを挿入しておくと、CPUが外部バス領域のアドレスをアクセスしたとき、CFからのIO16#信号がorされてCPUに加えられてしまう点に要注意。CAT709側のソケット0に挿入しておけば問題ない。

2004-02-04 (水) 12:24:52 えびはら

関連リンク

コメント

  • もしかすると、IOIS16はデバイスのセレクト信号と論理積をとるような方法が良いかもしれませんね -- Tango 2004-02-15 (日) 23:28:49
  • ↑は複数デバイスのIOIS16を個々のCE2でセレクトするようにすれば互いのデバイスによる干渉がないかもと言うことでした(言葉足らずでした) -- Tango 2004-02-15 (日) 23:47:42
  • そうそう。そのとおりで、元々IOIS16信号はバス接続ではなく、PCMCIAカードとPCMCIAコントローラ間の1対1接続のようなのですよ。だから、CPUへ返すときにデバイスのチップセレクトでANDをとってマスクをかけると良いと思います。 -- えびはら 2004-02-17 (火) 02:51:26