« 2010年2月 | トップページ | 2010年4月 »

2010年3月の3件の記事

2010年3月29日 (月)

FPGAで7セグLEDのカウンターがやっと動く

7セグLEDが点灯した(3/26/10)
 VerilogHDLで書いた自前の7セグLED表示回路にタクトスイッチの回路を組み込む。生意気にシステムクロックを使ったチャタリング防止回路を入れる。always節の中の処理は順序処理なのでソフト屋にはコーディングしやすい。

 ただサブモジュール間のデータの受け渡しは、まだ完全に理解できていない。手探りである。基本は、regでデータを作り、ネット(wire)で受けるというのだが、サブモジュール間のデータの受け渡しのとき、メインモジュールに変数を定義しておかなくてもよいのか、サブモジュールでwireで受けた変数をそのまま変化させてよいのか、まだ確信がない。エラーになったところは、適当に定義をいじってNo Errorにするという対症療法でしのぐ。

 やっとのことで、タクトスイッチを押すと、その回数を99まで数えて7セグLEDに表示する練習課題のソースが論理合成でNo Errorとなった。次は、いよいよピンアサインである。おっと、まだFPGA基板の配線をすましていない。バラックでも良いが、デバッグに専念したいので、ベース基板にテスト用のソケットをつけてFPGA基板とLED基板の間を接続することにする。

 これが結構、時間がかかる。たかが10数本の配線だが、ピンアサインを良い加減にするとあとでひどいことになるので、なるべく元の基板の配置と同じで、しかも流用したストレートの電光掲示板のコネクターが入るようにピンアサインを決めようと苦心する。 7セグのエレメントの接続も気を抜いてハンダ付けするとすぐ間違える。メモをとり何度もテスターで導通を確かめながらの作業だ。2列20ピンのソケットは印をつけておかないとすぐ間違える。

A3292782

 基板のハンダ付けも終わった。今度こそピンアサインだ。雑誌記事の基板回路図を何度も確認しながら慎重にピン配置の.ucfファイルを作る。 Xilinxの開発環境ISEは操作性に問題があり余り評判が良くないが、このピン配置を決めるucfファイルの編集もやりにくい。

 一旦作ったucfファイルはUser Constraints(ユーザー制約定義)のGUI画面では編集できない。知らずに入力すると新たな制約定義を追記してしまう(ISE 10.1 )。編集はucfファイルをテキストエディターで開いて修正しないといけない(追記:GUIメニューにPre-SynthesisとPost-Synthesisの2つがあり、後者で修正が出来ることがわかった)。

 まあ、この開発環境はすべて無料なので(登録が必要だが)余り文句は言えない。しかし、これは統合環境というより、それぞれが別の仕事をするバッチジョブのランチャーに近い。ではバッチジョブとして独立しているかと思うと、沢山の中間ファイルが相互のジョブの途中経過を引き継いでいるので油断がならない。うまく行っているときは良いが、どこかのステップを失敗すると、とたんにご機嫌を損ねて先に進んでくれない。

 このときも二重に追記されたucfファイルを消したのだが、これに関係する内部ファイルが残っていて、新規にucfファイルを作っても同じエラーを吐いて動かない。結局、一旦そのプロジェクトをご破算にし、ソースコードだけ取り出して新しくプロジェクトを作り直したら先に進んだ(Clear Projectというのをやれば良いらしい)。

 ピンアサインが無事終わった。しかしFPGAを動かすまでの道は遠い。このあともまだたくさん手順がある。付録基板の号には詳しい手順が出ているのでもう一度おさらいし、慎重に進める。以前に1回通したというのが自信になっている(2008/8/8「FPGAでLEDピコピコ」記事)。幸い、Imprement Design(これがコンパイルにあたる)、Generate Programing File(実行可能ファイルを作る。リンカーか)は順調に終わった。

 残るは問題のiMPACTを使ったファーム書き込み(コンフィギュレーション)である。「鬼のように使いにくい」「難解きわまる」とWebで評判(?)のライターである。前回は、コンフィギュレーションROMをバイパスする手順を抜かして大はまりした。

