隘路(あいろ) |
隘路とは、物事を進めていくうちに突き当たった壁です。Freedimの開発にはさまざまな隘路がありました。そんな隘路を少しづつ書いていきます。
|
DIMMのソケットと基板 |
最初につまづいたのが、DIMMのソケットをさす基板です。DIMMのソケットは千石に200円で売っていますが、もちろん、これが素直にささる万能基板はありません。
ちなみにこのソケットの足は2.54mmの4列千鳥です。
サンハヤトの変換基板を探していたら、4列の千鳥を通常の4列に変換する基板がありました。一個780円です。残念ながら、これには168ピンもの数のピンがありませんでした。
幸いなことに、DIMMは真ん中(39,40ピンの間)にピンがない場所があります。そこを利用して、2枚のサンハヤトの基板を使うことにしました。
まずはじめに、サンハヤトの変換基板を、のこぎりで適切な大きさに切ります。そこに秋月で買ってきた2列のピンヘッダーのメスをいっぱい挿し、万能基板側にはそれに勘合するようにピンヘッダのオスを挿します。そして、あとは504箇所はんだ付けすれば完成です。
|
読み出しが、たまに失敗する |
あるアドレスから読み出しを行った場合、必ず失敗するという現象が発生しました。これをテレビの画面でみると、決まった位置に白や黒の点が出るように見えました。
最初は、XC95108でDIMM用クロックを生成するときに、分配回路をインバータではなく単なるバッファとしていたため、次に示すようなタイミングになっていたと思われます。
DIMM用のクロックが遷移するのが、システムクロックから15ns後です。RASやCASやアドレスに使われているレジスタ出力が遷移するのは、システムクロックから8ns後です。だからセットアップ時間は間に合うはずです。しかしごく稀に、決まったアドレスでDIMMから正しい値を読み出せなかったのです。
結局、現在のようにXC95108の中身をインバータにしたら解決しましたが、原因はいまだに不明です。
|
マルチプレクサ |
本回路は、DIMMに書きこみをおこなうためのアドレスと、読み出しをおこなうためのアドレスカウンタを別々に持っています。アドレスカウンタはそれぞれが24bit構成です。RASとCASアドレスを切り替えるための、マルチプレクサで多少苦労しました。
実験していると、CASアドレスがうまく切り替わっていないことがわかりました。常に特定のビットが0に固定されているのです。WebPackの生成したタイミングレポートを見ると、そのピンだけ遅延時間が25nsくらいになっています。本来ならクロックから8nsで出てほしい信号なのに、こんなに遅延が多くては使い物になりません。
その原因を調べてみると、「ファンクションブロックが溢れたから、あなたの指定したとおりには配置できなかった。よそのファンクションブロックを経由するね。」というWarningメッセージが出ていました。
WebPackは、配置できないほど密度の高い設計(難しいことではない)をすると、このメッセージのように、よそのファンクションブロックを経由して配置配線をおこなってくれます。しかしそうなると、動作速度が急激に下がりますので、手作業で回路の密度を下げなければなりません。
具体的にいえば、どのような回路が問題だったかというと、
40本のアドレス信号を、10本に束ねるマルチプレクサです。XILINXのCPLDはひとつのファンクションブロックに36本の信号までしか入れることができません。ひとつのファンクションブロックをこのアドレス生成回路で占めていたわけではありませんが、ファンクションブロックの入力が足りなくなったため、望んだとおりには配置配線できなかったのです。
そこで、密度を下げるために、パイプライン化しました。CASアドレス(つまり下位のアドレス)は必ずRASアドレスよりも後に入力させるのですから、一度レジスタを通しても構わないはずです。まず、20入力10出力のマルチプレクサを作りレジスタを通します。それを再び30入力10出力のマルチプレクサに入れることで、解決できました。
74何とかの汎用ロジックや、GALを使っていたころには、このような変更はとてもやる気がしないものでしたが、本当にCPLDは便利だなと感じさせられる一瞬です。
|