FPGAの部屋

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

FPGAの部屋の有用と思われるコンテンツのまとめサイトを作りました。ご利用ください。 http://marsee101.web.fc2.com/index.html

2011年09月

Spartan-3A Starter KitでEDKを使ってカメラ表示24(LCD、Rotary EncoderカスタムIPの追加2)”の続き。

前回は、.paoファイルにHDLファイルを追加するのを忘れてしまった。

rotary_encoder_v2_1_0.paoから追加する。下に内容を示す。

##############################################################################
## Filename: H:/HDL/FndtnISEWork/Spartan3A_starter_kit/CamDisp_EDK_OV7670_LCD/system/pcores/rotary_encoder_v1_00_a/data/rotary_encoder_v2_1_0.pao
## Description: Peripheral Analysis Order
## Date: Tue Sep 27 05:24:05 2011 (by Create and Import Peripheral Wizard)
##############################################################################

lib proc_common_v3_00_a all
lib plbv46_slave_single_v1_01_a all
lib rotary_encoder_v1_00_a user_logic vhdl
lib rotary_encoder_v1_00_a rotary_encoder vhdl
lib rotary_encoder_v1_00_a rot_enc_cont.vhd vhdl
lib rotary_encoder_v1_00_a ROTSW_SM.vhd vhdl
lib rotary_encoder_v1_00_a swdiv_rot.vhd vhdl


次に、lcd_controller_v2_1_0.paoの内容を下に示す。

##############################################################################
## Filename: H:/HDL/FndtnISEWork/Spartan3A_starter_kit/CamDisp_EDK_OV7670_LCD/system/pcores/lcd_controller_v1_00_a/data/lcd_controller_v2_1_0.pao
## Description: Peripheral Analysis Order
## Date: Tue Sep 27 05:26:28 2011 (by Create and Import Peripheral Wizard)
##############################################################################

lib proc_common_v3_00_a all
lib plbv46_slave_single_v1_01_a all
lib lcd_controller_v1_00_a user_logic vhdl
lib lcd_controller_v1_00_a lcd_controller vhdl
lib lcd_controller_v1_00_a lcd_ctlr.vhd vhdl


これで、XPSでProjectメニューから> Rescan User Repositoriesを選択して、生成したカスタムIPの変更をもう一度、XPSに認識させた。

(注)もう一度、元のEDKプロジェクトをコピーして、カスタムIPを作りなおしても、(PAOファイルが完全でも)やはり同様にワーニングが出ている。PAOファイルは関係なかったみたいだ。
もしかすると、複数PLBバスがあると何処にアサインするか分からないのかもしれない?


system.ucf にロータリー・エンコーダとLCDの入出力ピンの制約を追加した。追加した制約を下に示す。

# ロータリーエンコーダ
NET "rot_center" LOC = "R13" | IOSTANDARD = LVTTL | PULLDOWN ;
NET "rot_a" LOC = "T13" | IOSTANDARD = LVTTL | PULLUP ;
NET "rot_b" LOC = "R14" | IOSTANDARD = LVTTL | PULLUP ;

# LCD
NET "LCD_E" LOC = "AB4" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_RS" LOC = "Y14" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_RW" LOC = "W13" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_DB<7>" LOC = "Y15" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_DB<6>" LOC = "AB16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_DB<5>" LOC = "Y16" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_DB<4>" LOC = "AA12" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_DB<3>" LOC = "AB12" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_DB<2>" LOC = "AB17" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_DB<1>" LOC = "AB18" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;
NET "LCD_DB<0>" LOC = "Y13" | IOSTANDARD = LVCMOS33 | DRIVE = 4 | SLEW = QUIETIO ;



これでインプリメントを試みた。しかし、MAPでエラー発生。
f65e7d61.png


1つ目のエラーの内容を示す。