Impact

 手順どおりiMPACTを始動させる。この始動方法にも色々な方法があるようで、おっかなびっくりである。ROMとFPGAのアイコンが出るConfigurationの画面が出た。手順どおりProgramの矢印アイコンをダブルクリックして書き込みを開始する。おお、順調のようだ。やった、やった、ブルーのSucceeded(出来たよ)のメッセージが出た。7セグLEDが点灯した。

 良かった。とりあえずはLEDが点いた。見ると、4つのLEDとも同じ形で激しく点滅しているだけだが、全くの無反応ではない。少なくとも暴走もせず(FPGAは暴走しないか)、何か動いている。タクトスイッチを押してみる。うん、何か変わった。数字にはなっていないが2番目の桁の形が変わったようだ。よーし、一歩前進したぞ。達成感で体が軽い。

A3272773

FPGAのデバッグは確かに大変だ(3/27/10)
 最初のFPGA自作プログラムは、無茶苦茶な点滅だけれど、とりあえず目的の7セグLEDを光らせることには成功した。次はデバッグである。全くの黙(だんま)りと違って何か動いている。手がかりは十分だ。

 激しく点滅するというのはダイナミック点灯の時間間隔が長すぎるからだろう。テレビのフレーム1/60秒に合わせて20msにしたが遅すぎるようだ。LEDが文字になっていないのはエレメントのアサインがおかしいからに違いない。

 LEDのピンアサインとソースコードをもういちど照合する。ああ、わかった。7セグ以外のエレメント、ドットポイントの位置を間違えている。ucfファイルでピンアサインを変える。ダイナミック点灯の間隔を1/10の2msに変更し、また最初の論理合成から始まる5つのステップを実行する。

 予想通り点滅は止まった。しかしまだ文字にならない。それにタクトスイッチを押して変わるLEDが一番右の桁にならない。ここも間違えているか。もういちどピンアサインを確認する。おやビットの定義がこれまでと違う。A[0] 、A[1]、A[2]はMSB(左から)からじゃないのか。そうなのだ。ここの配列はLSB(右)から数えるらしい。

 アサインを逆にして、やっと7セグLEDに数字が戻った。タクトスイッチを押すと数字が変わる。しかし、1づつ増えていかない。それに桁の位置がおかしい。うーむ、今日はこれくらいにしておこう。

同時に動くという仕組みを少し理解する(3/28/10)
 FPGAのデバッグは難しい。考えてみたらロジアナでは内部変数を外から見ることが出来ない。シミュレーターを入れれば良いのだろうが、そう簡単には入らない。それに7セグLEDくらいのアプリケーションで余りおおげさにしたくないという気持ちもある。まずは冷静になって最初からHDLコードを調べ直すことにする。

数字が大きく変わる不具合は新しく入れたスイッチのロジックが怪しい。スイッチがONになった直後、ただちにフラグをあげて、それ以上カウンターが動かないようにしているが、そのフラグが効いていないように見える。すると気になるところが見つかった。

if(A)       //begin endは文が単文のときは省略できるので
  if(B) begin     //この文は単文
    C;             //
    D;             //
  end             //
else begin  //このelseはif(A)のelseのつもり
  E;
  F;
end

Aが成立してBが成立すれば、CとD、そうでなければ何もしない。Aが成立しなければEとFを実行するという文だ。beginとendは複文の時だけ必要で単文のときはいらないので省略してあるが、よーく見ると、次のif(A)のつもりのelseは、字下げはしてあっても、if(B)の方のelseになってしまっている。

あーこれだ、これだ。昔々PASCALに凝っていた頃、さんざんやったミスだ。ここは面倒でも

if(A)  begin   //単文でもelseを取り違えないために必要   
   if(B) begin
     C;            
     D;          
   end
end                 //面倒だが、このbegin endがいる         
else begin  //これでやっとこのelseはif(A)のelseになる
  E;
  F;
end

