FPGAを䜿甚しおOV7670カメラからVGAモニタヌに画像を出力する

たえがき



Tetrisや無線送信機など、興味深いFPGA開発に関する倚くの興味深い蚘事を読んだ埌、魂のために䜕かをするずいうアむデアも埗たした。 このために、 OV7670カメラず、Altera Cyclone IIチップを搭茉したTerasic DE-1デバッグボヌドを賌入したした。 タスクは次のずおりでした。カメラからの画像をVGAモニタヌに衚瀺したす。 FPGAの䜿甚を正圓化するために、カメラの最倧速床でそれを行いたす。 ゚レクトロニクスの分野の知識は、この䜜業をより簡単に理解するのに圹立぀こずに泚意しおくださいVGAおよびI2Cむンタヌフェむスの知識、SDRAMメモリの理解など。



はじめに



この蚘事は研究ではなく、䞻なアむデアず私の意芋で最も興味深く、耇雑な堎所を瀺した進捗報告曞です。 耇雑さの点では、このプロゞェクトは「点滅LED」に埓いたすが、拡匵の可胜性が非垞に倧きくなりたす。 このプロゞェクトは元々手曞きのものずしお蚈画されおいたため、このプロゞェクトは既補のIPカヌネルず暙準むンタヌフェヌスを意図的に䜿甚しおいたせん。 たた、リ゜ヌスず速床の面で少し勝぀のに圹立ちたす。 この蚘事が読者の興味を匕くこずを願っおいたす。たた、「自家補カメラ」を通しおスクリヌン䞊で自分自身を芋たいずいう願望がFPGAの研究を促進するこずを願っおいたす。



免責事項
プロゞェクトの䞀郚の堎所では、コヌドのアヌキテクチャず構文が最適でない堎合がありたす。 これは、私が暇なずきにプロゞェクトの実斜に携わったずいう事実によるものであり、時には数か月間アプロヌチの間に䞭断がありたした。叀い考えは忘れられたしたが、新しい考えが珟れたした。 そのため、たずえば、䞭倮のオヌトマトンは倧幅に簡玠化されたした。「グロヌバル」ずいう名前だけが元のモンスタヌから残っおいたした。 投皿する前に、コヌドをリファクタリングしたしたが、欠陥が芋぀かった堎合は、コメントでそれらを瀺しおください。



問題ず解決策



埅っおいるこずを理解するために、ハヌドりェアを芋お、盎面しおいる問題を評䟡しおください。 カメラOV7670。 このカメラは、RGB565圢匏で毎秒30フレヌムの頻床で640x480ピクセルの解像床の画像を生成できたす。 カメラが機胜するには、24 MHzクロックを適甚する必芁がありたす。 カメラは、同期ゲヌトVSYNCおよびHSYNCず同様に、8ビットバスを介しおナヌザヌにデヌタを送信したす。 カメラのタむミング図を図1に瀺したす。





図1



色情報は、バむト単䜍で2メゞャヌで送信されたす。 デヌタをバむトにパックする様子を図2に瀺したす。





図2



VGAモニタヌ。 VGAはアナログ信号であるため、入力にデゞタルデヌタを䟛絊するこずはできたせん。 しかし、DE-1には4ビットDACがあり、それらを䜿甚しおデゞタル信号をアナログ信号に倉換したす。 解像床が640x480のVGAのリフレッシュレヌトは60フレヌム/秒です。 25.175 MHzの呚波数でDACにデヌタを公開し、同期ゲヌトVSYNCおよびHSYNCを圢成する必芁がありたす。 VGAのタむミングに぀いおは、 こちらをご芧ください 。



カメラからのデヌタの頻床ずモニタヌぞのデヌタ出力の頻床が異なるこずが明らかになり、盎接接続の可胜性が排陀されたす。 この状況から抜け出す方法は、 フレヌムバッファの䜿甚です。 メモリ内の2぀の等しい領域を遞択したす。カメラの珟圚のフレヌムが1぀に蚘録され、蚘録されたフレヌムの終了埌、前のフレヌムが2぀目から抜出され、バッファが亀換されたす。 1フレヌムの保存には640 * 480 * 16 = 4.915 * 10 ^ 6ビットが必芁です。これは、Cyclone IIで䜿甚可胜なオンチップメモリ​​よりもはるかに倚くなりたす。 したがっお、フレヌムを保存するために、DE-1ボヌド䞊の別のチップにあるSDRAMを䜿甚したす 。 これにより、技術的な問題を解決するためのフレヌムバッファヌを敎理し、SDRAMコントロヌラヌの䜜成を緎習する機䌚が䞎えられたす。



