ロード トップ 参照元 逆検索 検索 ヘルプ

[logo] 電子工作/XC9572XLで作るROMライタ


SuzTiki:電子工作

CPLD (XC9572XL) で ROM ライタを作る。

広く使われている 29LV系の Flush ROM は、特別な電圧を必要とせず 3.3V 系の 論理回路だけで 制御すれば良い。ということは、CPLD の I/O 線を ROM の ソケットに とにかくつないでいって

を考えてやれば、ROM ライタになってしまうわけだ。こうやって作った回路は CPLD の中味しだいで 他の回路にもなる。

という問題はクリアになっている(はずな)ので、ROM をいれるべき ROM ソケットを 単なるコネクタと見立てて別の回路を載せたりできるはず。

CPLD をどう config するかについては、JTAG に決まっている。 NAXJP を使えば、PC の パラレルポート の線を直結するだけで 書き込むことができる。

それを前堤とすれば、HOST とどう通信するか ということも だいぶ決まって来る。 パラレルポートの 別の信号線を使うわけだ。JTAG の制御と SPI の制御は 似ているので、SPI がまあ妥当だろう。

さて、それだけできたら良いのだろうか? パラレルポートでは、別電源が必要だし、信号にノイズが載ってうまく書けない 場合があるという話を聞いている。 そして、そういったこと以上に PC のパラレル ポートが壊れると厭だ。( 自分ではPC のパラレルポート自体使ったことないんだ けども、壊れると このROMライタ自身が使えなくなるから困る。 そして 相手はCPLD なので、バグっていたらやっぱり壊れる可能性があるんじゃ ないかという気がしている)

そうすると USB が使えたら良いのではないかという気になってくる。 ただ 他の FPGA/CPLD を使うときも有用なので、 USB との通信は、独立したものの方が良い。これは、 電子工作/XC9572XLと8U245AMで作るUSBシリアルIOで考えることにする。

以下、CPLD の中の回路をどうするか について考えることにする。


作ろうとするもの

想定インターフェイス

基本的な考えかた

         +------------+
   +---- | カウンタ   |
   |     +------------+
   |        IN
   |           | | | | | | | | | | | | | | | | | | | | | | | | | | |
   |       +----------------------------------------------------------+
  ----> CLK|                                                          |
  ----> IN |                                                          |
  <---  OUT|                                                          |
           +----------------------------------------------------------+
               | | | | | | | | | | | | | | | | | | | | | | | | | | |
           OUT | | | | |
             +-----------------+
             | 制御線ラッチ    |
             +-----------------+
               | | | | |

固定長のデータフォーマットを考えると、 長い シフトレジスタを1つ考えて CLK とともに シフトさせる。

元あったデータがホスト側に行って、ホストから送られたデータがあたらしい 状態になる。CLK をカウントしておいて、全部入れ換わったら所定の動作を すれば良い。

こういう単純な構成で ROM ライタを考えると、いくつかの制御用の 信号線が、シフト動作で変わってしまうのはまずい。 そういう理由で ラッチをかませている。ただし全部ではなく、 アドレス線 などは、このシフトレジスタの OUT を直接 接続しても 良い。データ線は 入出力があるので、制御線ラッチの状態を 使って動作を規定させる必要がある。
シフトレジスタの長さを Flush ROM の信号線 に合わせて取るとすれば、アドレス 24bit データ 16bit その他 数ビット。 全部で 48 bit ぐらい。制御線用ラッチが 8bit 、カウンタが 8bit とすれば、 トータルで、64bit。XC9572 は 72 bit 分あるので、入ることは入る。

ただし、ほんとうにこのように作ってしまうと

      RD# を Low レベルにして データ方向を切り替える。
      RD# を Hi レベルにして、データの内容を取りこむ。
      データ方向を切り替える。

といった操作で、シフトレジスタ長の内容 の転送が 3 回発生する。

48 bitx3 で 18 バイトのやりとりをして、 16 bit のデータが読める ...

まあ、3回の転送の間で同期を取る必要はなく、どんどん転送すれば良いから、 それでも良いという考えもあるのだが ... もうすこし 工夫をいれたい。 それが、主なテーマということになる。

ちなみに、なにかの間違いで、シリアルの bit がずれてしまったりしたときは、 どうするんだろうか?

これに対応するには、たぶん チップセレクト CS# というのを考えて、 その立ち下がりで、カウンタを 0 にすれば良いのだろう。 チップセレクト という概念にするなら、もうすこし付加的な機能も必要。 だいたい下のような感じか。


構成を考える

どう工夫しても 上記より 必要な情報量が劇的に減るということはないが、 いくつかのステージに分けることによって、制御できれば、 効率良く転送できるようになる。

考えてみたのは、アドレスレジスタにカウンタ機能を付け、 転送数カウンタの数だけ、くり返し READ/WRITE 操作をできるように すること。

なお、基本構成では データバスを 16bit としていたが、 くり返しの操作ができるのなら、性能的なインパクトはないので、 8 bit モードにすることにする。

これでだいたい 64 bit ぐらい使う見積り。多少 減らせる見込みがあるが、 CS の制御なども必要。結果として ぎりぎりになるんではないかと思っている。


転送フォーマット

      受信                 送信
   +---------------+   +---------------+
   |  コマンド     |   |     0         |
   +---------------+   +---------------+
   |  転送数       |   |  コマンド     | 
   +---------------+   +---------------+
   |  アドレス#0   |   |  転送数       |
   +---------------+   +---------------+
   |  アドレス#1   |   |  アドレス#0   |   
   +---------------+   +---------------+
   |  アドレス#2   |   |  アドレス#1   |   
   +---------------+   +---------------+
   |      0        |   |  アドレス#2   |   
   +---------------+   +---------------+

----------------------------------------- 
                                           Option : データ転送フェーズ

   +---------------+   +---------------+
   |  データ1      |   |     0         |
   +---------------+   +---------------+
   |               |   | データ 1      |
   |      :        |   +---------------+
   |               |   |               |
   +---------------+   |               |
   |  データN      |   |               |
   +---------------+   +---------------+

   +---------------+   +---------------+
   |       0       |   | データN       |
   +---------------+   +---------------+

実はちょっと面倒なことがある。それは、1 CLK の操作で、READ/WRITE なり ができないこと。たとえば、WRITE なら、データを受け取った後に 書き込み操作が入る。それは次のフェーズにずれ込んでしまう。

また、READ の場合 アドレス確定後 すぐに 読みこんだデータを送ることは できない。

最後にダミーデータを送ってもらうことにして、 1 バイトづつ ずらしてデータを返すというのがわかりやすくて良いかもしれない。


ちょっとここで観想。

XC9572XL ってなかなか良いバランスかも知れない。XC9536XL クラスなら、規模が小さすぎて 簡単なステートマシンも 作れそうにないが、これなら ちょっとしたものなら入るようだ。

もうすこし沢山の データが扱えたらいいなぁとは思うので、 XC95144XL-TQ100 もいいかもしれない。 値段も XC9572XL-VQ64 の倍はしない。

ただ、ステートマシンの勉強としては、この規模を卒業したら、 1ケタ上を考えたいので、XC95144XL-TQ100 で遊ぶことはたぶんないだろう。


(最終更新 Thu Mar 30 18:59:53 2006)