としなければいけない。数字が大きく増える原因はここにちがいない。あせる気持ちでコンパイルしなおす。長い手順がもどかしい。コンフィギュレーションが出来たので動かしてみる。よーし、数字の増え方がひとつづつになった。

 おやあ、まだ時々1以上増える時があるぞ。うーむ、何故だ。スイッチの押し方で様子が変わる。チャタリング防止が機能していないようだ。どれくらい待っている? 300カウント待って同じならONとしている。待てよ、クロックは33Mhzだ。これでは少なすぎるのではないか。そうだ、10マイクロ秒しか待っていない。単位を間違えていた。千倍の300000(10ms)にしてチャタリングは完全に防止できた。

 表示される桁がおかしいのはもっと深い理由があった。ソフト屋はどうしてもステートメントが表記の順序で実行され、それが終わってから次のステートメントが実行されるという意識が頭から抜けない。always節の中は、順序回路だと言っても、実際の動作はわずかな遅延を伴って同時に処理される。

A3282780

 ダイナミック点灯のデータの指示をしたあと点灯する位置をシフトしているが、実際に点灯の処理がすんでからシフトが行われる保証はない。回路の具合で点灯する前に表示桁が移動するかもしれない。桁のずれがシフトの方向にずれているのが何よりの証拠だ。

 これは、シフトをブロッキング代入で最初にやり、点灯のデータの指示をノンブロッキング代入(always節の最後で一括変更)すれば解決するはずだ。ソースを組みなおす。これで遂に7セグLEDは正しい桁で数字が表示された。

 いやいや、良い勉強になった。参考書や雑誌に書いてあるブロッキング代入とノンブロッキング代入の違いをデバッグを通して肌で理解することができた。だいぶコーディングに自信がついてきた。次はUARTだ。

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

2010年3月25日 (木)

FPGAの言語の習得で最初からつまづく

 行事の連続が終わって、やっと電子工作に専念する時間が出来た。前の記事では勇ましくFPGAのプロジェクト計画をぶちあげたが、その後は一向に進んでいない。モチベーションが下がったわけではない。初っ端のステップであるハードウエア記述言語(以下HDL)の習得にえらく手間取っているのだ。

 VHDLも、VerilogHDLも、CやPASCAL(begin endでくくる。;がないところがある)言語にそっくりなので、HDLの習得は簡単だろうと考えていた。雑誌のソースコードを読んでいても何をしているかおおよその見当がつく。ところがいざ、実際にスクラッチからコードを書き始めると、そんな甘いものではないことを思い知らされた。

 雑誌や参考書のソースリストをそのまま忠実に書き移せば動くのだろうが、こちらは言語の習得が目的なので、少し欲張って自分でロジックを考え、自前の回路を作って動かそうとしている。7セグLEDを表示装置、UARTを入力にし、キーボードからのリターンキーの回数を数える4桁のカウンターを作ろうというのが、練習問題の課題である。

 考えてみれば、今まで順序処理に慣れてきた計算機屋が、形は似ていても同時処理の多いハードを作る回路屋の言語をマスターしようというのだから、一筋縄で行くわけがない。悪戦苦闘の連続で、簡単な回路の論理合成がいまだに通らない。日暮れて道遠しというところである。