ERROR:MapLib:979 - LUT2 symbol "system_i/rotary_encoder_0/rotary_encoder_0/USER_LOGIC_I/rot_enc_cont_i/ROTSW_SM_inst/next_center_pulse1" (output signal=system_i/rotary_encoder_0/rotary_encoder_0/USER_LOGIC_I/rot_enc_cont_i/ROTSW_SM_inst/next_center_pulse) has input signal "system_i/rotary_encoder_0/rotary_encoder_0/USER_LOGIC_I/rot_enc_cont_i/rot_center_node" which will be trimmed. See Section 5 of the Map Report File for details about why the input signal will become undriven.


信号が削除されたので、入力が無くなったというようなエラーだった。

原因がわかったぞ。。。入出力ピンを追加したのにXPSのトップファイルを再生成していないためだ…
早速、Project NavigatorでXPSを選択して、ProcessesウインドウのGenerate Top HDL Sourceをダブルクリックした。下の図は実行後。
a167e252.png


やった~~~。MAP通った… よかった。
インプリメントが終了した。今回は、大分苦労してしまった。
036b283f.png


MAPリポートの一部を下に示す。

elease 13.2 Map O.61xd (nt)
Xilinx Mapping Report File for Design 'system_top'

Design Information
------------------
Command Line   : map -intstyle ise -p xc3s700a-fg484-4 -cm speed -ir off -pr off
-c 100 -o system_top_map.ncd system_top.ngd system_top.pcf 
Target Device  : xc3s700a
Target Package : fg484
Target Speed   : -4
Mapper Version : spartan3a -- $Revision: 1.55 $
Mapped Date    : FRI 30 SEP 5:23:31 2011

Design Summary
--------------
Number of errors:      0
Number of warnings:  251
Logic Utilization:
  Number of Slice Flip Flops:         5,830 out of  11,776   49%
  Number of 4 input LUTs:             6,458 out of  11,776   54%
Logic Distribution:
  Number of occupied Slices:          5,551 out of   5,888   94%
    Number of Slices containing only related logic:   5,551 out of   5,551 100%
    Number of Slices containing unrelated logic:          0 out of   5,551   0%
      *See NOTES below for an explanation of the effects of unrelated logic.
  Total Number of 4 input LUTs:       6,836 out of  11,776   58%
    Number used as logic:             5,900
    Number used as a route-thru:        378
    Number used for Dual Port RAMs:     320
      (Two LUTs used per Dual Port RAM)
    Number used as Shift registers:     238

  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

  Number of bonded IOBs:                114 out of     372   30%
    IOB Flip Flops:                      23
    IOB Master Pads:                      3
    IOB Slave Pads:                       3
  Number of ODDR2s used:                 24
    Number of DDR_ALIGNMENT = NONE       24
    Number of DDR_ALIGNMENT = C0          0
    Number of DDR_ALIGNMENT = C1          0
  Number of BUFGMUXs:                    10 out of      24   41%
  Number of DCMs:                         4 out of       8   50%
  Number of BSCANs:                       1 out of       1  100%
  Number of BSCAN_SPARTAN3As:             1 out of       1  100%
  Number of MULT18X18SIOs:                3 out of      20   15%
  Number of RAMB16BWEs:                  19 out of      20   95%

  Number of RPM macros:            1
Average Fanout of Non-Clock Nets:                3.28

Peak Memory Usage:  242 MB
Total REAL time to MAP completion:  29 secs 
Total CPU time to MAP completion:   25 secs 


前回、LCDコントローラとロータリー・エンコーダのコントローラを入れる前は、Number of Slice Flip Flopsが47%だったが、今回は49%だった。順調に増えているようなので、大丈夫だろう?と思う。

Spartan-3A Starter KitでEDKを使ってカメラ表示23(LCD、Rotary EncoderカスタムIPの追加)”の続き。

今回は、lcd_controller のVHDLファイルを追加し、user_logic.vhd, lcd_controller.vhd の修正を行う。

まずは、CamDisp_EDK_OV7670_LCD\system\pcores\lcd_controller_v1_00_a\hdl\vhdl にlcd_ctlr.vhd をコピーした。
266fdccc.png


