« 2010年4月11日 - 2010年4月17日 | トップページ | 2010年4月25日 - 2010年5月1日 »

2010年4月18日 - 2010年4月24日の1件の記事

2010年4月22日 (木)

外付けSRAMを制御するFPGAのピンが足らない

 FPGAでビデオインターフェースを作るプロジェクトは、シミュレーターのインストールに道草を食ってしまい、第二ステップは、まだ基本的な仕様がかたまっただけである。このステップの目標は、外付けSRAMの制御をマスターすることで、UARTを通してメモリにデータを蓄積し、そのあとリターンキーの入力でそれを吐き出させる機能を開発することにしている。

 本来のFPGAの目的であるビデオインターフェースは、電源を入れれば、ただひたすらVRAM(SRAM)にあるフレームデータをアナログビデオ信号に変換して出力することだけである。複雑なシーケンス制御は想定していない。考えてみれば、UARTなどを使った順序制御の必要はない。

S_a4172842

 しかし、プロセッサーとの間はバス接続でなく、シリアルのSPIを考えている。とすると、まだ仕様は考えていないが、SPIから来るビデオデータの頭を知るための何らかの順序制御は必要になる。それにFPGAの勉強としては恰好の題材でもある。少し回り道だが、UARTでの制御にこだわってみることにした。

ステートマシンを理解する(4/15/2010)
 UARTからのデータ入力は、キーボードからの手入力または、端末ソフトでのカットアンドペーストか、ファイル転送すれば、高速でメモリを書くことになる(といってもUART以上の速さにならないが)。FPGAのUARTは幸いなことに完全な全二重である。エコーバックも問題ないはずだ。

 頭の中だけで考えていたステートマシンの詳細設計に入った。メモを沢山書いて頭を捻る。ちょっと勉強しただけでこんなことを言うのもおこがましいが、ステートマシンには汎用性がなく、構造化することが出来ないので少し複雑なことをしようと思うととても面倒なことになることがわかった。

 例えば、同じ処理が出てくるので(UARTの送信など)、普通のプログラミング言語の関数のように処理ブロックを使い回しすることを考えたが、フラグの制御が大変で、かえって構造が複雑になる。階層構造には出来ない。ひとつのalwaysループから外のモジュールを制御するのは、例のリクエスト/ビジーフラグ方式が必要で、処理が複雑になり、しかもどうやっても1クロックづつ遅れる。

 それでも、段々形になっていくと、もっと良い方法がないかと夢中になる。最後の方では仕事の帰りのバスの中で急に思いついて、忘れないよう手帳を取り出してメモをとるくらいまで熱中した。最初、20近くあったステートは、最終的には6つまで減らすことが出来た。

S_a4202843

 要するに、ステートマシンでの1ステートは、プロセッサーの命令ひとつと割り切って汎用性を考えず、泥臭く重ねるしかないようである。FPGA内にわざわざリソースを使ってCPUコアが作られ、使われている理由がわかる気がしてきた。確かに複雑なステートマシンは本人以外のデバッグがとんでもなく難しいものになりそうだ。

 ステートマシンの詳細設計がほぼ出来た。まだ擬似コーディングのレベルだが、何回か検証して動く自信が出てきた。負けず嫌いなので、出来上がってからウェブでみんながどうしているか調べる。よーし、同じようなことをしているようだ。知らないときより記事の理解が早い。やっぱり自分で苦労するのとしないのでは大違いだ。さあ、次はメモリの実装である。

ハンダ付けをしようとしてFPGAのピンが足らないのに気づく(4/18/2010)
 最初に、17本のアドレス線をハンダ付けする。SRAMの固定は迷ったが、直接ベース基板にハンダ付けした。ピンアサインを確かめる。うーむ、分散していて接続線を同じ長さにすることは難しい。クロックは今のところオリジナルの33Mhzで動かすので少々長さが違ってもまだ大丈夫なはずだが心配になってきた。

 計算してみる。光(電気)の速さは、毎秒3×10**8m(10の8乗)、SRAMの最小アクセス10nsは、クロックが100Mhzということで、100×**6ヘルツ。そうか1クロック3mもある。配線長が問題になるのはギガヘルツ以上でこの程度ではまだ全く問題ないようだ。安心した。