7セグLEDを買ってきた(3/14/10)

 FPGAの演習問題につA3252763かう表示ディバイスは7セグLEDである。名古屋で行われた全国集会の旅行前に既に買ってあった。神田で安売り切符を買ったついでに秋葉に立ち寄って、秋月で緑の7セグLEDを調達した。いまさら7セグLEDなんかと偉そうに言っていたが、恥ずかしながら当研究所では始めてのディバイスである。

 カソードコモンかアノードコモンかで迷う。前にLEDマトリックスを使った電光掲示板を作ったとき余分に買ってあったトランジスタアレイ(TD62083)をコモン側につけるつもりなので、これを間違えると別のトランジスタアレイを揃えないといけない。

 前の電光掲示板の回路図を探したが見つからない。秋葉原に行く途中で必死に思い出し、うろ覚えでカソードコモンを指定して買ってきた。家に帰り恐る恐るトランジスタアレイ(TD62083)のデータシートを取り出した。良かった。あたっていた。NPNトランジスタなのでシンクドライバーとなりカソードコモンで良いのだ。

 旅行から戻って行事も一段落したので、ぼちぼち7セグLEDの基板を作り始めた。久しぶりのUEW線のハンダ付けである。4桁にしたのは特に理由はない。時計あたりにするなら、時分秒で6つ欲しいところだが、演習問題には多すぎるので4つに減らした。それでも、4つのLEDの8つのセグメント(ドット発光に+1)を並列につけるだけでも結構手間がかかる。

 コモン側は定石どおりトランジスタアレイでドライブする。ひとつひとつのLEDは数mAだが、まとまれば数十mAになりFPGAの1ピンには過大になることを考慮した。

 こいつも最初動かなかった。単独では問題ないのに、トランジスタアレイを通すと動かない。やれやれ何処が悪いのだ。ありゃあー、トランジスタアレイのTopViewとBottmViewを間違えている。ドライブ側と出力がちょうど逆だ。久しぶりにハンダ付けするとこれだ。仕方がない。ICそのものをソケットの印を無視して逆ざしし、帳尻をあわせる(8本×2の16ヶもハンダ付けをしなおすのは大変だ)。

 コネクターは前の電光掲示板のケーブルを流用し、ブレッドボードでテストする。うむ、問題なく動いた。しかし少し暗い。考えてみればFPGAのVccは3.3Vだ。5Vを想定した330オームの制限抵抗が大きすぎたようだ。まあ、大勢に影響はない。先に進もう。

へそ曲がりな勉強法(3/17/10)
 ハードの準備が出来たので、いよいよHDLの勉強に入る。VHDLかVerilogHDLか最後まで迷ったが、とりあえずコード量の少ないVerilogHDLに決める。これまでにFPGAに関する特集の雑誌が貯まっている。

 ざっと挙げて見ると、古いものから、

(イ)デザインウエーブマガジン 2007年7月号 付属FPGA基板を使った回路設計
  FPGA基板が付録になった号で、Xilinxの開発環境のインストールと使い方の解説が主で、応用回路も高度なものが多く、HDLの勉強には役に立たない。

(ロ)  同     2007年8月号 FPGA基板で始める画像処理回路入門
  画像処理に付録基板を使うときの解説。映像信号を作るときに参考になるが入門にはならない

(ハ)  同     2008年7月号 動画像をメモリーカードに記録する技術
  画像処理回路とSDカードアクセスのVHDLの一部の紹介があるがこれも入門レベルでない。

(ニ)  同     2008年10月号 CPLD/FPGA活用回路&サンプル記述集
  10以上のアプリケーションのVHDLやVerilogHDLのサンプルソースがある。7セグLEDのドライバーもあり、当面これが役に立ちそう。

