”
std_logic_arith から numeric_std へ(VHDL) ”で、std_logic_arith パッケージから numeric_std パッケージへの移行をしているが、たくさんエラーが出て大変な状況になっている。直しているのは、MT9D111のAXI4インターフェース回路のトップモジュールで、VHDLで書かれている。以前キャラクタをAXI4バス経由でDDR3 SDRAMのフレームバッファに書き込む回路モジュール、
char_write_axi_master.vhd を書き換えている。
先ずは、すべての signal はstd_logic か
std_logic_vector で宣言してある。
1.std_logic_arith パッケージでは、if文でのsignalの定数との比較は、下のように書いたが
if write_count=0 and M_AXI_WREADY='1' then -- 終了
numeric_std パッケージでは、こう書いた。
if unsigned(write_count)=0 and M_AXI_WREADY='1' then -- 終了
numeric_std パッケージでは、unsigned と natural の "=" の演算が定義されている。
function "=" (L: UNSIGNED; R: NATURAL) return BOOLEAN;
std_logic_vector の write_count を unsigned に変換して、"=" の右辺の 0 は、naturalに変換して比較する。厳密に型を守って書くと、下の書き方になると思う。
if unsigned(write_count)=natural(0) and M_AXI_WREADY='1' then -- 終了
2.std_logic_arith パッケージでは、下のように書いたが
write_count <= write_count - 1;
numeric_std パッケージでは、こう書いた。
write_count <= std_logic_vector(unsigned(write_count) - 1);
これは、numeric_std パッケージの "-" の演算子が下のように定義されているからだ。
function "-" (L: UNSIGNED;R: NATURAL) return UNSIGNED;
厳密に型を守って書くと、下の書き方になると思う。
write_count <= std_logic_vector(unsigned(write_count) - natural(1));
3.ビット幅を変更する場合は、numeric_std パッケージでは、resize()を使うことができる。resize() はUNSIGNED, SINGED ともにビット幅を変更することが出来る。
使い方はXilinxのアンサーにも書いてある。”
11.2 XST - 「ERROR:HDLCompiler:410 - ".vhd" Line xx: Expression has x elements; expected y」というエラー メッセージが表示される ”を参照のこと。2つの数を足し算すると、2倍になる可能性があるので、1ピットだけビット幅が増える可能性がある。その時に、足し算する前の数は8ビットだが、足した結果が9ビットの場合に、足し算する前の数を8ビットから、resize() で9ビットにしてから足し算を行なっている。
FPGA BBSで知ったのだが 、
VHDL Math Tricks of the Trade (PDF注意)を貼っておく。
numeric_std パッケージを使う時は、std_logic_vector を使うよりは、unsigned かsigned を使ったほうが良いと思う。
2012年12月31日 06:23 |
VHDLの書き方
| トラックバック:0
| コメント:0
7月 ・
さくらんぼ狩りに行って、蔵王温泉スキー場の大露天風呂を堪能しました ・
AXI4バスに接続するビットマップ・ディスプレイ・コントローラの作製3(単体シミュレーション) 、前回は本体のbitmap_disp_cntrler_axi_master.v から下のVerilog ファイルを作製した。今回はテストベンチとBFMを用意してbitmap_disp_cntrler_axi_master.v 単体でシミュレーションを行った。
・
Zynq-7000(ZC702)のチュートリアルをやってみた3(実機でテスト) 、ここでZC702ボードをお借りすることが出来たので、実機でテストを行った。チュートリアル2も実機でテストした。
・
Zynq-7000(ZC702)のLinuxチュートリアルの勉強 ・
Zynq-7000(ZC702)のLinuxチュートリアル1(Slave Boot Method) ・
Zynq-7000(ZC702)のLinuxでMIOに接続されているLEDを制御 ・
AutoESLのセミナを受けてきました ・
Vivado 2012.2 、ちょっとやってみた。
8月 ・
ビットマップ・ディスプレイ・コントローラの作製17(動き出した) 、Atlysボードで、自分でaxi_s6_ddrx IP (DDR2 SDRAM Controller) を入れて作ったXPSプロジェクト入りのPlanAheadプロジェクトを使ってきたが、どうもaxi_s6_ddrx IP が動かない。動いていXPSプロジェクトを変換してみたら動いてきた。これでだいぶ苦労してしまった。
・
東京スカイツリータウンに行って来ました ・
ビットマップ・ディスプレイ・コントローラの作製19(HDLソースの公開) 、動作したと思われるのでHDLソースを公開した。
・
ZedBoardでLinuxが動作した ・
ビットマップ・ディスプレイ・コントローラの作製21(画面にキャラクタを描画) 、ビットマップ・ディスプレイ・コントローラで写している画面にキャラクタを書くことが出来た。
・
WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた1(エラー発生) 、WebPACK14.2のPlanAheadプロジェクトでZedBoardのHello Worldチュートリアルをやる様子。主に9月に行なっている。
9月 ・
WebPACK14.2でZedBoardのHello Worldチュートリアルをやってみた2(Logic EditionでXPS) 、WebPACKライセンスでやる場合は、ISE14.2 Logic Edition をインストールして、WebPACKのライセンスで動かす。
・
Zynqの勉強1 、Zynqの勉強をすることにした。
・
WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた1(XPSプロジェクトの生成) ・
WebPACK14.2でZedBoardのPS & PLチュートリアルをやってみた6(実機でテスト) 、実機で動作した。
・
ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する1(XPSプロジェクト) ・
はんだづけカフェで開催されたハンダ付け教室に行って来ました ・
ZedBoardにキャラクタ・ディスプレイ・コントローラを追加する5(完成) 、ZedBoardのキャラクタ・ディスプレイ・コントローラが動作した。
・
ZedBoardにビットマップ・ディスプレイ・コントローラを追加する1(XPSの設定1) ・
ZedBoardにビットマップ・ディスプレイ・コントローラを追加する6(完成とは言えない) 、キャッシュコヒーレンシの関係でARMプロセッサで書き込んだデータが、ビットマップ・ディスプレイ・コントローラからうまく読めていなかった。
10月 ・
ZedBoardにビットマップ・ディスプレイ・コントローラを追加する7(GPIOを使ってBDCをスタート) 、ビットマップ・ディスプレイ・コントローラが動いたけど、最初にリセットが解除されてから85秒間のWaitが必要だった。それはとっても面倒なので、ARMの初期化ルーチンが終了してから、ビットマップ・ディスプレイ・コントローラが動作するように変更した。これで動作した。
・
Segway Tour 実験に参加しました 、セグウェイに乗って来ました。姿勢を良くして乗る必要があるので、結構大変です。
・
アクリルサインを作っています ・
FusionPCBに基板を発注しました 、アクリルサイン用の基板をKiCADで作って、FusionPCBに発注しました。
・
ZedBoardにビットマップ・ディスプレイ・コントローラを追加する13(char_wirte_axi_master IPを追加4) 、でAXI4バスを使用してキャラクタをDDR3 SDRAMのフレームバッファに書くハードを作ったら、正常にキャラクタが書けた。この時点では、ARMプロセッサのソフトウェアでは、不完全にしか書けていなかった。
・
ChipScope Analyzer でステートマシンのステートを表示する方法 ・
ZedBoardにビットマップ・ディスプレイ・コントローラを追加する14(ソースの公開) ・
Raspberry Pi が届きました ・
ZedBoardでHDMI出力1(アナデバのリファレンス・デザイン) 、アナログ・デバイセズ社のサンプルデザインを元にHDMIから出力してみることにした。
・
ZedBoardにビットマップ・ディスプレイ・コントローラを追加する16(ARMのソフトからキャラクタを書けた) 、アナログ・デバイセズ社のHDMIのサンプルデザインのCコードを読んでいたら、メモリに書いた後に、Xil_DCacheFlush(); を実行していた。これを使ったところ、ARMプロセッサからキャラクタを書いても完璧に表示することが出来た。
11月 ・
FusionPCBから基板が届きました ・
アクリルサイン用の基板を実装しました ・
アクリルサインの試作第1号が完成 ・ZedBoardにビットマップ・ディスプレイ・コントローラを追加する18(再度ACPポートを使用) 、再度、マニュアルに従ってACPポートを使ってみたが、まだ少しバグがあるみたいだった。
・
ZedBoardでHDMI出力5(BDC の作製1) 、HDMI出力とVGA出力を同時に出来るBitmap Display Controller (BDC) を作ることにした。ブロック図を書いた。
・
ZedBoardでHDMI出力7(ADV7511のレジスタ設定1) 、HDMI出力用ICのADV7511のレジスタの設定を見ていった。
・
ET2012に行って来ました ・
RGB―YCbCr変換の検討1(変換式) 、RGBで表されたピクセルをADV7511に表示させるためにはYCbCrに返還する必要がある。その変換回路を実現するためにRGB-YCbCr変換回路を設計することにした。先ずは変換式を検討してみた。
・
松島観光 、宮城県の松島に行って観光してきました。
・
ZedBoardでHDMI出力13(HDMIに出力できた) 12月 ・
MFT2012の1日目 、MFT2012でFablab Japanのブースの1画をお借りして、アクリルサインを展示しました。
・
ZedBoard用CMOSカメラボードの作製1(カメラモジュールの検討) 、ZedBoardにカメラを付けることにした。MT9D111を使うことした。ZedBoardのPMOD端子2個に接続するための基板を作ることにした。
・
ZedBoard用CMOSカメラボードの作製2(基板の発注) ・
MT9D111のお勉強1 、CMOSカメラモジュールの勉強をすることにした。いろいろ教えて頂いてありがとうございました。
・
AXI IIC のお勉強1 、MT9D111を設定するためにAXI IIC IPの使い方を勉強した。
・
ZedBoard用CMOSカメラボードの作製3(MT9D111用基板が到着) 、FusionPCBに発注から2週間弱で到着。
・
ZedBoard用CMOSカメラボードの作製5(カメラボード完成) 、カメラボードの部品をハンダ付けして完成しました。ZedBoardのPMODに入れてみました。ピッタリ入りました。
今年もいろんなことがあって、目標を達成できたと思います。皆さんにもいろいろと教えてもらったりして、お世話になりました。また来年もよろしくお願いします。
来年もがんばろうと思います。
2012年12月28日 07:23 |
日記
| トラックバック:0
| コメント:0
2012年を振り返ってみよう。
今年は、AXI4バスとZynqを中心にブログの記事を書いてきた。来年もこの傾向は変わらないと思う。ZynqはARMプロセッサにFPGAが付属しているICで、これから伸びる可能性を秘めていると思う。しかし、1人で使うにはソフト、ハードに精通する必要があるんで、使うのが難しいICだ。それを使いこなせる可能性があるのが、Vivado HLSだと思っている。
1月 ・
ar37425のAXI4 Masterサンプルを試す2(インプリメント) が最初の記事だ。まだAXI4バスのサンプル回路を試している。
・
Altium Designer によるPCB設計入門1(回路図シートの作成1) でAltium Desiger の使い方をいろいろ試してみた。
・
ar37425のAXI4 Masterサンプルを試す6(シミュレーション3) では、AXI4バスのトランザクションをタイミングチャートを示しながら、説明した。AXI4バスの理解のためには良い記事だと思う。
・
MicroBlaze MCSをテストする1(IPコアの生成、Project Navigator編) で、WebPACKで使えることになったMicroBlaze MCSをテストしている。
・
FPGAカンファレンスに行ってきました ・
MicroBlaze MCSをISE WebPACKから使用する1 で、MicroBlaze MCSをISE WebPACKから使用する記事を書き始めた。
2月 ・
Altium Designer でIntegrated Library を作る1(回路図ライブラリ編) ・
DVI、HDMIの勉強1 でDVIやHDMIへ出力しようと試みた。最初にXilinxのアプリケーションノートXAPP495を試してみた。
・
DVI、HDMIの勉強4(キャラクタ・ディスプレイ・コントローラをDVI出力にする Verilog編) でXAPP495を元にキャラクタ・ディスプレイ・コントローラをDVI出力にすることが出来た。
・
DVI、HDMIの勉強6(キャラクタ・ディスプレイ・コントローラをDVI出力にする VHDL編1) で、Digilent社のサンプルコードを使ってVHDLでHDMI出力することに成功した。
・
キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする1(仕様の検討) で、VHDLでHDMI出力することに成功した回路をAXI4スレーブにするプロジェクトを開始した。
3月 ・
キャラクタ・ディスプレイ・コントローラをAXI4スレーブにする3(BFMシミュレーション) で、Bus Function Modelを作って、単体テストを行うことにした。
・
CIRCUITLABでお手軽に回路シミュレーション で、CircuitLabというWebブラウザ上で書ける回路図CADを使ってみた。
・
ハンターマウンテン塩原スキー場に行って来ました ・
AXI4マスタIPの作製(仕様の策定) で、キャラクタ・ディスプレイ・コントローラAXI4スレーブIPを駆動するAXI4マスタIPを作製することにした。
・
擬似乱数、M系列を使う1 4月 ・
AXI4マスタIPの作製3(インプリメント) で、キャラクタをDRAMに書き込むAXI4マスタIPが完成。(Atlysボード使用)
・
AXIスレーブIPのパラメータ を解説。
・
AXI4マスタIPのパラメータ を解説。
・
VHDLのとっても有用なExamples ・
AXI4スレーブ・バス・ファンクション・モデル(BFM)の作製2 、AXI4マスタIPを自作して、それを単体テストするために、AXI4スレーブIPの代わりのBFMモデルが完成した。
・
エレキジャック・フォーラム2012に行って来ました ・
Altium Designer のFPGA設計入門をやってみる1(準備編) 、Altium DesignerはFPGA設計やソフトウエア開発ができる統合ツールなので、FPGA開発をやってみることにした。
・
Altium Designer でC to Hardware のサンプルを試してみる1 、Altium Designer でC to Hardware のサンプルを試してみることにする。
・
Altium でC to Hardware(ラプラシアンフィルタ) 、Altium でもう一度、C to Hardwareをやってみた。今度はラプラシアンフィルタを自分で作ってやってみた。
5月 ・
つくば市の竜巻 、今年は竜巻に襲われて停電した。
・
SpringSoft社のセミナとトラ技オフ会 ・
XPS入りのPlanAhead14.1プロジェクトを作る1(プロジェクトの生成) 、今年は、PlanAheadプロジェクトを使用してみた。
・
庭でさくらんぼを収穫しました 、今年は庭のさくらんぼの木に沢山さくらんぼが出来たので、ジャムにしました。
・
ChipScope AXI Monitor を試してみた 、AXIバスの状態を監視できて、とても便利だ。
・
AXI Performance Monitor IPを試してみた1(インプリメント) 、AXI Performance Monitor は、言わばカウンタ・レジスタの塊でReadやWriteのレイテンシや、総データ転送数、トランザクション数をカウントしてくれるIPだ。バス占有率などをチェックすることができる。
6月 ・
キャラクタROMをAXI4 Lite Slave として実装する1(AXI4 Lite バスの勉強) 、キャラクタ・ディスプレイ・コントローラのキャラクタROMをAXI4 Lite Slave として実装することにした。
・
画像センシング展(画像センシングシンポジウム)での展示 ・
イイヤマの23インチワイド液晶ディスプレイを購入しました ・
Zynq-7000(ZC702)のチュートリアルをやってみた1(PlanAheadプロジェクト、XPS) 、ZynqのZC702ボードは持っていないけど、チュートリアルをやってみることにした。後で、ZC702ボードを貸して頂いて実際に動作を確認することができました。ありがとうございました。
・
Zynq-7000(ZC702)のチュートリアル2をやってみた1(XPSプロジェクトの生成) 、Programmable Logic (PL) 領域を使用して、XPSでIPを繋いで、Processing System (PS) と接続して動作させるチュートリアルだ。
2012年12月27日 09:40 |
日記
| トラックバック:0
| コメント:0
今日は午後から休暇を取って、奥さんと
映画「レ・ミゼラブル」 (画像音声注意) を見てきました。見るまで知らなかったのですが、ミュージカルの映画でした。歌ってました。
途中つまらなかったのですが、ラストは良かったです。ミュージカルのレ・ミゼラブルを見たことがあるんですが、同じストーリーでした。小説も一緒なんでしょうね?確か、遠い昔に読んだことがあったと思うのですが、覚えていません。
奥さんに連れられて行った映画ですが、何かスカッとする他の映画が見たくなりました。2012でも借りてきてみようかな?
2012年12月25日 21:15 |
日記
| トラックバック:0
| コメント:0
VHDLで今までは、下のようにパッケージを呼び出して CONV_INTEGER や CONV_STD_LOGIC_VECTOR を呼び出して変換を行なってきた。
LIBRARY ieee; USE ieee.std_logic_1164.ALL; use ieee.std_logic_unsigned.all; use ieee.std_logic_arith.all;
遅まきながら、ISEのテンプレートもnumeric_std になったことだし、これからは numeric_std パッケージを使っていこうと思う。
library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all;
CONV_INTEGER や CONV_STD_LOGIC_VECTOR に代わるものは何か?と検索すると、Xilinxのアンサー”
VHDL で STD_LOGIC_VECTOR を整数に変換する方法 ”が引っかかった。それによると、CONV_INTEGER は TO_INTEGER に置き換わるそうだ。アンサーは UNSIGNED の時の返り値が INTEGER になっているが、Xilinx\14.4\ISE_DS\ISE\vhdl\src\ieee\numeric_std.vhd では、NATURAL だった。下に示す。
function TO_INTEGER (ARG: UNSIGNED) return NATURAL; function TO_INTEGER (ARG: SIGNED) return INTEGER;
CONV_STD_LOGIC_VECTOR に代わるものとしては、TO_UNSIGNED と TO_SIGNED があるようだ。
function TO_UNSIGNED (ARG, SIZE: NATURAL) return UNSIGNED; function TO_SIGNED (ARG: INTEGER; SIZE: NATURAL) return SIGNED;
STD_LOGIC_VECTOR に変換する際には、STD_LOGIC_VECTOR(ARG: UNSIGNED), STD_LOGIC_VECTOR(ARG: SIGNED) とすれば良い。(参考、”
unsinedとstd_logic_vector ”FPGA BBS)
numeric_std.vhd を見ていると面白い。色々な関数がある。演算子のオーバーロードを見ると、
function "+" (L: UNSIGNED; R: NATURAL) return UNSIGNED; function "+" (L: NATURAL; R: UNSIGNED) return UNSIGNED;
がある。val + 8 とか大丈夫のようだ。但し、UNSIGNEDなので、すべてSTD_LOGIC_VECTORで定義してある場合は、STD_LOGIC_VECTOR(UNSIGNED(val) + 8) だと思う。
同様にSIGNED も演算子のオーバーロードがある。
function "+" (L: INTEGER; R: SIGNED) return SIGNED; function "+" (L: SIGNED; R: INTEGER) return SIGNED;
numeric_std.vhd を見ているととっても興味深く面白い。
rem も演算子にあるんだな? mod とどう違うんだろう?
(追加) ツイッターで教えてもらったのだが、remはremainder,modはmoduloだそうだ。
”
教えて!goo マイナスの割り算の公式 ”のNo.3ベストアンサー20pt と”
VHDL 基礎 ”の”関係演算子、加法演算子、乗法演算子、シフト演算子、その他演算子”のmod, rem の項で勉強させてもらった。つまり数直線上で2つの演算子の符号が違っている時に、どちらから元の値に戻るかが違うようだ。
(A mod B) = C とすると |C|< |B|、かつ B と C は同じ符号を取る。
(A rem B) = C とすると |C| < |B|、かつ A と C は同じ符号を取る。
”
Re: VHDL - Unterschied REM & MOD ? ”を参考に例を示す。
7 mod 3 = 1 :3x2 +1 = 7 (-7) mod 3 = 2 :3x(-3) +2 = -7 7 mod (-3) = -2 :(-3)x(-3) -2 = 7 (-7) mod (-3) = -1 :(-3)x2 -1 = -7 7 rem 3 = 1 :3x2 +1 = 7 (-7) rem 3 = -1 :3x(-2) -1 = -7 7 rem (-3) = 1 :(-3)x(-2) +1 = 7 (-7) rem (-3) = -1 :(-3)x2 -1 = -7
2012年12月25日 05:50 |
VHDLの書き方
| トラックバック:0
| コメント:0
ZedBoard用CMOSカメラボードが来たので、ハンダ付けをして1つ作ってみたい。
FPGAの回路の方だが、ISE14.4を使用して、
HDMIを表示できたAXIバス使用回路 を改造してカメラの画像を表示したい。カメラ・インターフェース回路は、以前のブロック図の様にDDR3 SDRAMをバッファメモリとして使用して、カメラは自分のタイミングでバッファメモリへ書いて、ディスプレイ・コントローラも自分のタイミングでピクセルデータを読んで来るようにしようと思う。これでフレームレート変換も行うことができる。以前にSparatan-3A Starter Kit でCMOSカメラ表示回路を作ったとこのブロック図を下に示す。
上の図でDDR2 SDRAMが今回はDDR3 SDRAMでARMプロセッサからDDR3 SDRAMをアクセスするパスが追加された感じだ。(実際はARMがディスプレイ・コントローラに直接繋がっていて、FPGAの方が横からもらってくる感じ)
カメラ・コントローラには、以前、
ハードウェアでキャラクタを書いたchar_write_axi_master IP を改造しようと思っている。つまり、独自のAXI4バス・システムを構築してカメラ表示回路を構築する。
独自システムでのカメラ表示回路が完成したら、独自システムの代わりに、AXI VDMAを使用して書きなおしてみようと思っている。やはり、自分で作るよりは既成のIPの活用の方が全部自分で作らずにすむし、他に使いまわせる。他人にも教えやすい。但し、複雑なIPは使い方が難しく、たくさんの設定が必要になる。よって、ページ数の多いマニュアルを熟読しないと使えないとなってしまうので、最初に大部分の動作が確認できている独自システムの開発を優先する。
下に、日昇テクノロジのMT9D111カメラモジュールとZedBoardのJA1, JB1の2つのPMODをつなぐ変換基板のピン配置表を示す。
ZebBoard用MT9D111基板の配線表
2012年12月23日 06:57 |
ZedBoard
| トラックバック:0
| コメント:0
今日、MT9D111用基板が到着しました。
12月9日に発注した ので、13日で届きました。2週間かかっていないので、早いです。頼んだのはFusionPCBです。
下に基板の写真を示します。
MT9D111の取付穴位置もOKの様です。
後は2列のピンヘッダをハンダ付けして、ZedBoardのPMODに入れば、大丈夫だと思います。
明日、FPGA-CAFEで2列のピンヘッダを購入してハンダ付けします。
2012年12月22日 20:09 |
ZedBoard
| トラックバック:0
| コメント:0
・
Transmit FIFO (TX_FIFO) (C_BASEADDR + 0x108、すべてRead/Write、Reset Valueは[31:8]が0、[7:0]がIndeterminate)
・[31:10]bit - Reserved.
・[9] - Stop : Stop. ここに1を書くとストップ・シーケンスを生成する。
・[8] - Start : Start. ここに1を書くとMSMS (CR[2]) = 0 の時はスタート・シーケンスを生成して、MSMS = 1の時はリピート・スタート・シーケンスを生成する。
・[7:0] - AXI IIC Transmit Data. Start = 1の時に、0ビット目が0だとWriteアドレス、0ビット目が1だとReadアドレスとなる。Readアドレスの次にStop = 1として、ここにReadするバイト数を書くと受信する。
・
Receive FIFO (RX_FIFO) (C_BASEADDR + 0x10C、[7:0]はRead、[7:0]のReset ValueはIndeterminate)
・[31:8]bit - Reserved
・[7:0] - Read : IIC Receive Data.
・
Transmit FIFO Occupancy Register (TX_FIFO_OCY) (C_BASEADDR + 0x114、[3:0]はRead、[3:0]のReset Valueは0)
・[31:4]bit - Reserved
・[3:0] - Occupancy Value : [3]がMSB、値が”1001”だったら10個のデータがFIFOに入っている。つまり読んだバイナリ値+1。
・
Receive FIFO Occupancy Register (RX_FIFO_OCY) (C_BASEADDR + 0x118、[3:0]はRead、[3:0]のReset Valueは0)
・[31:4]bit - Reserved
・[3:0] - Occupancy Value : [3]がMSB、値が”1001”だったら10個のデータがFIFOに入っている。つまり読んだバイナリ値+1。
・MT9D111のレジスタ設定例 ・AXI IICの初期化 Control Register (C_BASEADDR + 0x100) : 0x0002 をWrite(Transmit FIFO Reset. )
Control Register (C_BASEADDR + 0x100) : 0x0001 をWrite(AXI IIC Enable.)
・Write(R0x09:0 に 0x1234 をWriteする) Status Register (C_BASEADDR + 0x104)をReadして、TX_FIFO_Empty [7] が1、Bus Busy [2] が0になるのを待つ(TX_FIFO_Emptyは、必ずしも待たなくても良いかもしれない)
AXI IIC Transmit FIFO (C_BASEADDR + 0x108) : 0x1BA をWrite(MT9D111の Write アドレス, Start bit=1 )
AXI IIC Transmit FIFO (C_BASEADDR + 0x108) : 0x09 をWrite(R0x09:0)
AXI IIC Transmit FIFO (C_BASEADDR + 0x108) : 0x12 をWrite
AXI IIC Transmit FIFO (C_BASEADDR + 0x108) : 0x234 をWrite( Stop bit = 1 )
・Read(R0x9:0 をReadすると 0x1234 が返る) Status Register (C_BASEADDR + 0x104)をReadして、TX_FIFO_Empty [7] が1、Bus Busy [2] が0になるのを待つ(TX_FIFO_Emptyは、必ずしも待たなくても良いかもしれない)
AXI IIC Transmit FIFO (C_BASEADDR + 0x108) : 0x1BA をWrite(MT9D111の Write アドレス, Start bit=1 )
AXI IIC Transmit FIFO (C_BASEADDR + 0x108) : 0x09 をWrite(R0x09:0)
AXI IIC Transmit FIFO (C_BASEADDR + 0x108) : 0x1BB をWrite(MT9D111の Read アドレス, Start bit=1 )
AXI IIC Transmit FIFO (C_BASEADDR + 0x108) : 0x202 をWrite([7:0]にReadするバイト数をセット、Stop bit=1 )
Status Register (C_BASEADDR + 0x104)をReadして、RX_FIFO_Empty [6] が0になるのを待つ。
Receive FIFO Occupancy Register (C_BASEADDR + 0x118)の[3:0] が 0x0001 になるのを待つ。(2バイト受信できた)
Receive FIFO (C_BASEADDR + 0x10C)を読む。0x12 が読めるはず。
Receive FIFO (C_BASEADDR + 0x10C)を読む。0x34 が読めるはず。
2012年12月22日 07:01 |
IP
| トラックバック:0
| コメント:0
今までは、自分で作ったI2Cの回路を使用してきたが、Xilinx社のEDK用IPコアの AXI IIC を使ってみることにした。そこで、AXI IICの使い方を勉強してみた。
まずは
、LogiCORE IP AXI IIC Bus Interface (v1.01a) のドキュメント を見て学習した。
特徴としては、
・AXI4-Liteインタフェース
・マスタまたはスレーブ動作(今回はマスタとして使用)
・スタンダードモードは100KHz(高速モードは400KHz)
・7ビットまたは10ビットのアドレス
・送信FIFO、受信FIFOは16深度
こんなところか。当然、割り込みにも対応している。マスタ動作でもあるし、今回は割り込みは使用しない
ブロック図を下に示す。ドキュメントの Figure 1: AXI IIC Bus Interface Top Level Block Diagram を引用する。
上図を見ると、AXI IICのイメージが掴めると思う。
パラメータは飛ばして、レジスタ表を下に示す。使用するレジスタだけを抜き出してある。下の表がすべてのレジスタではない。すべてのレジスタ表はマニュアルの11ページの Table 4: Registers を参照のこと。
AXI IIC レジスタ表 Base Address + Offset (hex) Register Name Access Type Default
Value (hex)
C_BASEADDR + 0x100 Control Register (CR) Read/Write 0x0 C_BASEADDR + 0x104 Status Register (SR) Read 0xC0 C_BASEADDR + 0x108 Transmit FIFO (TX_FIFO) Read/Write 0x0 C_BASEADDR + 0x10C Receive FIFO (RX_FIFO) Read N/A C_BASEADDR + 0x114 Transmit FIFO Occupancy Register
(TX_FIFO_OCY)
Read 0x0 C_BASEADDR + 0x118 Receive FIFO Occupancy Register
(RX_FIFO_OCY)
Read 0x0
・
Control (CR) Register (C_BASEADDR + 0x100、すべてのビットがRead/Write, Reset Value はすべて0)
・[31:7]bit - Reserved.
・[6] - GC_EN : General Call Enable.
・[5] - RSTA : Repeated Start.
・[4] - TXAK : Transmit Acknowledge Enable.
“1” - ACK bit = “1” - not-acknowledge
“0” - ACK bit = “0” - acknowledge.
・[3] - TX : Transmit/Receive Mode Select.
"1" - AXI IIC transmit.
"0" - AXI IIC receive.
Read/WriteのコントロールはTX_FIFOに書くアドレスのLSBで決まる。LSB="1"はRead。
・[2] - MSMS : Master/Slave Mode Select.
・[1] - TX_FIFO Reset : Transmit FIFO Reset.
“1” resets the transmit FIFO.
“0” transmit FIFO normal operation.
・[0] - EN : AXI IIC Enable.
“1” enables the AXI IIC controller.
“0” resets and disables the AXI IIC controller but not the registers or FIFOs.
・
Status Register (SR) (C_BASEADDR + 0x104、すべてのビットがRead、Reset Valueは TX_FIFO_Empty, RX_FIFO_Empty のみ 1 で後は 0)
・[31:8]bit - Reserved.
・[7] - TX_FIFO_Empty : Transmit FIFO empty.
・[6] - RX_FIFO_Empty : Receive FIFO empty.
・[5] - RX_FIFO_Full : Receive FIFO full.
・[4] - TX_FIFO_Full : Transmit FIFO full.
・[3] - SRW : Slave Read/Write.スレーブモード用
・[2] - BB : Bus Busy. I2C通信のスタートとストップの間を示す。つまりI2C通信の最中だということを示す。
“1” indicates the bus is busy.
“0” indicates the bus is idle.
・[1] - AAS : Addressed as Slave.現在のI2C通信がスレーブ用アドレスに合っていることを示す。
“1” indicates being addressed as a slave.
“0” indicates not being addressed as a slave.
・[0] - ABGC : Addressed By a General Call.
2012年12月21日 05:59 |
IP
| トラックバック:0
| コメント:0
MT9D111の設定方法は大体理解したので、設定方法を決定しようと思う。
・PLLはバイパスとする。R101(0x65):0 はデフォルト値 0xE000
・入力周波数は36MHz
・画像の大きさは800x600とする。フォーマットはRGB565
・Power ONからプレビューモードに行くはずなので、設定はRGB565にする程度で当初やってみる。
・RGB565をRGB888に変換して、DDR3 SDRAMにバッファする。その後は、今まで作ってきたビットマップ・ディスプレイ・コントローラで表示できる。
・axi_iic が使える時はこれを使用して、ソフトウェアからI2Cを制御したい。axi_iic を要調査。
2012年12月20日 21:36 |
ZedBoard
| トラックバック:0
| コメント:0
昨日、休暇を取得して、奥さんと
映画『ホビット 思いがけない冒険』 (音楽注意) を見てきました。
これは、ロード・オブ・ザ・リングのプロローグでホビットのバギンズの冒険を描いたものです。ガンダルフも出てきますよ。バギンズの指輪を拾ったエピソードも出てきますよ。戦闘シーンが繰り返されて、ご都合主義的ですが、全員生き残るところとか。楽しめました。続編がありますね。3部作くらいなのかな?
楽しめましたが、奥さんは戦闘シーンが多すぎるとこぼしてました。
その後は、息子の高校の3者面談、塾の3者面談に行きました。塾の冬期講習はやらない方向で息子と話していたのですが、うまい方向から提案されて、やはり冬期講習をすることになりそうです。向こうも仕事とは言え、やはり商売上手ですね。感心しました。
2012年12月20日 06:01 |
日記
| トラックバック:0
| コメント:0
MT9D111のお勉強5 で大体、MT9D111の勉強は良いかな?と思ったのだが、おるさんに教えていただいて、まだまだ理解が足りないことがわかった。もう少し勉強してみたいと思う。
Start-Up and Usage (148ページ)
スタートアップシーケンスを下に示す。
1. Power-up
2. Hardware reset
3. Configure and enable PLL
4. Configure pad slew rate
5. Configure preview mode
6. Configure and enable auto focus
7. Configure capture mode
8. Perform lock or capture
1.は電源ONしたということだ。
2.Hard Reset Sequence (149ページ)
電源ONの後はリセットする必要がある。電源が安定したらRESET#(アクティブ・ロー)をアサートする。RESET#をリリースしてから、24クロック後にI2Cがコマンドを受けられる状態になる。
1.すべての電源が規格内に入ってくるまで待つ
2.クロックを入力
3.RESET# (active LOW)を少なくとも1us の間アサートする
4.RESET# (active LOW)をディアサート(クロックは入れておく)
5.24クロック後にI2Cインターフェースが使用可能になる。
下にFigure 33を引用する。
2.Soft Reset Sequence (150ページ)
1.もしPLLを使っていれば、PLLをバイパスする。(R0x65:0=0xA000, PLL Bypass, Power-down PLL During Standby, 通常の場合はPLLがPower-downしない設定になっている)
2.R0xC3:1=0x0501 を設定して、MCUリセットを実行する。(bit0 が reset microcontroller.)
3.R0x0D:0=0x0021 に設定することでソフトリセットをイネーブル。Bit5のReset SOC とBit0の sensor core reset を行う。
4.R0x0D:0=0x0000 に設定することで、リセットをディスエーブル。
5.24クロック後にI2Cインターフェースが使用可能になる。
3.Enable PLL
入力クロックがどうなっているかわからないので、デフォルトではPLLはディスエーブルされている。
PLLはM,N,Pの値で出力周波数が決定される。 1.PLL出力周波数を設定する。(R0x66-67:0 M, N, Pを設定)
2.PLLの電源ON。(R0x65:0[14] = 0)
3.PLLのセットリング時間( > 150us)待つ。
4.PLLバイパスを解除する。(R0x65:2[15] = 0)
4.Configure Pad Slew (151ページ)
DOUT, PIXCLK, FRAME_VALID, and LINE_VALID、SDATA and SCLKのスルーレートを R10:1 で指定する。
5.Configure Preview Mode
デフォルトのプレビューのイメージサイズは800x600で、80MHzの内部クロックで30fpsで動作する。mode.output_width_A と mode.output_height_A (ファームウエアのID = 7)を変更し、seq.cmd=5 (ファームウエアのID=1, Offs=3, 値5)のREFRESHコマンドを発行することでサイズを変更できる。(プレビューはスキップ1で1画素ずつスキップしている)
例として、160x120 LCD RGBのプレビュー画面を設定する。
• mode.output_width_A=160
• mode.output_width_B=120
• mode.out_format_A=0x20
• seq.cmd=5
プレビューコントラスト、明るさ、ガンマ、フレームレート、および多くの他のパラメータもここでロードすることができます。この時点で既知である場合、ユーザーは、キャプチャのパラメータをプログラムすることができます。必要であれば、ここで、AE / WB/ AFロックコマンドを設定します。
7.Configure Capture Mode
キャプチャーのパラーターがわかっていれば(ビデオ、静止、圧縮、解像度)、modeとother drivers を設定する。
8.Perform Lock or Capture
Figure 32を引用する。
・Sequencer Driver
・シーケンサ = ステートマシン
・preview, capture などの状態を持つ。
・シーケンサは previewing, preview lock, capture, などの処理を実行している。
・シーケンサに特定の処理を実行されるためには、cmd内のプログラム番号を設定する。
・解像度を変更および/またはフレームをキャプチャする時に、ホストはステートをモニタする必要がある。
・各ステートの構成は、 (see "
Firmware Driver Variables " on page 68)
・プログラムを実行する前に、プログラムをカスタマイズするためにステート設定を設定する。例えば、圧縮されたフレームをキャプチャーするために、captureステート設定で圧縮をイネーブルする。
通常のシナリオを下に示す。
1.ハードウェア・リセット後のモード変数設定
a.プレビュー用センサ・イメージ・サイスの設定
b.ディスプレイ・イメージ・サイズの設定
c.FIFO to smooth data rate の設定
2.プレビュー・モードの設定
a.自動露出、自動ホワイト・バランス、オート・フォーカス速度のセット
3.センサ・リフレッシュ・コマンドの実行
4.シャッターボタンを押されるまでのプレビューで動作
a.シャッターボタンを半押しした時は、ロック・プログラムを実行
i. previewステートでの設定で、自動露出、自動ホワイト・バランス、オート・フォーカスをディスエーブル
ii.高速設定のためにPreviewLeaveステートで設定を行う
iii.ロック・プログラムを実行
iv.PreviewLeaveステートを通ったロック・プログラムは、ロックを実行して、Previewステートに遷移する
b.シャッターボタンが押されたら、キャプチャー・プログラムを実行する
i.すでにロックモードだったら、PreviewLeaveステートをディスエーブルして、キャプチャー・プログラムを実行する
ii.ロックステートではなく、オート・フォーカスなどの幾つかの設定が必要な場合は、PreviewLeaveステートで設定する
iii.キャプチャー・プログラムを実行する。PreviewLeaveへの遷移は、設定を実行して、キャプチャーへのモード変更を進める
5.Captureフレーム
a.イメージ・サイズ、圧縮、ビデオか写真かなどのキャプチャー・モード変数は設定されている
b.フレームを取得するキャプチャー・ステートの時は、ステート変数をモニタする
オプションで、 Capture Enter or Preview Leaveでブランクの出力をすることが出来る。これは、キャプチャーのために正しいフレームを取得する助けになる。
・ステートマシンの遷移は、Driver Variables−Sequencer Driver (ID = 1) Offs = 3 (cmd)(70ページ)
0 — Run
1 — Do Preview
2 — Do Capture
3 — Do Standby
4 — Do lock
5 — Refresh
6 — Refresh mode
・もしくは、Driver Variables−Sequencer Driver (ID = 1) Offs = 5 (stepMode)
Bit 0—Step mode On/Off (1 = On)
Bit 1—1 forces the sequencer to do next step
2012年12月19日 05:57 |
CMOSイメージセンサ
| トラックバック:0
| コメント:4
AXI VDMAはXilinx社のEDK用のIPコアだ。この使い方を勉強するので、覚書として書いておくことにした。
・
AXI VDMAのマニュアル 。ビデオ信号を取り扱う、つまり画面表示を行うIP。
・
AXI VDMA リファレンス デザイン XAPP742 (v1.0) 2012 年 5 月 3 日 も参考になる。
・AXI VDMAには、S_AXI_LITE, M_AXI_MM2S, M_AXI_S2MM, M_AXIS_MM2S, M_AXIS_S2MM の2つのポートがある。
・S_AXI_LITE は通常はプロセッサ (MicroBlaze, ARMなど) にメモリマップされて、AXI VDMAのレジスタをアクセスするために使用される。
・M_AXI_MM2S (Read Master), M_AXI_S2MM (Write Master) はメモリマップドのAXI4バス。
・M_AXIS_MM2S, M_AXIS_S2MMは、ストリーム転送のAXI4-Streamバス。
・M_AXI_MM2S でメモリからReadしたデータを M_AXIS_MM2S へAXI4-Streamとしてデータ転送する。
・M_AXIS_S2MM で画像のストリームデータを受け取り、M_AXI_S2MM でメモリへ書き込む。
・図1にXPS上のAXI VDMA IPとそのデータの流れを示す。
・HDMIから入出力するIPを付けると(Digilent社の axi_hdmi)、AXI4-Stearmで画像をやり取りするので、AXI VDMAを付けて、DDR2 SDRAMに画像をバッファする(Atlysボード)
・使い方としては、レジスタをAXI4 Liteから直接叩く方法と、Xilinx/14.3/ISE_DS/EDK/sw/XilinxProcessorIPLib/drivers/axivdma_v4_01_a/doc/html/api/index.html に書いてあるDriver を使用する方法がある。
・最初にDriver を使用する方法を勉強する。
・Driver の初期化手順
1.XAxiVdma_LookupConfig() 、構造体を選択する。
2.XAxiVdma_CfgInitialize() 、ドライバとデバイスを初期化する。
3.XAxiVdma_SetFrmStore() 、フレーム・ストアの数をセットする(オプション)。
4.割り込みが必要な場合
1.XAxiVdma_SetFrameCounter()、フレーム・カウンタをセットする。
2.各チャネルのためのコールバック関数をセットする。(コールバック関数には、一般とエラーの2つのタイプがある)
3.割り込みをイネーブルする。
・DMAトランザクションの開始
ドライバAPIを使用して、DMAトランザクションを開始するためには2つの方法がある。
1.Writeの時には、XAxiVdma_StartWriteFrame() 、Readの時には、XAxiVdma_StartReadFrame() を呼び出す
2.次に示すように順番に関数を呼び出す。
1.XAxiVdma_DmaConfig() を呼び出して、DMA操作のコンフィギュレーションを行う。
2.XAxiVdma_DmaSetBufferAddr() を呼び出して、DMAバッファを設定する。
3.XAxiVdma_DmaStart() を呼び出して、DMA操作を開始します。
・割り込み処理
各DMチャネルは2種類の割り込みをサポートしている。
1.一般割り込み:エラー以外
2.エラー割り込み:エラーが起こった時
割り込みが起こると、予め設定しておいたコールバック関数が呼び出される。
・リセット
下に示す状態になるとDMAチャネルがリセットされる。
1.Interrupts are disabled
2.Coalescing threshold is one
3.Delay counter is 0
4.RUN/STOP bit low
5.Halted bit high
6.XAXIVDMA_CDESC_OFFSET register has 0
7.XAXIVDMA_TDESC_OFFSET register has 0
リセットが終了したのを確認するために、XAxiVdma_ResetNotDone() を使用する。
次に記事は、”
AXI VDMAのお勉強2(Register Direct Mode) ”
2012年12月18日 13:22 |
IP
| トラックバック:0
| コメント:0
・Changes to Gain Settings
・R0x2B:0 : Green1 Gain (R/W) ・R0x2C:0 : Blue Gain (R/W) ・R0x2D:0 : Red Gain (R/W) ・R0x2E:0 : Green2 Gain (R/W) ・R0x2F:0 : Global Gain (R/W)
なぜ、G1とG2があるかは、”
MT9D111のお勉強4 ”の最初の図を見ればわかると思う。
Feature Description ・PLL Generated Master Clock
・センサーコアに組み込まれたPLLは80MHzまで。
・入力クロックは、6MHzから64MHzまで。
・PLLクロックは、R0x66:0 and R0x67:0 で制御している。
・R102—0x66 - PLL Control 1 (R/W)
Bit Field Description Default(Hex) Bits 15:8 M M value for PLL must be 16 or higher. 28 Bits 5:0 N N value for PLL. 9
・R103—0x67 - PLL Control 2 (R/W)
Bit Field Description Default(Hex) Bits 11:7 Reserved Do not change from default value. Bits 6:0 P P value for PLL. 1
上のR102:0 と R103:0 で指定されるPLL出力、fPLL, fOUT は下の式で表される。
fPLL, fOUT = fPLL, fIN, x M / [2 x (N+1) x (P+1)]
分母は偶数になってしまう。奇数で割れないんだね。
・Table 29(123ページを引用)
条件がキツイ気がする。PLLバイパスの方が良いか?
・R101—0x65 - Clock (R/W) (40ページ)
Bit Field Description Default (Hex) Bit 15 PLL Bypass 1—Bypass the PLL. Use CLKIN input signal as master clock. 0—Use clock produced by PLL as master clock. 1 Bit 14 PLL Powerdown 1—Keep PLL in power-down to save power (default). 0—PLL powered-up. 1 Bit 13 Power-down PLL During Standby This register only has an effect when bit 14 = 0. 1—Turn off PLL (power-down) during standby to save power (default). 0—PLL powered-up during standby. 1 Bit 2 clk_newrow Force clk_newrow to be on continuously. 0 Bit 1 clk_newframe Force clk_newframe to be on continuously. 0 Bit 0 clk_ship Force clk_ship to be on continuously. 0
Bit 15にPLL Bypassがあった。デフォルトでは、PLL Bypass。
・PLL Power-up
1. Program PLL frequency settings (R0x66:0 and R0x67:0) 2. Power up the PLL (R0x65:0[14] = 0) 3. Wait for a time longer than PLL locking time (> 1ms) 4. Turn off the PLL bypass (R0x65:0[15] = 0)
2012年12月18日 04:38 |
CMOSイメージセンサ
| トラックバック:0
| コメント:4
ブログのテンプレートを新しくしました。
ブログのテンプレートはず~と使っていて愛着があったのですが、アーカイブやカテゴリなどのリンクがリンク切れになってしまいました。たぶん、FC2のブログの設定が変更になったんだと思います。1カラムのブログのテンプレートは余り使われていないので、サポートを切ってしまったんじゃないか?と思います。今、問い合わせていますが。。。
昨日、娘の混声合唱のコンサートがあったので、仙台まで日帰り往復してきました。奥さんの実家の祖父母も連れて行ったので、740Km位走りました。帰りは深夜12時くらいになってしまって、とっても疲れました。
明日から”
MT9D111のお勉強4 ”の続きを書きます。
2012年12月16日 09:16 |
日記
| トラックバック:0
| コメント:2
・Sensor Core (116ページ) ・Pixel Array Structure
センサーコアのピクセルアレイは、1688x1256の領域があって、その一部を出力する。その指定は、R0x01:0、R0x02:0、R0x3:0、R0x4:0 で指定する。
・R0x01:0 Row Start デフォルト値 0x001C (28)
・R0x02:0 Column Start デフォルト値 0x003C (60)
・R0x03:0 Row Width デフォルト値 0x04B0 (1200)
・R0x04:0 Col Width デフォルト値 0x640 (1600)
・Figure 15: Pixel Color Pattern Detail (Top Right Corner)
フレーム最初のベイヤーパターン。Figure 15を引用する。
・Figure 18: Pixel Data Timing Exampleを引用する。
LINE_VALIDが1の時に、ピクセルデータを出力する。
・Figure 19: Row Timing and FRAME_VALID/LINE_VALID Signalsを引用する。
ピクセルクロック周波数の推奨値は36MHz
・Frame Time
・表示する画面は、Context AとContext B と2つあるようだ。どちらを表示するかは、R0xF2:0 の値で決まり、デフォルトではContext Bになる。
・Fame - Long Integration Time (シャッター幅の設定によって、Vertical Blankingが長くなってしまう)
フレーム内の行の積算時間よりもシャッター幅の方が長くなると(R0x09:0 > R0x03:0/S + BORDER + VBLANK_REG)、Vertical Blankingが長くなってしまう。その場合の V' と F' を下に示す。
V' : Vertical Blanking (long integration time) : (R0x09:0 – (R0x03:0)/S) * (A + Q) + (Q - 2*P) F' : Total Frame Time (long integration time) : (R0x09:0) * (A + Q)
2012年12月14日 05:38 |
CMOSイメージセンサ
| トラックバック:0
| コメント:6
・Firmware Driver Variables(68ページ) ・SFR and MCU SRAM と同様にR198(0xC6):1(アドレス)とR200(0xC8):1(データ)でアクセスする。
Table 9を下に引用する。
・Driver IDとオフセットによって設定値を指定する。
・Driverにアクセスする方法
1.R198(0xC6):1[15] (1 = 8bit access, 0 = 16bit access)
2.R198(0xC6):1[14:13] =
01 の時にDriver が指定される。それ以外はMCUのメモリアクセス 3.R198(0xC6):1[12:8] :Driver ID
4.R198(0xC6):1[7:0] :Driver variable offset
5.R200(0xC8):1 に16ビットか、もしくは8ビットアクセスの場合は下位8ビットにデータを書く
・MCU Register List and Memory Map Table 20: Memory Map を下に引用する。
・Special Function Register List
・Native Registers
・Math Coprocessor Registers
・Register I/O Bus Master
・SFR - GPIO
・Output Format and Timing(110ページ) ・データの出力タイミングはFRAME_VALIDとLINE_VALIDによって示される。
・FRAME_VALIDは画面の1フレームであることを示す。
・LINE_VALIDはそのラスタのピクセルデータが出力中であることを示す。
・FRAME_VALID=1, LINE_VALID=1の時にピクセルデータが出力中となる。
・YCrCb、RGB565, RGB555, RGB444x, RGBx444のタイミングはOdd, Evenで1組のデータとなる。つまり1ピクセル出力するのに2クロック必要
・ベイヤーデータは10ビットで10ビットそのまま出すモードと8ビットのデータポートに2回に分けて出すモードがある。(Odd - D9~D2、Even - 000000,D1,D0)
・R151(0x97):1 にOutput Format Configuration があった。YUV, ITU-R BT.601 codes、RGB565, RGB555, RGB444x, RGBx444を切り替える。 ・R9(0x9):1 Factory Bypassの[1:0] = 00 の時に、00 = 10-bit sensor. ベイヤー出力になると思われる。 ・JPEG Compressed Output
2012年12月13日 05:29 |
CMOSイメージセンサ
| トラックバック:0
| コメント:0
3.4.Special Function Registers (SFR) and MCU SRAM ・SFRはレジスタでマイクロコントローラのローカルバスにつながっている。
・SFRは、GPIO, waveform generatorとファームウエアの操作に重要なレジスタがある。
・SFRは、physical address でアクセスされる。
・MCU SRAMは1K のシステムメモリと1Kのユーザーメモリから構成される。(8bits単位か? 16bits単位か?)
・SFRとユーザーメモリは、R198:1(アドレス)とR200:1(データ)でアクセスする。ちなみにR198:1は、IFP page 1レジスタの198番目、つまりアドレス0xC6のレジスタへのアクセスとなる。
SFRとMCU SRAMのアクセス例を下に引用する。
• Write into user SRAM. Use to upload code a. R198:1 = 0x400 // address b. R200:1 = 0x1234 // write 16-bit value • Read from user SRAM c. R198:1 = 0x400 // address d. Read R200:1 // read 16-bit value • Write to 8-bit GPIO register e. R198:1 = 0x9079 // GPIO_DIR_L at 0x1079 f. R200:1 = 0x00FE // Configure GPIO[0] as output • Read from 8-bit GPIO register g. R198:1 = 0x9079 // GPIO_DIR_L at 0x1079 h. Read R200:1 //Check GPIO[7:0] pad state
・JPEG Indirect Registers ・アクセス方法、R30:2がアドレス、R31:2がデータでJPEG Indirect Registers にアクセスする。
・JPEG Indirect Registers のアドレスは11ビット長
・見つけたBeagleBoard用Linuxの
drivers/media/video/omap/sensor_ex3691.c ここに、”TI EX3691 (also known as Micron MT9D111) camera SOC driver. ”と書いてあった。
これを見ると、例えばRGB565にセットする時にファームウエアのドライバIDを指定して値をセットしているようだ。この操作は、R0x97:1 に値をセットするのと等価のようだ。
2012年12月12日 05:52 |
CMOSイメージセンサ
| トラックバック:0
| コメント:0
MT9D111の勉強をすることにした。その覚書を書いておく。(良くわからないところは訳になっています)
・特徴 ・リアルタイムJPEGエンコーダーが載っていて、MotionJPEGをリアルタイムエンコード出来る。(15fps)
・ITU-R BT.601 (YCbCr), 565RGB, 555RGB, 444RGB, JPEG 4:2:2, JPEG 4:2:0, and raw 10-bit で出力出来る。
・マイクロコントローラが載っている。
・解像度は、1,600 x 1,200 pixels (UXGA)
・シャッタータイプはElectronic rolling shutter (ERS) with global reset
・最大解像度で15fps
・最大データレートは80MB/s、クロックは6 MHz to 80 MHz
・レジスタと変数 4つタイプのの構成制御が可能だ。
1. Hardware registers
2. Driver variables
3. Special function registers (SFR)
4. MCU SRAM
1.レジスタ
ページが3つある。
・Page 0 contains sensor controls. (Sensor Core Registers)
・Page 1 contains color pipeline controls. (IFP Registers, Page 1)
・Page 2 contains JPEG, output FIFO and more color pipeline controls.(IFP Registers, Page 2)
レジスタへのアクセスはI2Cで行う。各レジスタの切り替えは、0xF0番地の[2:0]で行う。
Page Register
0 = sensor core
1 = IFP page 1
2 = IFP page 2
2.変数
変数は、マイクロコントローラのRAMメモリに格納されています。このような自動露出、ホワイトバランス、オートフォーカスなどの各ドライバは、独自の driver ID0 ..31)、構造体として組織化された a set of public variables を持っています。この構造体の中の各変数は一意にその構造とサイズの先頭からのオフセットによって識別されます。オフセットが1バイトである間サイズは、1または2バイトの長さになります。
・すべてのドライバ変数の設定は、R198:1(IFP Registers, Page 1の198番目 0xC6, :1はレジスタのページ1を示す)にアドレスと属性を書いて、R200:1 に値を書く。
・by physical address and by logical addressがある。R198:1で設定できる。
・public variablesは通常 logical method でアクセスする。
・R198:1は、 5-bit driver ID number and a variable offsetで構成される。
設定例 To set the variable ae.Target=50: • The variable has a driver ID of 2. Therefore, set R198:1[12:8]=2 • The variable has an offset of 6. Therefore, set R198:1[7:0]=6 • This is a logical access. Therefore, set R198:1[14:13]=01 • The size of the variable is 8 bits. Therefore, set R198:1[15]=1 • By combining these bits, R198:1=0xA206. • Set R200:1=50 for the value of the variable To read the variable ae.Target: • Since this is the same variable as the above example, R198:1=0xA206 • Read R200:1 for the current variable value
2012年12月11日 05:52 |
CMOSイメージセンサ
| トラックバック:0
| コメント:0
日昇テクノロジに発注したMT9D111メガピクセルカメラモジュール が、昨日届きました。同時に設計していた基板も出来上がり、今日、FusionPCBに発注しました。
MT9D111の外部IO電圧はIO電圧: 3.0V (+/-0.3V)Vでしたが、レベル変換を間に入れずに直結としました。たぶんまあ大丈夫だと思います。今までの
OV7670 も
OV9655 も同じように使ってきたので。。。余り人におすすめできないですけど。。。
さて、それでは、基板の回路図と基板のパターン図をお見せしたいと思います。コンデンサ以外は配線のみです。
先ずは、回路図から。
次に、基板のパターン図です。
Fusion PCBから基板が来るのが楽しみです。ZebBoardのPMODとの嵌合が心配です。
基板が来るまで、MT9D111の使い方を勉強して、IPを作っていることにします。クリスマスまでには間に合わないとFusionPCBに書いてありましたよ。
2012年12月09日 06:25 |
ZedBoard
| トラックバック:0
| コメント:0
Atlysボード で”
Atlys board support files for EDK BSB wizard. Supports EDK 13.2 - 14.2 for both AXI and PLB buses. ”
(ZIPファイルへのリンクです。注意) の Atlys_AXI_BSB_Support の中の、axi_hdmi_v1_00_a IPコアを使用して、HDMIのアプリを作っている。使用しているISEのバージョンは14.2。Project Navigator を使用している。
PlanAheadでTMDS信号をTML_33とTMDS_33(TML_33は出力用に直列に抵抗が入るそうです)に割り当てているが、下のエラーが出て、MAPが通らない。下にエラーを示す。
ERROR:Place:1413 - The following IOBs have an IO Standard that requires VCCAUX = 3.300v. This is incompatible with the device's current setting of VCCAUX = 2.500v. By default, VCCAUX = 2.5v but it can be specified to a different value in your user constraints file (UCF). Please refer to the Spartan6 FPGA SelectIO Resources User's Guide for more information on VCCAUX and the requirements of each IO Standard. IO Standard: TMDS_33 List of IOB's: TMDS_RX_0_N TMDS_RX_0_P TMDS_RX_1_N TMDS_RX_1_P TMDS_RX_2_N TMDS_RX_2_P TMDS_RX_CLK_N TMDS_RX_CLK_P ERROR:Pack:1654 - The timing-driven placement phase encountered an error.
関連する部分のUCFを下に示す。
NET "TMDS_RX_0_P" IOSTANDARD = TMDS_33; NET "TMDS_RX_1_P" IOSTANDARD = TMDS_33; NET "TMDS_RX_2_P" IOSTANDARD = TMDS_33; NET "TMDS_RX_SCL" IOSTANDARD = LVCMOS33; NET "TMDS_RX_SDA" IOSTANDARD = LVCMOS33; NET "TMDS_TX_0_P" IOSTANDARD = TML_33; NET "TMDS_TX_1_P" IOSTANDARD = TML_33; NET "TMDS_TX_2_P" IOSTANDARD = TML_33; NET "TMDS_TX_CLK_P" IOSTANDARD = TML_33; NET "CLK100M" IOSTANDARD = LVCMOS33; NET "RESET" IOSTANDARD = LVCMOS33; NET "TMDS_RX_CLK_P" IOSTANDARD = TMDS_33;
エラーの内容を読んでもわかるが、VCCAUXがデフォルトでは、2.5v で、それを 3.3v にする必要があるそうだ。
更に、関連するアンサーがあった。”
Spartan-6 および Spartan-3A Extended ジェネレーション FPGA - VCCAUX 電圧を変更する場合は CONFIG VCCAUX 制約を使用する必要がある ”
このアンサーに従って、
CONFIG VCCAUX = 3.3;
をUCFファイルの先頭に書いたところ、MAPが通った。
(追加)
Atlysボードの回路図 、10ページ目を見ると、VCCAUXにVCC3V3 が入っているのがわかる。
2012年12月07日 10:02 |
Atlysボード
| トラックバック:0
| コメント:0
ZedBoard用にCMOSカメラを付けることにした。
最初に
OV5642 を付けようと思った。性能を下に示す。
5 Mega Pixel: 2592*1944 15fps 1080P: 1920*1080 30fps 720P : 1080*720 60fps VGA : 640*480 60fps
ととっても魅力的だ。特に1080Pで30フレーム/秒出るのがとっても良い。このマニュアルを少し読んでみたところ、入出力タイミングが書いていないので、諦めることにした。
次に、
MT9D111 を考えた。性能を下に示す。
2メガピクセル画像解像度(1,600H x 1,200V) 1/3.2インチ・オプティカル・フォーマット フル画像解像度で15フレーム/秒(fps) リアルタイムJPEGエンコーダ 単一チップカメラモジュール用オンチップ・イメージフロー・プロセッサー オンチップ、10ビットADコンバータを搭載 ITU_R BT.656 (YCbCr)、565RGB、555RGB、444RGB、および未加工出力データフォーマット JPEG 4:2:2と4:2:0出力 感度: 1.0 V/lux-sec (550nm) マスタークロック: 6 MHz~80 MHz(integrated PLL) SN比: 44dB (最大) 電圧: 3.3V-5V IO電圧: 3.0V (+/-0.3V)
アプティナのCMOSセンサだし、これをZedBoardに付けることにした。
FMCコネクタはハードルが高すぎるので、2つのPMODコネクタ、JA1 と JB1 にCMOSカメラボードを付けることにした。CMOSカメラモジュールのPCLKはクロック入力なので、PMODにクロック入力用のピンが無いと困るのだが、幸い、JA4 (AA9), JA10 (AA) がSRCC だった。MT9D111 カメラモジュールのPCLKはピクセルクロック出力なので、そのどちらかのピンで受けようと思う。
なお、Zynq-7020 CLG484パッケージのピン配置は、
Xilinx のHome : Support : Package Files の
Home : Support : Zynq-7000 EPP Package Files から、
xc7z020clg484pkg.txt を見た。
SRCC は、
Zynq-7000 のTRM によると、”BUFR、BUFIO、および MMCM/PLL を駆動する CC (クロック兼用) I/O。これらのピンは、クロックに使用する必要がない場合は、通常のユーザー I/O になります。”ということだ。
次回からは、ZedBoardのPMODに刺さるCMOSカメラボードをKiCadで作製する。
2012年12月06日 05:53 |
ZedBoard
| トラックバック:0
| コメント:0
FPGAの部屋のまとめサイト を更新しました。
ZedBoard 、
Linux 、
制約 を追加して、12月5日までの記事をまとめサイトに追加しました。
2012年12月05日 05:46 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
ツイッターでXilinx JapanからRTされたので、2012年11月の検索語40位までを発表します。
まずは1位から10位まです。
1位は fpgaの部屋 でした。2位は fpga です。3位は zedboard です。5位に vivado が入っていますが、うちのWin XPでまともに動かないこともあって、1つの記事しか書いていません。でも5位なんですね。うちのWin XP はCドライブがメモリカードリーダーになっています。色々うるさいソフトがあるのでmicroSDをCドライブに入れてあるのですが、エラーが出てしまいます。
6位は designSpark pcb です。8位もそうですが、やはりVer.4.0 出たばかりなので、検索が多いんだと思います。
10位に zynq が入っています。29位にも Zynq が入っています。
11位は fpga 画像処理 です。これについてもかなり記事書いてあるからですかね?
13位に fusionpcb がランク・インしています。
14位の de0 も相変わらず多いです。
15位に、なんと init_signal_spy です。ModelSim 使いの方が多いんですね?
16位の、first word fall through はFIFOの1方式です。
次に、21位から40位まです。
21位に、axi bfm が入っています。33位に SCCB も入っていますね。DesignSpark も多いです。
おまけにどんな国からというか、どんな言語のPCでアクセスしているかです。
日本語が圧倒的ですけど(日本語で書いているので、当たり前ですね)、英語を初め、いろいろな言語でアクセスしていただいてます。
google で翻訳すると、画像が抜けちゃうのが残念です。日本語のブログ本体を読んでからだと画像来るんですが、画像だけアクセス出来ない仕様らしく、翻訳ページのみだと画像が来ません。
2012年12月04日 13:08 |
その他のFPGAの話題
| トラックバック:0
| コメント:0
MFT2012の2日も大盛況でした。アクシデントはありましたが、なんでもなくて良かったです。
今回は、色々見て回りました。そうそう、YouTubeで見た、紙で作った動くロボットと動くゴミ箱もありました。紙で作った動くロボットはご年配の方でした。動くゴミ箱の動作は機敏ですね。凄い速さでした。ゴミを見事にキャッチしていました。キネクトでやっていたんですね。そんなに速く認識できるんですね。というか動くものを認識しているんでしょう。たぶん?
色々頑張って作ってあって楽しませてもらったんですけど、驚くほど発想がユニークというのを余り見ていない気がします。衝撃をうけるほどのユニークな作品を見てみたいです。また作ってみたいですね。ディテールが決まっていて芸術作品みたいなんだけど、実はこんなことできるとか?こんな用途に使えるとか。色々考えてみます。考えている時が楽しいんですよね。
MFT2012ではいろんな方にお会いできて、名刺を交換させていただきました。来て頂いた皆さん、ありがとうございました。これからもよろしくお願いします。
2012年12月03日 05:35 |
Make出展
| トラックバック:0
| コメント:0
昨日はMFT2012の1日目でした。ものすごい人で、MTMの時よりも人が多かったですね。有料の方が人が多いのかな?
昨日の会場前のFabLab Japan の会場の様子の写真をアップします。今日も
1F, C12 のFabLab Japanの1角 (PDFです)でやっていますので、よろしくお願いします。1Fの会場を入って、ちょっと左手のすぐのところです。
やはりMakeにイベントに来るといろんなお知り合いにお会いできるのがとっても良いですね。来てくれた方、出店されていてお話できた方、本当にありがとうございました。今日も朝から行きますので、よろしくお願いします。FabLab Japanのブースは、交代制になると思いますので、もし会いに来ていただける方はツイッターのメンションで連絡ください。よろしくお願いします。
FabLab Japan ブースの左部分
左端は、iPadのアプリで子供用に気球の絵柄を自由に入力できて、それを印刷し、カッティング・ロボでカットして、子どもたちにプレゼントしていました。子供達に人気でしたよ。
FabLab Japan ブースの右部分
手前のiPadにアプリが入っていて、何年何月何日の惑星の軌道が求められて、3つの惑星で3角形を作り、グルッと回してブレスレットを作れました。指定の回数、捻ることもできるそうです。出来たものはSTLファイルで出力できて、iPad のすぐ右のブレスレットが、通常の3Dプリント(ABS)で、その右のが金属(銀)の3Dプリントだそうです。どちらも海外に発注したそうです。銀のブレスレットの3Dプリントの値段は8,000円位だそうですよ。安いですね。
アクリルサイン拡大。かっこ良い展示トレーを作って頂きました。
なお、お顔はぼかしてあります。
2012年12月02日 04:30 |
Make出展
| トラックバック:0
| コメント:0
2012年11月のFPGAの部屋のアクセス数は51,070アクセスでした。これは、過去最高です。皆さん見て頂いてありがとうございました。これからもよろしくお願いします。
やはり、ZynqやZedBoard関連のアクセスが多かったです。後は、Ver. 4.0 になったDesignSpark PCB関連ですね。
2012年度の”FPGAの部屋”の月別アクセス数の表およびグラフを貼っておきます。
ZedBoardのHDMIが画像専用だったことにちょっとがっくりしました。それを生かすために、PMODにCMOSカメラを付けてみたいです。基板を作ろうかな?と思います。
とりあえず、今日はMFT2012に展示に行きます。いろいろな方にお会いできるのが楽しみです。それでは、MFT2012の会場でお会いしましょう。展示場所の情報は、”
MFT2012出展 ”を御覧ください。
2012年12月01日 04:15 |
その他のFPGAの話題
| トラックバック:0
| コメント:0