FC2カウンター FPGAの部屋 Spartan-3A Starter KitでEDKを使ってカメラ表示16(回路をXPSに登録)
FC2ブログ

FPGAやCPLDの話題やFPGA用のツールの話題などです。 マニアックです。 日記も書きます。

FPGAの部屋

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。Xilinx ISEの初心者の方には、FPGAリテラシーおよびチュートリアルのページをお勧めいたします。

Spartan-3A Starter KitでEDKを使ってカメラ表示16(回路をXPSに登録)

Spartan-3A Starter KitでEDKを使ってカメラ表示15(SCCBコントローラの接続)”の続き。

AXIバスのEDKでキャラクタ・ディスプレイ・コントローラのカスタムIPを作る3”を参照しながら、カメラ回路とディスプレイ回路、SCCBコントローラをXPSに登録する。

1.CamDisp_EDK_OV7670\system\pcores\camera_controller_v1_00_a\dataフォルダのcamera_controller_v2_1_0.mpd を開いて、##Portsの項目にポート宣言を追加する。

PORT cam_href = "", DIR = I
PORT cam_vsync ="", DIR = I
PORT cam_pclk = "", DIR = I
PORT cam_data = "", DIR = I, VEC = [7:0]
PORT cam_clk = "", DIR = O
PORT afifo_overflow = "", DIR = O
PORT afifo_underflow = "", DIR = O


2.CamDisp_EDK_OV7670\system\pcores\display_controller_v1_00_a\dataフォルダのdisplay_controller_v2_1_0.mpd を開いて、##Portsの項目にポート宣言を追加する。

PORT red_out = "", DIR = O, VEC = [3:0]
PORT green_out = "", DIR = O, VEC = [3:0]
PORT blue_out = "", DIR = O, VEC = [3:0]
PORT hsyncx = "", DIR = O
PORT vsyncx = "", DIR = O
PORT afifo_overflow = "", DIR = O
PORT afifo_underflow = "", DIR = O
PORT addr_is_zero = "", DIR = O
PORT h_v_is_zero = "", DIR = O


3.CamDisp_EDK_OV7670\system\pcores\sccb_controller_v1_00_a\dataフォルダのsccb_controller_v2_1_0.mpd を開いて、##Portsの項目にポート宣言を追加する。

PORT SCL = "", DIR = O
PORT SDA = "", DIR = O


4.XPSでProjectメニューから> Rescan User Repositoriesを選択して、chardispc pcoreの変更をXPSに認識させる。
5.XPSで、Portsタブをクリックすると、今まで設定したすべてのポートが入っている。
Spa3A_SKit_OV7670_71_110916.png

6..Portsタブをクリックする。camera_controller_0, display_controller_0, sccb_controller_0を展開して、必要な信号をすべて選択して、右クリックメニューからMake External を選択する。
Spa3A_SKit_OV7670_72_110916.png

7.外部ピンは、名前の前にモジュール名が付いて、名前の後ろに_pinが付いたファイル名になった。(SDA, SCLは下過ぎて見えていない)
Spa3A_SKit_OV7670_73_110916.png

8.名前が長いので、適当な名前に書き換えた。sccb_controller は表示されていないが、sccb_SDA, sccb_SCLに書き変えた。
Spa3A_SKit_OV7670_74_110916.png

9.XPSのUCF File: data/system.ucfをダブルクリックして、system.ucfファイルに追加する信号の制約を追加した。

NET "cam_clk" LOC = B4;
NET "cam_data[0]" LOC = A5;
NET "cam_data[1]" LOC = B6;
NET "cam_data[2]" LOC = A6;
NET "cam_data[3]" LOC = A7;
NET "cam_data[4]" LOC = A8;
NET "cam_data[5]" LOC = A9;
NET "cam_data[6]" LOC = C10;
NET "cam_data[7]" LOC = A10;
NET "cam_href" LOC = A11;
NET "cam_pclk" LOC = A12;
NET "cam_vsync" LOC = A4;

NET "cam_clk" IOSTANDARD = LVTTL;
NET "cam_data[0]" IOSTANDARD = LVTTL;
NET "cam_data[1]" IOSTANDARD = LVTTL;
NET "cam_data[2]" IOSTANDARD = LVTTL;
NET "cam_data[3]" IOSTANDARD = LVTTL;
NET "cam_data[4]" IOSTANDARD = LVTTL;
NET "cam_data[5]" IOSTANDARD = LVTTL;
NET "cam_data[6]" IOSTANDARD = LVTTL;
NET "cam_data[7]" IOSTANDARD = LVTTL;
NET "cam_href" IOSTANDARD = LVTTL;
NET "cam_pclk" IOSTANDARD = LVTTL;
NET "cam_vsync" IOSTANDARD = LVTTL;

