« FPGAのUARTで7セグLEDを動かすことに成功 | トップページ | 外付けSRAMを制御するFPGAのピンが足らない »

2010年4月13日 (火)

外付けSRAMをFPGAにつなぐ

 FPGAビデオインターフェースプロジェクトは、次の第二ステップに進んだ。外付けSRAMをVRAM(Video RAM、ビデオバッファー)にする工程である。昔々、ワンチップコンピューターといえばZ80、8080だった時代、RAMをCPUにつけようと色々準備しながら結局挫折したことを思い出す。そう、あのころのマイコンは自分のメモリですらすべて外付けで回路を組まないと動いてくれなかった。良い時代になったものである。

 感慨にふけりながら作業を進める。偉そうなことを言ってはいるがメモリの実装は当研究所では始めての経験である。経験者にとっては何を今さらというところだろうが、近頃、電子工作をマイコンで始めた人にとっては知らないことが多いのではないだろうか。なるべく基本的なところも省略せず書いていくことにする。

0.5ミリピッチと、0.8ミリピッチの表面実装ICハンダ付け(4/5/2010)
 雨の中、久しぶりに秋葉原に寄り、秋月電子で在庫が復活した4メガビット高速SRAM、CY7C1041DV33(\500)と、ロームの8ビットビデオDAC、BU3616K(\300)を入手した。アイテムラボからは、それぞれ変換基板が届いている。

 どちらも0.8ミリピッチなのでハンダ付けはそう難しくない。ついでなので一緒に買ったあった0.5ミリピッチの変換基板のハンダ付けを腕試しに最初に挑戦してみた。これは以前の雑誌付録のARM基板、LPC2388のイーサネットインターフェースのためにDigiKeyで買ったあったPHY層トランシーバーのDP83483である。0.5ミリピッチのQFP48だ。

 小ピッチの表面実装部品のハンダ付けは最初はとても出来ないと敬遠していたが、慣れてしまえばそう難しいものではない。拡大鏡は必須だが、要は、うっかりすると出来るハンダブリッジは気にしないことである。それとハンダはなるべく少ない方が良い。基板のパッドは必ず薄くハンダメッキをしておき、ブリッジしたら、フラックスを塗ってハンダ吸い取り線を使えば解消する。余り綺麗とはいえないが0.5ミリでも問題なくつけられた。20倍ルーペで確認する。

A4122834

 次は本番の4メガビットSRAMの0.8ミリ44ピン。これが結構難儀した。ハンダが多すぎてピン上部までハンダが表面張力で上がると、ハンダブリッジが中々解消できない。それに片側22ピンもあるとどうしてもハンダが均等に流れず、ハンダがついていないところが出てきたりしてルーペで確認しないと危ない。

 アイテムラボで大量購入したピンポスト(これは安価で便利)を立てて、SRAMはめでたく汎用基板に実装可能となった。しかし実際にどこにつけるかで迷う。基板にハンダ付けしてしまうと移動できないし、基板そのものの全体レイアウトが決まっていないので場所も確定できない。

 全体のレイアウトを決めようと、必要なピン数を数えていて愕然となる。雑誌付録基板についているFPGA、Spartan3EのXC3S250Eは一番ピン数の少ないモデルで、I/Oピンは66ヶしかなく、ユーザーが自由に使えるピンは、回路図を見ると51本しか出ていない。SRAMのアクセスや、デジタルRGBのピンを数えていくと全く余裕がない。

 SRAMは、アドレス18本(512KBを2バイト単位でアクセス)、データ16本で34、ビデオは、RGB 5×3の15とV,H同期信号2で17、これにSPI 3を足すと、ありゃりゃあ、54本だ。3本も足らない。

 アドレスは、512Kも使わないので一本減らせるが(QVGA16ビットカラーで154KB)、それでも53、メモリアクセスを8ビット単位にすれば8ピン浮くが操作が面倒だ。アドレスを18本使って8ビット半分だけを使う手もあるが余り美しくない。あれこれ悩む。

 もう一度、基板の回路図をしらみつぶしに探す。するとinput onlyというピンが4本あり、これが使えそうだ。SPIの受信と同期信号は入力なので、この2つを、このピンにアサインすると、51プラス2で何とか入りそうだ。ほっと胸をなでおろす。