user_logic.vhd を修正する。VHDLコードの主要な部分を下に示す。まだコードチェックをしていないので間違っているかもしれない。この他にもsignal宣言、component宣言、ポート宣言を追加した。

  -- lcd_ctlr.vhd を接続
  
  -- data_ena を生成する
    process( Bus2IP_Clk ) begin
        if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
            if Bus2IP_Reset = '1' then
                data_ena <= '0';
            else
                if slv_reg_write_sel="1" then
                    data_ena <= '1';
                else
                    data_ena <= '0';
                end if;
            end if;
        end if;
    end process;
    
  LCD_ctlr_i : LCD_ctlr port map (
      CLK => Bus2IP_Clk,
      RESET => Bus2IP_Reset,
      DIN => slv_reg0(C_SLV_DWIDTH-1-15 to C_SLV_DWIDTH-1); -- 下位16ビット  
      CS => data_ena,
      LCD_DB => LCD_DB,
      LCD_RS => LCD_RS, 
      LCD_RW => LCD_RW,
      LCD_E => LCD_E
  );


lcd_controller.vhd にLCD用のポート宣言とそのポート接続を追加した。ポート宣言部分の一部を下に示す。

entity lcd_controller is
  generic
  (
    -- ADD USER GENERICS BELOW THIS LINE ---------------
    --USER generics added here
    -- ADD USER GENERICS ABOVE THIS LINE ---------------

    -- DO NOT EDIT BELOW THIS LINE ---------------------
    -- Bus protocol parameters, do not add to or delete
    C_BASEADDR                     : std_logic_vector     := X"FFFFFFFF";

    ...

    -- DO NOT EDIT ABOVE THIS LINE ---------------------
  );
  port
  (
    -- ADD USER PORTS BELOW THIS LINE ------------------
    --USER ports added here
      LCD_DB : out std_logic_vector(7 downto 0);
      LCD_RS : out std_logic;
      LCD_RW : out std_logic;
      LCD_E : out std_logic;
    -- ADD USER PORTS ABOVE THIS LINE ------------------


rotary_encoder_v2_1_0.mpdを開いて、ポート宣言を追加した。

PORT rot_a = "", DIR = I
PORT rot_b = "", DIR = I
PORT rot_center = "", DIR = I


lcd_controller_v2_1_0.mpdを開いて、ポート宣言を追加した。

PORT LCD_DB = "", DIR = O, VEC = [7:0]
PORT LCD_RS = "", DIR = O
PORT LCD_RW = "", DIR = O
PORT LCD_E = "", DIR = O


XPSでProjectメニューから> Rescan User Repositoriesを選択して、生成したカスタムIPの変更をXPSに認識させた。

xps_timerはすでに入っているので、rotary_encoder, lcd_controller を右クリックメニューからAdd IPした。

XPS Core Configダイアログが開いたが、次のInstantiate and Connect IPダイアログが開かなかった。XPSを見るとrotary_encoder, lcd_controllerが入っていたが、どのPLBにも接続されていなかった。
53b16915.png


rotary_encoder, lcd_controller のSPLBをmb_plbに接続した。(MicroBlazeのPLBバス)
7ff0e528.png


Portsタブで、右クリックメニューからMake External を選択し、外部出力信号に定義した。
48b6fca4.png


External Portsの名前を変更した。
7c94bf5d.png


2fea5855.png


Addressesタブをクリックすると、rotary_encoder, lcd_controllerがUでマップされていない。
23b11f23.png


双方にSizeのプルダウンメニューから64Kを割り振った。MicroBlazeのアドレス内に入ったがBase Addressが0のままだった。
87076a89.png


rotary_encoderに0x840A0000, lcd_controllerに0x840C0000 のベース・アドレスを割り振った。
96008409.png


(追記)
なんで自動的にアドレスがマップされないのか?と思ったら、ワーニングが出ていました。

WARNING:EDK:2137 - Peripheral rotary_encoder_0 is not accessible from any processor in the system. Check Bus Interface connections and address parameters.
WARNING:EDK:2137 - Peripheral lcd_controller_0 is not accessible from any processor in the system. Check Bus Interface connections and address parameters.


考えてみたら、.paoファイルに自分で追加したファイルの設定をするのを忘れていました。後で記事を書き換えます。
もう一度、元のEDKプロジェクトをコピーして、カスタムIPを作りなおしても、(PAOファイルが完全でも)やはり同様にワーニングが出ている。PAOファイルは関係なかったみたいだ。
もしかすると、複数PLBバスがあると何処にアサインするか分からないのかもしれない?

Spartan-3A Starter KitでEDKを使ってカメラ表示22(一応完成)”の続き。

前回、CMOSカメラの画像データをディスプレイに表示することができた。それでも、MicroBlazeプロセッサは何も仕事をしていない。ハードウェアだけで表示している。これでは、MicroBlazeプロセッサがかわいそうなので、仕事を割り振ることにした。以前はSMMでやっていたのだが、LCDに主要なCMOSカメラのパラメータを表示して、ロータリー・エンコーダでパラメータを設定して、LCDで表示するという機能をMicroBlazeに割り振ることにした。(”The Simple MicroBlaze Microcontroller 19 (SCCB設定レジスタを設定できたが...)”参照)
Cソースはあるのだが、SMM用なので、MicroBlaze用に修正する必要がある。例えば、タイマーはSMM用でなく、axi_timerを使用するので、そこは修正が必要だ。後はアドレスは修正する必要がある。

さて、今までのXPSプロジェクトにlcd_controller とrotary_encoder の新しい2つのカスタムIPを生成した。2つともスレーブIPだ。
4aa383eb.png


まずはロータリー・エンコーダの方から、関連するVHDLファイルをコピーした。
c17c498e.png


user_logic.vhd を修正する。VHDLコードの主要な部分を下に示す。まだコードチェックをしていないので間違っているかもしれない。この他にもsignal宣言、component宣言、ポート宣言を追加した。

  -- implement slave model software accessible register(s) read mux
  SLAVE_REG_READ_PROC : process( slv_reg_read_sel, slv_reg0 ) is
  begin

    case slv_reg_read_sel is
      when "1" =>
        slv_ip2bus_data(0 to C_SLV_DWIDTH-5) <= (others => '0');
        slv_ip2bus_data(C_SLV_DWIDTH-4) <= center_hold;
        slv_ip2bus_data(C_SLV_DWIDTH-3) <= left_hold;
        slv_ip2bus_data(C_SLV_DWIDTH-2) <= right_hold;
        slv_ip2bus_data(C_SLV_DWIDTH-1) <= '0';
      when others => slv_ip2bus_data <= (others => '0');
    end case;

  end process SLAVE_REG_READ_PROC;

  ------------------------------------------
  -- Example code to drive IP to Bus signals
  ------------------------------------------
  IP2Bus_Data  <= slv_ip2bus_data when slv_read_ack = '1' else
                  (others => '0');

  IP2Bus_WrAck <= slv_write_ack;
  IP2Bus_RdAck <= slv_read_ack;
  IP2Bus_Error <= '0';

    -- rot_enc_cont.vhd を接続
    
    -- CS_rot_enc_wr を生成する
    process( Bus2IP_Clk ) begin
        if Bus2IP_Clk'event and Bus2IP_Clk = '1' then
            if Bus2IP_Reset = '1' then
                CS_rot_enc_wr <= '0';
            else
                if slv_reg_write_sel="1" then
                    CS_rot_enc_wr <= '1';
                else
                    CS_rot_enc_wr <= '0';
                end if;
            end if;
        end if;
    end process;    
    
    -- ロータリーエンコーダ
    rot_enc_cont_i : rot_enc_cont port map(
        clk => Bus2IP_Clk,
        reset => Bus2IP_Reset,
        rot_a => rot_a,
        rot_b => rot_b,
        rot_center => rot_center,
        right_pulse => right_pulse,
        left_pulse => left_pulse,
        center_pulse => center_pulse
    );
    
    -- right_pulse, left_pulse をホールドするFF
    process(Bus2IP_Clk) begin
        if Bus2IP_Clk'event and Bus2IP_Clk='1' then
            if Bus2IP_Reset='1' then
                right_hold <= '0';
                left_hold <= '0';
                center_hold <= '0';
            else
                if right_pulse = '1' then
                    right_hold <= '1';
                elsif CS_rot_enc_wr='1' then 
                    right_hold <= '0';
                end if;
                
                if left_pulse='1' then
                    left_hold <= '1';
                elsif CS_rot_enc_wr='1' then
                    left_hold <= '0';
                end if;
                
                if center_pulse='1' then
                    center_hold <= '1';
                elsif CS_rot_enc_wr='1' then
                    center_hold <= '0';
                end if;
            end if;
        end if;
    end process;


レジスタReadのcenter_hold, left_hold, right_hold のビット割り当ては、以前のSMMの時のハードウェアに合わせてある。

rotary_encoder.vhd にロータリー・エンコーダ用のポート宣言とそのポート接続を追加した。ポート宣言部分の一部を下に示す。

entity rotary_encoder is
  generic
  (
    -- ADD USER GENERICS BELOW THIS LINE ---------------
    --USER generics added here
    -- ADD USER GENERICS ABOVE THIS LINE ---------------

    -- DO NOT EDIT BELOW THIS LINE ---------------------
    -- Bus protocol parameters, do not add to or delete
    C_BASEADDR                     : std_logic_vector     := X"FFFFFFFF";
    
    ...

    -- DO NOT EDIT ABOVE THIS LINE ---------------------
  );
  port
  (
    -- ADD USER PORTS BELOW THIS LINE ------------------
    --USER ports added here
    rot_a : in std_logic;
    rot_b : in std_logic;
    rot_center : in std_logic;
    -- ADD USER PORTS ABOVE THIS LINE ------------------


ロータリー・エンコーダのA相(rot_a)、B相(rot_b)、センター・スイッチ(rot_center)を入力ポートとして定義した。

FPGAの部屋のまとめサイトを更新しました。
EDK, ISim, Core Generator, MicroBlazeクロスコンパイル, VHDLの書き方のページを更新しました。特にEDKのページの追加がほとんどです。

FPGA ボードで学ぶ組込みシステム開発入門 ~Altera編~”を買いました。FPGAの本です。

まだ1/3しか読んでいませんが、DE0やDE1のFPGAボードで、FPGAを初歩から勉強していく方にお勧めの本だと思いました。ただ、論理回路の知識は前提条件として必要です。

巻末を見ると、なんと、第4章のSignalTap II の参考Webサイトとして、FPGAの部屋のまとめサイトが載っていました。びっくり。
第5章 Nios II プログラミング、ROM化方法ではSim's blogさんが、第6章のAvalonバス関連では長船さん(FPGA技術 No.5)が参考文献・Webサイトとして載っていました。

読みやすい本でとても良いと思いますが、シミュレーションの記述がないのが残念だと思いました。ModelSimについて解説して欲しかったです。ページ数が増えてしまうと思いますが、ぜひシミュレーションを実行するというステップをFPGA初心者の方にも習慣付けて欲しいと思っています。

本の中で紹介のあるサポートベージが見つかりません。現在、出版社に問い合わせ中です。サポートベージが見つかれば、少しやってみたいと思っています。

著者の小林優さんは、本当に近くに来られることがあるようなので、今度一度、お会いしてお話ししてみたいと思っています。

(2011/9/26:追記)
FPGAボードで学ぶ組込みシステム開発入門 ~Altera編~のサポートベージが開設されました。ここからDE0とDE1用のファイルがダウンロードできます。

↑このページのトップヘ