(ホトランジスタ技術 2009年3月号 手軽にはじめるFPGA
  手軽という割にはある程度のレベル以上のハードエンジニア向けの内容で、FPGAの内部の解説や高度な応用の紹介でソースコードは殆どない。

(へ)インターフェース 2009年9月号 ソフトウエア技術者のためのFPGA入門
  ソフトウエア技術者向けというだけあって、VHDLとVerilogHDLのコードを並べたサンプルコードがあったり、ステートマシンの解説があったりして有用。

これ以外に、Latticeの基板が付録についた季刊の
(ト)デジタルデザインテクノロジー 1号(2009年春) FPGA超入門   
(チ)   同                 2号(2009年夏) HDL設計超入門

の2冊もあり、合わせると何と8冊のFPGA特集号が揃った。

 これだけ沢山情報があっても、結論から言えば、コーディングに役に立ったのは、(ニ)の7セグLEDをダイナミックドライブするVHDLのソースコードと、(へ)の7セグLEDのVerilogHDLのコードだけであった。

 何か適当な入門書を買って来て、最初から素直にやるのが結局は一番早道なのだろうが、このやりかたは昔からである。もともと入門書に書いてある通り何かを習得していくというのが嫌いなのだ。へそ曲がりで人の言うことに唯々諾々とついていくのに我慢できない。マニュアルも最初から読んだことがない。

 年をとったのでなおさらその傾向が強まっている。それとこの世界に40年つきあっている。つまみ食いで何とかなるという横着な気持ちもある。さらに今まで一冊の入門書だけでマスターできたものはひとつもないという経験も加勢している。これが吉と出るか、凶と出るか。

A3252772

論理合成が通らない(3/23/10)
 まずブロックダイアグラムを描き、お手本どおり入出力を決める。おお、これは擬似コーディングと同じではないか。典型的なトップダウン設計だ。UARTはサンプルコードがあるし、今度の演習問題では、エコーバックさせるだけなのでバッファーも考える必要がない。7セグLEDも沢山サンプルがあるので、必要な信号線も決めやすい。

 順調にブロックダイアグラムが出来た。快調だ。いそいそとXilinxの開発環境ISEを立ち上げて、コーディングを開始する。VerilogHDLでソースを書き始めた。今後のことを考えて、ひとつのモジュールに全部を書き込むのではなく、機能ごとにモジュールを分け、サブモジュールにする。

 このあたりから、開発のスピードが落ち始めた。サブモジュールの呼び出しが今までの感覚と違う。何かおかしいのである。まず、サブモジュールを呼び出す順番がわからない。色々調べているうち、はたと気づいた。これは論理回路の記述なのでモジュールにわけても動作は同時なのだ。順番は関係ない。それとwireとregの区別がつかない。functionとmoduleの区別が分からない。assignの意味が分からない。段々不安になってきた。

 どうも自信がなくなってきたので、UARTの実装の前に、7セグLEDのところだけ動かしてみることにことにした。UARTのモジュールはダミーにして、とりあえずXSTで論理合成(synthesize、コンパイルと同じ)をしてみる。

 予感は当たって、膨大なエラーに見舞われる。単にトップモジュールを作り、4ビットのBCDデータから7セグLEDのエレメントにデコードするサブモジュール、それに入力のバイナリから4つの7セグLEDをダイナミックドライブするサブモジュールだけなのだが、殆どのデータの受け渡しでエラーが出ている。

 Webの情報を頼りに少しづつエラーを減らしていく。データの受け渡しはreg変数だと思っていたが、wireでないと通らないところがある。regはフリップフロップ、wireは単なる接続と習った。どちらでも良いような気がするが良く分からない。遅延の関係かもしれないが、今は調べている暇はない。

言われるまま直して行って、データの受け渡しでエラーはなくなった。しかし次のエラーでは参った。

Operator <DIVIDE> must have constant operands or first operand must be power of 2

 何い、HDLでは除算は2のべき乗でしか割れないのか。そんなこと聞いたことがないぞ。16ビットのバイナリカウンターを作り、UARTからの入力をカウントアップしていく。7セグLEDに9999まで表示させるため、バイナリーの各桁の10進数をだすのに、1000や100で割り、余りを計算しているところだ。

 そんな馬鹿な。あわててWebに助けを求める。ほんとだ。これはHDLの仕様のようだ。対処法を考える。除算ができなければ、引き算を繰り返せばよい。HDLにはwhileもforループもある。気楽にwhileループを作り、回数を商にして回路を組み直した。

 おやあ、論理合成(コンパイル)が終わらない。延々と解析を続ける。何がおかしいのだろう。いつまで待っても終わらないので、解析の中止ボタンを押す。それでも終わらない。何回か押して、やっと止まった。しかし、動作が重い。おかしいのでタスクマネージャーを立ち上げてみたらCPUの使用率は100%になったままだ。いけないISEが暴走している。ISEを終了させる。しかし状態は変わらない。結局、Windowsを再起動させられる羽目になった。

 何だ、何だ。これはどうしたことだ。原因は分からないが、新しく加えたwhileループで論理合成が暴走したことに間違いはない。とにかく組み合わせ回路でwhileループが使えないことだけは確かだ。whileループの部分をコメントアウトして元へ戻す。

 ISEの暴走は止まった。しかし、今度は、別のエラーで論理合成が止まる。何だと、「致命的エラー」(fatal error)だというではないか。

"FATAL_ERROR: SEG7DRVR:Port_Main.h:143:1.13.2.3 - This application has discovered an exceptional condition from which it cannot recover. Process will terminate. ...........

 始めは大げさなメッセージなので驚いたが、Web情報によれば、ちょっとした記述ミスでもこの種のエラーは出るらしい。少しづつステートメントを減らして様子を見る。 しかし、なかなかエラーがとれない。

 遂に、あるassignステートメントをとると。論理合成(Synthesize)がNo Errorとなることがわかった。別に難しいことをしているわけではない。reg変数を初期化しているだけである。initialブロックの中で、assignは使ってはいけないようだ。よく分からない。変数宣言でも初期化は出来るのでこのステートメントはなくてもかまわない。

 やっとのことで最初のHDLの論理合成が終了した。No Errorとなると、FPGA内のリソースの使用状況などの壮大な結果リストが表示される。わからないまま、画面のレポートを見ていくと、ちゃんとした回路図まで出てくる。すごい。何か壮大な仕事をやりとげた気分になる。

Ws000000

 しかし、肝腎のバイナリから4桁の10進数になおす部分ははずしたままである。このままではLEDは0しか表示しない。これでは練習にならない。Webをさらに探し回る。すると99までのバイナリーを組み合わせ回路で2桁のBCDに変換するリストが見つかった。100までなら、条件文を20ヶ(10の商と余り)書けばできるようだ。早速使わせてもらう。論理合成する。おお、さすがにこれはNo Errorで入った。

 それにしても、自前のソースをコンパイル(論理合成)するだけでこれだけの騒ぎだ。次のピンアサインをやって動かすことを確認するステップに進む勇気が出てこない。恐らくコードは考えたようには動かないに違いない(書いたようにしか動かない)。動いたとしても今のコードではLEDの表示が動かない。

 カウンターを動かすサブモジュールがまだ出来ていないのだ。このままでは決め打ちした数字しか表示されない。UARTを雑誌のサンプルから入れても良いが、これ以上コード量を増やして検証範囲を広げたくない気持ちもある。 タクトスイッチの入力回路を作ることにする。ひとまず動くのを確認してからブログに報告しようと思っていたが、いつ動くか見当がつかなくなってきた。とりあえずこのあたりで区切りをつけることにする。次回をお楽しみに。

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

2010年3月11日 (木)

FPGAフォトフレーム開発のロードマップ

 例年この時期は忙しい。所属している団体の全国集会(といっても大阪、名古屋だけだが)の幹事の仕事に、確定申告、それに新しいセミナーの講師資料の準備、以前から続けている老人ホームの慰問演奏会、恒例のスキー行などと、数えてみたら2月から3月にかけて7つ以上の行事が重なった。イベントというのは何故か平均的には起きてくれないものらしい。

 そんなことで電子工作にかけられるまとまった時間がとれない。リニアPCMプレーヤーのWindowsMediaPlayer生成WAVファイルの不具合の報告もつれない返事をしてしまった。ChaNさんのところは早速対応されたようなので、いずれはこちらも直さないといけないが(何しろChaNさんのFileSystemを使わせて貰っている)、必須フォーマットデータの間にオプションデータを突っ込んで来るWMPの横着な仕様に対応するのは、正直言ってどうも気が重い。

A3112747

 このブログのアップもほぼ20日ぶりである。このあいだはFPGAでビデオインターフェースを作ると勢い込んでいたが、現実に基板を揃え、実際のブロックダイヤグラムを細かく考え出すと、とてもじゃないが、そう簡単なことでないことが見えてきた。

 だいいち、FPGAに書き込むソース言語について全く経験がない(この前のLEDチカチカは丸写し)。Verilog HDLとVHDLという2つがあることくらいは知っているが、実際にコーディングしたことがない。これだけでも十分乱暴な話である。

 それに、ビデオインターフェースのブロックダイアグラムの各部の機能についておおよその理解はしているものの、これを統合してひとつのインターフェースにするのに何から手をつけていけば良いのか全く見当がつかない。

 BeagleBoardのときは、もともとソースをいじるつもりがなく、パッケージをネットから落としてそのままインストールし、それだけで満足だった。しかし、FPGAではこれをやりたくない。実は、LANによる商用電源の制御(Mega168インターネット開通3/17/08記事)も、最初はTCP/IPをソースレベルでハッキングと張り切っていたのだが、貰ったソースコードが余りにも簡単に動いてしまってそれきりになっている。

 FPGAくらいは徹底的にスクラッチから自分のやりたいことを作って行こう。苦労しないと技術は身につかない。そのためにはやはり簡単なアプリケーションを自分で作って動かしていくのが一番だ。

オペアンプ問題は動作電圧不足というオチ(2/22/10)
 俗事に時間をとられ、頭の中はFPGAに占領され、まとまった電子工作が出来ない日が続いているが、困ったことに何か手を動かしていないと気分が落ち着かない状態になっている。少しでも手が空けば、手は自然にブレッドボードに向かい、細々とした問題解決に励んでいた。

 直前の記事にあげたSDカードプレーヤーのオペアンプの問題は、ブログのアップ直後、またkugaさんのコメントで一気に解決した。何と、オペアンプには最小動作電圧というのがあるというのだ。

  データシートは穴があくまで見よといわれているが、オペアンプのデータシートはアナログの素人にとっては、殆ど理解不能である。最大定格と推奨動作条件くらいは見ていたが、最小動作電圧というのがあるとは知らなかった。慌ててデータシートを確かめる。

  これまでに買ったオペアンプは、LM358、NJM4580DD、NJM2114DD、それにNJM5532の4種類である。最小動作電圧はちゃんとデータシートに出ていた。LM358は単電源3V、4580は±2V。それに対して2114と5532は±3Vである。何、4580だって定格外ではないか。

 ブレッドボードにこのまえの秋月FGのテスト電源に使った±5V電源を組み込み、それぞれ動かしてみる。はいはい、今まで動かなかった2114も5532も全く問題なく良い音になった。オペアンプのみなさん大変失礼しました。

 PEN^2さんのコメントで、同相入力電圧範囲というのがあるのも知った。1倍の反転増幅回路なら正常に動くかもという助言で早速試してみたが(入力はDACなのでVccの1/2が中点)、残念ながら3.3Vの単電源では無理なようで、ちゃんとした音にはならなかった。

 それはともかく、オペアンプによる音の差は明確だ。値段の差がはっきりわかる。358はまずピリピリと小さなノイズが入ってちょっと問題外だが、残りの3つの差も何回か同じソースを聞いていると違いが見えてくる。4580の音に較べて、2114は弦がなめらかで、艶(つや)やかな音に変わる。5532は分厚い重厚な音になる。面白い。オーディオマニアがオペアンプにこだわるわけが分かるような気がする。

A3112743

 それにしても現用のNJM4580が定格外(±2Vのところを0~3V)だったことは意外だった。しかし定格外でも全く問題なく良い音を出してくれている。まあ、Mega328の定格外のクロックといい、今度のプレーヤーは針の穴を通すような実装だったというわけだ。危ない、危ない。

FPGAフォトフレーム計画のロードマップを作る(3/10/10)
 何を練習問題にするのかまだ思案中だが、本題のFPGAビデオインターフェースのアプローチは続けている。何事に付けても計画を立てておくのとそうでないのではあとの苦労が全然違う。今度のプロジェクトは沢山の要素で構成される。ひとつづつ検討して行く。

 まず、プロセッサーはこのあいだRTCを動かした雑誌付録基板、STM32F103(CQSTARM)を想定する。この石のフラッシュサイズは128KBなので、もし、JPEGデコードライブラリが入らなければ、さらにもうひとつの付録基板LPC2388がある。こいつはフラッシュが512KBあるので十分だろう。しかし、これはSDカードが実装されていないので追加する必要がある。

 画像データをプロセッサーからFPGAへ送るインターフェースは、静止画ならSPIで十分だと思う。ユーザーインタフェースは最初はUARTにし、その後はLCDとタクトスイッチで良いだろう。最終アプリケーションはフォトフレームなので複雑な操作はいらない。

 問題は、ビデオバッファーである。現在持っているFPGA(Xlinx XC3ES250)のブロックRAMはおよそ200Kビットだが、今あるTFT液晶の320×240の解像度(QVGA)の1画面のピクセルサイズ(76.8Kビット)で割ると、3ビットすらとれない。これでは16色も出せない。フォトフレームにするには最低でも256色、欲を言えば6万色(16ビット)は欲しい。

 ということで、必然的に外部RAMをつけることになる。外付けRAMは当初から、しかけの難しい(というより素人には無理な)DRAMではなく、SRAMを考えている。我々アマチュアの心強い味方、秋月電子には、SRAMをいつも何種類か揃えてくれている。

 おや、狙っていたアクセス速度10nsの高速SRAMは売り切れだ。55nsのものしかない。55nsでも、8ビットパラレルでアクセスすれば、QVGA(320×240)の16ビットカラーがNTSC程度の動画(フレームレート30fps)で楽に描画できるが、もうちょっと上のVGA(640×480)となると破綻する(55nsのフレーム単位の転送速度606KB、16ビットカラーVGAのフ レームデータ量614KB)。

4mbitsram_2

 もちろん、VGAも動画も今やるわけではない。しかし、折角ビデオインターフェースを作るなら、このあたりまで視野に入れておきたい。秋月のサイトによれば、高速SRAMの次の入荷は4月上旬とある。それまで待つことにする。

 動画ということになると、当研究所には昔々買ったQCAMという目玉小僧の形をしたVGAカメラがある。30万画素でパラレルポートにつないでいた。これが動かせなくても、最近はCCDカメラも安価だ。まあ、まだ相当先の話になるが、カメラをつけて録画というところまで考えると、余裕を持たせたVRAMにしておきたいところだ。このあたりはそうそう簡単には作れない。

 今のPCならUSBを使った安価なカメラを使って録画するところまで何の苦労もせず出来ると思うが、マイコンではまだ結構難しい。アマチュアの電子工作でも最高レベルに属する。段々気持ちが高ぶってやる気が出てきた。

 例によって、逐次開発方式で開発ステップを考える。

1.    FPGAの言語の習得
VerilogHDLか、VHDLかを早く決めないといけないが、とりあえず7セグLEDあたりをUARTからコントロールするテストアプリケーションを作る。

2.    FPGAとSRAMの接続、非同期アクセステスト

SRAMをFPGA基板に外付けし、FPGAでSRAMをアクセスする。UARTからメモリアクセスが目標(同一データ多量書き込み、読み出しがテストターゲット)

3.    FPGAのビデオインターフェースの出力、カラーバーなど
FPGA内のPLLモジュールでクロックを作りVSYNC、HSYNC信号を生成する。カラーバーを画面に出すことがゴール。

4.    FPGA基板へのDAC制作、またはDACチップの接続

ラダー抵抗式DACで、最初16色程度のカラーを出し、最終的には秋月で売っているビデオDAC、BU3616を使ってVRAMデータをアナログRGBデータに変換する。

5.    FPGAとARMとのインターフェース設計

SPIモジュールの開発。ARMからデータの転送。

6.    ARMのSDカードアクセス
ファイルシステムの導入。UARTによる制御。ChaNさんのFATFSを使わせて貰おう。

7.    SDカード内のBMPデータの描画
これがまず最初のゴール。とりあえずのフォトフレームが完成。

8.    JPEGデコードライブラリの導入

9.    フォトフレームの実装
液晶ケースに基板固定。スタンド、外枠など。

10.    将来構想として、動画再生、カメラの導入、録画など

 初期のステップは独立して作業可能。2と4 が難しそう。3は多数の参考情報あり。6はFPGAでなくARMの開発。7がとりあえずの完成形。9を最終ゴールとする。

 ロードマップが出来た。久しぶりにXlinxの開発環境を立ち上げて動くことを確かめる。雑誌のLEDチカチカのテストコードはVHDLだった。自分の好みから言えば、ステートメントが少なくて済むVerilogHDLにしたいのだが、手本にしようと思うUARTのコードもVHDLだし、どうしたものか迷う。

  このあたりは、電子工作でも一番心楽しい時である。ちょうど旅行の前にどこに行くかあれこれプランを立てて夢を膨らませるのに似ている。

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

« 2010年2月 | トップページ | 2010年4月 »