SRAMのアクセスはあっけないほど簡単だが(4/7/2010)
 秋月で買った4メガビットSRAM、CY7C1041DV33である。付属資料は1枚ペラの簡単なスペックしかないので、正式なデータシートをWebから落としてアクセス方法を調査する。

Ws000001

SRAMのアクセスは気が抜けるくらい簡単な方法でデータが読み書きできることがわかった。

 所定のアドレスを設定すれば、少し遅れてデータバスにデータが出現し、書き込みは、WriteEnableピンを下げる(負論理なので)だけである。これらのデータが有効になる最小時間がそれぞれ10nsということで、有効になっても何かトリガーがあるわけではなく、長い方には制限がない。かえって回路をどう組むか迷ってしまうくらいだ。

 ただ、VRAMではアクセス以外にもっと大きな問題がある。読み書きをほぼ同時に行わないといけないということである。今度のプロジェクトの当面のゴールは静止画で、動画ではないのでそうシビアではないが、データを読んでいるとき画面が真っ暗になるのはみっともないし、将来の動画を視野に入れれば、ぜひ実現しておきたいところだ。

Ws000000

 しかし、今度のSRAMはデュアルポート(双方向だと独立して動ける)ではないので、同時に読み書きする(プロセッサーからのデータ書き込みとビデオインターフェースへの読み出し)ロジックは自分で作らなければいけない。

 このあたりになると、入門レベルを超えているのでWebには適当な回路やロジックはころがっていない。自己流でステートマシンっぽいロジックを作っていくが、これでうまく動くのか全然自信がない。本来なら、どこかの既存のライブラリや、ソースコードを使うべきなのだろうが、へそ曲がりの負けず嫌いときているので、意地になって自分で考える。

 タイミングチャートを作りながら、様々に検討する。それと、同じデータラインで入力と出力を同時に実現する、VerilogHDLのinoutというインターフェースのコーディングが良く分からない。これもWebを先生に色々当たる。まあこのあたりの苦労も面白い。そもそもこの苦労を面白いと思わなければ、こんなことはやっていられないのかもしれない。

 2日間ほど、あーでもない、こーでもないとやった結果、何とか断片的だが、inoutを実現するVerilogHDLソースコードが見つかった。SRAMではないがinoutポートを双方向で読み書きするモジュールだ。

 双方向のポイントは、ポートを出力にしないときは、トライステート(1、0、ハイインピーダンス)のハイインピーダンスにするところだろう。inoutにしたポートをBUSSとすると、データ書き込みでないときは、assign文で、

 assign BUSS =(データ書き込みのとき)?書き込みたいデータ : Hiz ;

とポートをハイインピーダンスにしておく。こうすると入力のときは、BUSSにあらわれたデータを読むことができる(入力ポートになる)。

 クロックは今のところ30ns(33Mhz)なのでアドレスを決めれば次のクロックサイクルでデータ移動できる。何といっても10nsの高速だ。待ち時間(レイテンシーは1ということ)を入れる必要はない。送受信の調停(アービトレーション)は、送信を優先して(画面送出)、受信(プロセッサーからの更新データ)を待たせる。

 ということでまだコーディングまで行かないが、ロジックレベルでは見通しがついた。何とかなりそうである。残るは、これを検証するテストベンチを作ることである。そろそろ全体のデータの流れを考えながら機能の開発をしていかないと効率が悪い。 

 SPIインターフェースはプロセッサー側がマスター(送信)でFPGAはスレーブ(受信)なので、FPGAのSRAM書き込みにあわせてデータを貰うことはできない。大した大きさにはならないがFIFO(バッファー)をつける必要があるだろう。