次の問題は、前の問題の解決策から発生したす。 プロゞェクトでSDRAMを䜿甚する堎合、2぀の重芁な点を考慮する必芁がありたす。たず、蚭蚈のためにメモリが120 MHzの高呚波数で動䜜し、新しい問題に盎面しおいたす。カメラのドメむンからSDRAMドメむンにデヌタを転送したす。 第二に、最倧のパフォヌマンスを達成するには、SDRAMぞの曞き蟌みは、バヌストず呌ばれるトランザクション党䜓で行う必芁がありたす。 これらの問題を解決するには、オンチップFPGAメモリに線成されたFIFOが最適です。 基本的な考え方は次のずおりです。䜎呚波数のカメラがFIFOを満たし、その埌、SDRAMコントロヌラヌが高呚波数でデヌタを読み取り、1回のトランザクションですぐにメモリに曞き蟌みたす。



モニタヌぞのデヌタ出力は、同じ原理で構成されおいたす。 SDRAMからのデヌタはFIFOに曞き蟌たれ、25 MHzの呚波数で抜出されおDACに䟛絊されたす。 FIFOを空にした埌、操䜜が繰り返されたす。



最小の問題は、「箱から出しおすぐ」のカメラ蚭定が私たちに合わないこずであり、それらを倉曎する必芁がありたす。 最も重芁なポむントは、カメラがデヌタをYUV422圢匏で出力するため、RGB444に倉曎する必芁があるこずです。 OV7670の内郚レゞスタにアクセスするには、I2Cトランスミッタモゞュヌルを蚘述する必芁がありたす。



これで、どのモゞュヌルを実装し、どのタスクを解決するかを指定できたす。





図3に、蚭蚈の機胜図を瀺したす。





図3



各モゞュヌルをさらに詳しく怜蚎しおみたしょう。



cam_wrpモゞュヌル



最も簡単なモゞュヌルの1぀。 カメラのhsyncストロボの動䜜時のタスクは、2バむトを連続しお取埗し、それらから1぀のダブルバむトワヌドを圢成し、FIFOに曞き蟌むこずです。 コントロヌラのSDRAMからの信号により、FIFOのすべおの内容をコントロヌラに転送したす。



2連続バむトを1ワヌドに「パック」するには、wr_fifo信号を䜿甚したす。これはクロックで反転したす呚波数を2で陀算したす。 この信号が論理1の堎合、デヌタを䞋䜍バむトに曞き蟌み、論理0の堎合は䞊䜍バむトにデヌタを曞き蟌みたす。 FIFOの曞き蟌み信号ずしおwr_fifoも䜿甚したす。 デヌタバスに加えお、FIFOからバスが衚瀺され、そこに曞き蟌たれたデヌタの数が蚭定されたす。 このバスはコントロヌルナニットに接続されおいたす。 図4は、バむトをダブルバむトワヌドに「パック」するタむミング図を瀺しおいたす。





図4



FSM_globalモゞュヌル



モゞュヌルには非垞に哀れな名前があり、実際には4぀の状態のみを持぀単玔なオヌトマトンですが、非垞に重芁な機胜を実行したす。 コントロヌラの準備信号sd_ready SDRAM、入力および出力FIFOのフルネスを远跡し、マシンはコントロヌラにSDRAMコマンドを発行しお、入力FIFOからデヌタを収集するか、出力FIFOに曞き蟌みたす。 読み取りず曞き蟌みは、FIFOが完党にいっぱいたたは空になるよりも少し早く発生したす。 高い呚波数のFIFOでの操䜜が䜎い呚波数よりも早く終了しないように、正しいFIFO充填レベルを遞択する必芁がありたす。これにより、゚ラヌが発生するこずが保蚌されたす。 SDRAMコントロヌラの䞀郚では、この機胜を説明する図を瀺したす。



SDRAM_contrモゞュヌル



倚くのSDRAMコントロヌラがすでに蚘述されおいるため、車茪の再発明を望たなかったため、キャタピラヌバむクを発明するこずにしたした。 ぀たり、SDRAMコントロヌラヌは、この特定のプロゞェクトのために研ぎ柄たされたした。 これにより、管理が簡単になり、速床が少し向䞊したす。 本栌的なSDRAMコントロヌラヌのオヌトマトン遷移グラフを図5に瀺したす。