S_a4202846

 配線が10本以上になる時は、アートワークをした方が良い。単にピンとピンをつなぐだけだが、ピッチ変換基板は2段に分かれており、前に偉い目にあったことがある(Mega128 のSDカード付き基板 08/09/09)。用心してアートワークから始める。アドレスは17本でデータは16本である。このピンアサインをしていて重大な誤りに気づく。SRAMの制御線のことを全く忘れていた。半田付けする段階で気づくというのも、お粗末な話だが、このあいだアドレスを一本減らして何とか詰め込んだFPGAのピンが2本以上また足らなくなってしまった。

 チップイネーブルとか書き込みイネーブルなどの制御ラインである。SRAMの制御は色々なやり方があって、データシートには3種類を越えるタイミングチャートが出ている。絶対必要なのは、読み書きを区別する書き込みイネーブル(*WE、*は負論理)だけではあるが、それでも1本足らない。

 色々考えたが、ピンをうかせるため、データを8ビットにして、512KBのメモリの半分だけを使うことにする。QVGAの16ビットカラーのフレームサイズは154KBなので、半分の256KBでも大丈夫だし、今のテストフェーズでは、16ビットのデータハンドリングはかえって面倒だ。アドレス線を当初より1本増やす必要があるが、データ線の8本が浮くので残りを制御線にまわせる。前に美しくないと言っていたやりかただが、背に腹は代えられない。

SRAMのピン位置を間違えていた(4/22/2010)
 SRAMとFPGAとの配線はすべて終了した。UEW線は交差させないという当研究所のルールは守れそうにない。電源ライン、データライン、アドレスラインが派手に交叉する。50Mhzを越えると汎用基板では不安定になるというWeb情報もあるが、今さらもう遅い。動かしてみるしかない。まあクロックは33Mhzでも十分余裕があるのでこの程度なら何とか動くだろう。基本的には私は超楽観主義者である。

S_a4202847

 制御線は、何を採用するか迷った。SRAMのデータシートをもういちど丹念に読み直す。read/writeともいくつもの方法があり、どれにするか迷う。*OE(Output Enable)というのがどうも理解できない。Highのままでも書き込みができるようなのだが、真理値表では*WE(Write Enable)がL、つまり書き込みのところでは、*OEはX(不定)となっていて何のためにあるピンかよく分からない。

 結局、ピンは余っているが、一番オーソドックスな方法に見えるアクセスの度に、*CE(Chip Enable)を下げ、*WEを読み込みのときHigh、書き込みのときにLowにする制御でコーディングをすることにする。

 ハードの準備は全て終わった。あとはVerilogHDLのコーディングを残すだけとなった。しかし、実は前から気になっていることがある。それはCY7C1041DのSRAMの第一ピンの位置である。普通、ICチップの1ピンの位置はチップの上に刻印などのマークがあってすぐ分かるようになっているが、写真にあるように、このチップは、ちょっと目にすぐわかる大きめの丸印と、よく見ないと見えない、小さな刻印が対角線上についている。

S_a4222867

 最初、小さい方の刻印を見落としていて、大きい丸印を1ピン側とみて気楽にピッチ変換基板にハンダ付けしたのだが、どうも違うような気がしてきた。このチップはVccとグランドピンがピン列のちょうど中間に2組出ていて、それぞれがたすきがけになっており、逆差しをしても致命的なことにならないようにはなっているが、間違えれば当然全く動かない。

 データシートの外見図には、型番などの表記はなく、1ピンの小さな丸印の絵が右上の大きめの丸の位置についているだけで、小さな丸の表示はない。外見図の位置からすると、大きな丸が1ピンのマークのようにも見えるが、どうもおかしい。

 Webにあたってみるが、個別のチップについては全くヒットしない。しかし一般的な話では、丸の刻印が3つもあるICチップの1ピンの見分け方の説明があって、大きい丸印はモールドを流し込む時の射出孔の跡らしく、小さい方が1ピンマークだという。どうも、このチップも小さい刻印の方が1ピンのマークのように思えてきた。

 逆さまにつけてしまったようだ。表面実装ICのとりはずしは、サンハヤトの特殊ハンダ入手以来、そう難しくはなくなったが、それでも一大決心がいる。はずしたけれど、やっぱり元のままで良かったなどという悲劇は避けたいので、さらに調べる。

 解決は意外なところにころがっていた。当研究所では、パーツは常に予備と確認のため複数買うことにしている。予備のSRAMを取り出して調べてみた。すると裏には大きめの丸印2つと、小さな丸印があり、この小さな丸印の位置が表側の小さな丸印と一致したのである。うん、間違いない。小さい方が1ピンのマークだ。いやあ、良かった。これで確信を持ってチップを外せる。

 何回目かのSMD(表面実装チップ)のとりはずしは、順調に行った。少し大きめ(30W)のハンダごてで、低温ハンダを両側に流し、半田ごてを往復させると、またたくま(3秒くらいか)に、チップが、ずるっと浮いてくる。このハンダがなかったころ、細い銅線を使って苦労してはずしていたことを考えれば、うそのような簡単さだ。\4000以上するが悔しいけれど実に強力である。

 ハンダ吸い取り線で低温ハンダを念入りにとり、洗浄剤で綺麗にして、もういちどSRAMをハンダ付けする。よしうまくついた。これでハードの心配はすべて解消した。いよいよ残るは、コーディングである。

| | コメント (4) | トラックバック (0)

« 2010年4月11日 - 2010年4月17日 | トップページ | 2010年4月25日 - 2010年5月1日 »