NET "disp_red_out[3]" IOSTANDARD = LVTTL;
NET "disp_red_out[3]" DRIVE = 8;
NET "disp_red_out[3]" SLEW = FAST;
NET "disp_red_out[3]" LOC = C8;
NET "disp_red_out[2]" IOSTANDARD = LVTTL;
NET "disp_red_out[2]" DRIVE = 8;
NET "disp_red_out[2]" SLEW = FAST;
NET "disp_red_out[2]" LOC = B8;
NET "disp_red_out[1]" IOSTANDARD = LVTTL;
NET "disp_red_out[1]" DRIVE = 8;
NET "disp_red_out[1]" SLEW = FAST;
NET "disp_red_out[1]" LOC = B3;
NET "disp_red_out[0]" IOSTANDARD = LVTTL;
NET "disp_red_out[0]" DRIVE = 8;
NET "disp_red_out[0]" SLEW = FAST;
NET "disp_red_out[0]" LOC = A3;
NET "disp_green_out[3]" IOSTANDARD = LVTTL;
NET "disp_green_out[3]" DRIVE = 8;
NET "disp_green_out[3]" SLEW = FAST;
NET "disp_green_out[3]" LOC = D6;
NET "disp_green_out[2]" IOSTANDARD = LVTTL;
NET "disp_green_out[2]" DRIVE = 8;
NET "disp_green_out[2]" SLEW = FAST;
NET "disp_green_out[2]" LOC = C6;
NET "disp_green_out[1]" IOSTANDARD = LVTTL;
NET "disp_green_out[1]" DRIVE = 8;
NET "disp_green_out[1]" SLEW = FAST;
NET "disp_green_out[1]" LOC = D5;
NET "disp_green_out[0]" IOSTANDARD = LVTTL;
NET "disp_green_out[0]" DRIVE = 8;
NET "disp_green_out[0]" SLEW = FAST;
NET "disp_green_out[0]" LOC = C5;
NET "disp_blue_out[3]" IOSTANDARD = LVTTL;
NET "disp_blue_out[3]" DRIVE = 8;
NET "disp_blue_out[3]" SLEW = FAST;
NET "disp_blue_out[3]" LOC = C9;
NET "disp_blue_out[2]" IOSTANDARD = LVTTL;
NET "disp_blue_out[2]" DRIVE = 8;
NET "disp_blue_out[2]" SLEW = FAST;
NET "disp_blue_out[2]" LOC = B9;
NET "disp_blue_out[1]" IOSTANDARD = LVTTL;
NET "disp_blue_out[1]" DRIVE = 8;
NET "disp_blue_out[1]" SLEW = FAST;
NET "disp_blue_out[1]" LOC = D7;
NET "disp_blue_out[0]" IOSTANDARD = LVTTL;
NET "disp_blue_out[0]" DRIVE = 8;
NET "disp_blue_out[0]" SLEW = FAST;
NET "disp_blue_out[0]" LOC = C7;
NET "disp_hsyncx" IOSTANDARD = LVTTL;
NET "disp_hsyncx" DRIVE = 8;
NET "disp_hsyncx" SLEW = FAST;
NET "disp_hsyncx" LOC = C11;
NET "disp_vsyncx" IOSTANDARD = LVTTL;
NET "disp_vsyncx" DRIVE = 8;
NET "disp_vsyncx" SLEW = FAST;
NET "disp_vsyncx" LOC = B11;

NET "sccb_SCL" LOC = "AA3" | IOSTANDARD = LVTTL;
NET "sccb_SDA" LOC = "AB2" | IOSTANDARD = LVTTL;


10.XPSを閉じて、Project Navigatorに戻り、Hierarchyウインドウでsystemを選択する。下のProcessesウインドウでGenerate Top HDL Source をダブルクリックして、トップレベルファイルを生成する。(外部信号を追加したため再ジェネレート)

11.ProcessesウインドウでGenerate Programming File をダブルクリックして、インプリメントを開始した。


論理合成で.ngcで指定したIPがないと言われて止まってしまいます。試行錯誤したのですが、結局、IPの.vhdファイルをそれぞれのVHDLフォルダに入れて、.paoファイルに追加しました。
これでいろいろバグはありましたが、なんとかインプリメント成功しました。

Spa3A_SKit_OV7670_75_110917.png

早速、Spartan-3A Starter Kitにコンフィグしてみたが、ディスプレイに表示しなかった。
次は、シミュレーションしてみようと思う。
  1. 2011年09月16日 05:35 |
  2. EDK
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック URL
https://marsee101.blog.fc2.com/tb.php/1908-a88406f0
この記事にトラックバックする(FC2ブログユーザー)