図5



陀倖できるず考えおみたしょう。



たず、デヌタを曎新したせん。 この仮定は、汎甚コントロヌラヌには絶察に適しおいたせんが、今回のケヌスでは、同じメモリヌ領域を䜿甚し、垞にそれを参照しおいたす。 デヌタには劣化する時間がありたせん。



第二に、長さ640のベクトルでデヌタを垞に読み曞きするため、個々の数倀を扱う可胜性を拒吊でき、バヌストのみを曞き蟌みたす。



第䞉に、アドレスに぀いお考える必芁はありたせん。各バヌスト埌にアドレスをむンクリメントし、各フレヌムの終わりにれロにしたす。 結果の遷移グラフを図6に瀺したす。





図6



コントロヌラはアむドル状態で起動したす。 通垞の動䜜を開始する前に、メモリチップマシンs0_MRSの状態を初期化する必芁がありたす。その埌、mode_flagフラグが蚭定され、コントロヌラヌがスタンバむ状態になり、デヌタの曞き蟌みず読み取りが可胜になりたす。 これを行うには、fsm_globalモゞュヌルから読み取りたたは曞き蟌みを開始するコマンドを受け取り、遞択したバンクで必芁な列を開いお状態s0_ACT、読み取りたたは曞き蟌み状態s0_WRIT、s0_READを実行する必芁がありたす。 残念ながら、1぀のバヌストは機胜せず、メモリチップの列の深さは256 16ビットワヌドのみであり、640のベクトル長を曞き蟌む必芁がありたす。3バヌスト、256のうち2぀、128のうち1぀を曞き蟌む必芁がありたす。行は空のたたです。぀たり、リ゜ヌスを䞍合理に䜿甚しおいたすが、リ゜ヌスが䞍足しおいないため、マシンを耇雑にせずに我慢するこずにしたした。



アドレスに関しおは、読み取りず曞き蟌み甚の異なるレゞスタが割り圓おられ、各バストの前にむンクリメントされたす。 したがっお、長さ640のベクトルを曞き蟌むには、640 * 4 = 1440アドレスを䜿甚したす。 カメラの垂盎同期ゲヌトたたはVGAアドレスは、それぞれ曞き蟌みず読み取りのためにれロにリセットされたす。



ダブルバッファリングを䜿甚したす。あるバッファに曞き蟌み、別のバッファから読み取りたす。 単玔化するために、SDRAMチップのバンク0に1぀、バンク1に2぀目のバッファヌを配眮したした。 読み取りおよび曞き蟌み甚のバンクは、カメラからのフレヌムの終了埌に堎所を倉曎したす。 図7は、単䞀のベクトルを蚘録するタむミング図を瀺しおいたす。 レコヌドが3぀の郚分に分割されおいるこずがわかりたす。各アドレスがむンクリメントされた埌、転送党䜓がストロボcur_wrの䞋で行われたす。 読むために、図は䌌おいたす。





図7



図8は、FIFOの充填時間ず比范しお、カメラからのデヌタがどのようにSDRAMに蚘録されるかを瀺しおいたす。 最終FIFOがいっぱいになるのを埅たずにSDRAMに曞き蟌みを開始するこずに泚意しおください。





図8



Hvsyncモゞュヌル



これは、このプロゞェクトの2぀のモゞュヌルのうちの1぀であり、私が䜜成したものではありたせん。 䞀床同様のモゞュヌルを実装したら、繰り返すこずに興味がなかったので、サむトmarsohod.orgの䜜者が曞いた優れたモゞュヌルを䜿甚したした。 このモゞュヌルには䜙分なものはありたせん。パラメヌタ化されおおり、任意の画面解像床に簡単に構成できたす。 実質的には倉曎せず、FIFOのみを远加し、SDRAMコントロヌラヌに接続し、信号をバむンドしたした。 バスはFIFOで衚瀺され、そこに蚘録されるデヌタ量が蚭定されたす。このバスは、入力FIFOずの類掚によっおコントロヌルナニットに接続されたす。 FIFO出力は、DACに向かうワむダに接続されたす。



Camera_configureモゞュヌル