本格的なステートマシンの設計とシミュレーターの導入(4/12/2010)

 ステートマシンの設計に入る。今度のテストベンチは、少し本格的なステートマシンになりそうだ。色々資料をあたる。うむ、これはマルチタスクの設計と同じだ。沢山の自律して動くサブモジュール(マルチタスク)を相手に、メインモジュールがリクエストフラグを出して、スタートさせ、サブモジュールからの作業終了フラグ(ビジーフラグ)を待って、同期させながら次の処理へ進む。前に勉強したリクエスト/ビジーフラグで動く方式とはこのことだったのだ。

 興に乗ってUARTモニターのしかけを考え出していると際限がなくなってきた。どうせなら汎用的な仕様にして、後のFPGAの開発にも応用しようと欲張ったものだから、話がどんどんふくらんでなかなか仕様がまとまらない。SRAMの同時アクセスを検証するルーチンをUARTを使って端末にデータを表示しながら作ろうと、あれこれ考えたが複雑になりすぎて手に負えない(画面をスクロールせずに同一行で激しく表示させ、キー入力で変更する機能など)。

 2日ほど考えて諦める。こういうときは基本に戻るのが一番だ。やりたいことを決めて、そこへ資源を集中しないと発散してしまう。こればっかりやっているわけにはいかない。

結局、第二ステップで実現しようという仕様は次のようなものとなった。

・UARTから入力を受け付け、SRAMにデータを溜めると同時にエコーバックする。

・リターンキーをトリガーに、溜めてあったデータを最初から、UARTに最後まで出力する。

・このままでは同時アクセスの検証ができないので、7セグLEDに入力文字を常時表示させ、UARTの入力文字に応じて、表示が変わるようにする。高速は望めないが、少なくとも双方向アクセスの検証にはなる。

 あれこれ道草していたが、やっとのことで第二ステップの作業工程が出来た。UARTを使ってもっとFPGAを自由に操作したいが、それは先の楽しみに取っておこう。しかし、高速同時アクセスの検証は上記機能だけでは安心できない。何かで確認しておかないとあとで構成が複雑になった時に心配である。

 そこで、思いついたのが、シミュレーションである。FPGAの入門ページには沢山シミュレーションの例が紹介されている。装備を余り重くしたくなかったので、今まで横目で見るだけで我慢していたが、そろそろ入れる時期だ。

 Webの情報を元に、無償版のModelsim Xilinxを入れることにする。久しぶりにログオンしたXilinxのサイトからModelSim Xilinx Edition IIIという無償版を案内されるままダウンロードした。超弩級のISEなどに較べれば、こいつは200MBばかりの小さなファイルだ。ライセンスキーをメール経由で入手して無事立ち上げに成功した。            

早速、これまでの7セグの練習プログラムを試してみる。道案内は例によって先人のWebを参考にさせてもらった。
http://homepage3.nifty.com/alpha-1/computer/ModelSimXEIII6_J.html
 ここはインストールまでの手順を丁寧に紹介してくれている。おすすめ。
http://souyuu.net/article.php?story=20100320140542168
 ダイジェスト版で一覧するのには良い
http://homepage1.nifty.com/x6/tool/modelsim.htm
 旧バージョンだがここは操作法が詳しい。

 画面が出た。シミュレーションを開始する。おやあ、全く動きがない。それはそうだ。クロックもリセットも入っていない。さきほどのWebの案内は、インストールまでは懇切丁寧だが、肝腎の使い方について殆ど説明がない。正式の英語マニュアルも落としたが、コマンドベースの説明だけでGUIの説明が見当たらない。

Modelsim

 あてずっぽうで、やっとクロックを出すところまで行ったが、リセットを出すところでギブアップした。データを動かすforceのコマンドが言うことを聞かない。いやいや、このシミュレーターだけでも知らなければならないことが膨大にある。まあ、動いただけでも良しとしよう。先はまだ長い。

|

« FPGAのUARTで7セグLEDを動かすことに成功 | トップページ | 外付けSRAMを制御するFPGAのピンが足らない »

FPGA」カテゴリの記事

コメント

コメントを書く



(ウェブ上には掲載しません)


コメントは記事投稿者が公開するまで表示されません。



トラックバック


この記事へのトラックバック一覧です: 外付けSRAMをFPGAにつなぐ:

« FPGAのUARTで7セグLEDを動かすことに成功 | トップページ | 外付けSRAMを制御するFPGAのピンが足らない »