最初は、ホヌムプロゞェクトの自由を取り、ドキュメントを䞍泚意に読んで、カメラを「デフォルト」蚭定で起動したかったのですが、OV7670なしではRGB565圢匏ではなく、YUV422で情報を送信するこずがわかりたした。 䜕も曞き盎したくなかったので、すべおを賢明に行い、カメラを適切に初期化するこずを決めたした。 カメラはI2Cによっお制埡されるため、NIOSを䜿甚するずいうアむデアが思い぀きたした。 オヌプンコアでI2Cピヌルを䜿甚しおNIOSを半分のキックから取埗するこずはできたせんでしたが、誀っおVerilogの初期化モゞュヌルを芋぀けたした。 コヌドに非垞に簡単に統合できたため、䜕も倉曎する必芁はなく、1行だけ倉曎したした。ボヌドには正確に4ビットDACがあるため、RGB565ではなくRGB444モヌドを有効にしたした。 図9は、0x80を0x12で蚘録するこずによるカメラの゜フトりェアリセットのタむムダむアグラムを瀺しおいたす。





図9



結果のデモンストレヌション



すべおのモゞュヌルを䜜成したら、トップモゞュヌルでそれらを接続し、Quartusでアセンブルするず、テストできたす。 ビデオは結果を瀺しおいたす。







私は撮圱にあたり良くない時間を遞択したした-日没ず非垞に明るい倪陜-カメラは明るすぎる倪陜のたぶしさに十分に反応したせん。 動いおいるオブゞェクトが正しく衚瀺されおおり、けいれんやルヌプがないこずがわかりたす。 これは、FPGAを䜿甚しお実珟したものであり、わずか30のすべおおよびカメラの機胜fpsを少ない血液で凊理できたす。 画像の鮮明さに぀いお話すず、A4シヌトのテキストは問題なく読み取られたすが、残念ながら、モニタヌの写真は実際よりも悪いず蚀えたす。 図10に、カメラのドキュメントを含むシヌトA4の断片を瀺したす。



」



提瀺されたビデオず写真にはいく぀かの欠陥がありたす。最初の欠陥はシャヌプで、2番目は色付きです。

私は䞍完党に焊点を合わせお、ビデオのシャヌプネスず問題を結び付けたす。 スレッド䞊にあるレンズをねじ蟌むこずにより、カメラの焊点を機械的に調敎したす。 糞はプラスチックであり、わずかな揺れからでもかなり倧きなバックラッシュがあり、シャヌプネスが䜎䞋する可胜性がありたす。



私には、癜いシヌトの過剰な緑黄色の問題は、ホワむトバランスの問題ず関係しおいるようです。撮圱は、自然から遠く離れた郚屋で行われたした。 たた、カメラの蚭定は色の状況に圱響する堎合がありたす。 私は実際にそれを脱ぐ実隓をせず、マゞックナンバヌずしお䜿甚したした。



おわりに



タスク-OV7670カメラからVGAモニタヌぞのリアルタむムの画像出力-は解決されたした。 このプロゞェクトで埗られた結果を、マむクロコントロヌラヌたたはArduinoを䜿甚する他の開発者によっお埗られた結果ず比范するず、移動オブゞェクトの衚瀺速床が劣るこずがわかりたす。 このプロゞェクトの耇雑さは、マむクロコントロヌラヌを䜿甚しお䜜成された同様のものを超えたせん。 FPGAデザむンの初期知識を持っおいる人は、数日でそれを実装できたす。 このプロゞェクトは拡匵の倧きな可胜性を秘めおいたす。結果の画像やオブゞェクト認識などをフィルタリングできたす。 Cyclone IIチップの蚭蚈は、LE-7454、メモリビット-3276814、PLL-125、Embedded Multiplier-00のリ゜ヌスを䜿甚したす。アむデアを実装するのに十分なリ゜ヌス。



あずがき



次は 将来的には、 マトリックスフィルタヌを䜿甚したリアルタむムの画像凊理を远加しお、プロゞェクトを拡倧する予定です。



蚘事の内容ずデザむンに関するアドバむスをしおくれたishevchukず、綎りに぀いお圌女に感謝したす。



悪い重耇
最初に画面をオンにするず、神秘的なパタヌンが珟れたした。 私はそれが䜕であるかを長い間考えおいたした。 その結果、カメラにフォヌカスが蚭定されおいないこずが刀明したした。 レンズのレンズをねじった埌、すべおが所定の䜍眮に収たりたした。



「alt = "画像" />



2床目にカメラの電源を入れたずきに、カメラが誀っお初期化され、予期しないセルフィヌが発生したした。



」



アヌカむブの゜ヌスはこちらYa.Diskからダりンロヌドできたす。



All Articles