FC2カウンター FPGAの部屋 SMM
FC2ブログ

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

FPGAの部屋

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

The Simple MicroBlaze Microcontroller 7 (50MHzから25MHzへクロックを変更)

今回はSMMリファレンスデザインのクロック周波数を50MHzから25MHzに変更してみる。
今まではWorkの下にリファレンスデザインをコピーしてやっていた。今回は面倒なので、”The Simple MicroBlaze Microcontroller 6(シミュレーション)”までで出来上がっているWorkの下のリファレンスデザインフォルダをWork25Hzにコピーしてやってみることにした。

まずはISEから。50MHzクロックから25MHzの変換するDCMを追加する。Project Navigatorを立ち上げて、右クリックメニューからAdd Source...で、CoreGenのSingle DCM_SPを追加する。出てきたXilinx Clocking Wizard でInput Clock Frequency を50MHz、CLKDVにチェックして、Divide By Value を2にする。
SMM_34_101204.png

lcd_ref.vhdにDCM50_to_25MHzのインスタンスを追加する。CLKDVに接続されたclkを他の回路のクロックとして使用するように変更した。更に他の回路のリセットはreset_lockedに変更した。

-- DCM50_to_25MHz
    Inst_DCM50_to_25MHz: DCM50_to_25MHz PORT MAP(
        CLKIN_IN => Clock,
        RST_IN => Reset,
        CLKDV_OUT => clk,
        CLKIN_IBUFG_OUT => open,
        CLK0_OUT => open,
        LOCKED_OUT => dcm_locked
    );
    reset_locked <= not dcm_locked;


それから、lcd_ctrl.vhdの記述を20ns から40ns に変更した。

constant CLK_PERIOD : integer := 40 ; -- in ns 50MHzから25MHzに変更
-- constant CLK_PERIOD : integer := 20 ; -- in ns


変更は完了したので、これでインプリメントしたら、無事にインプリメントできた。
SMM_35_101204.png

次はSDK。予め、led_reg.c の7行目の”#define CLOCK_PERIOD_NS”を20から40に変更しておいて、SDK12.3を起動した。workspace をWork25Hz/sdkに指定したが、led_ref.cの7行目の”#define CLOCK_PERIOD_NS”は、20のままだった。見ているled_ref.c は以前のファイルになっているようだ。一旦、led_ref.c を削除して、Work25Hz/sdk/led_ref.c をドラック & ドロップでプロジェクトに入れた。
Xilinx ToolsメニューからProgram FPGAを選択して、Program FPGAダイアログが開いたが、Hardware Configuration内のBitstreamもBMM Fileも、以前のWorkフォルダでやっていたときのままのファイルが表示されている(下図参照)。(”The Simple MicroBlaze Microcontroller 4(リファレンスデザイン2)”参照)
ISEはフォルダごとコピーしても、コピーしたフォルダのファイルを使用(相対パス)して、上手くいくが、SDKはプロジェクトを作り直したほうが良いかもしれない?
SMM_36_101204.png

これを、現在のWorkのWork25Hzフォルダの下のファイルに変更した。ELFファイルも指定して、Programボタンをクリックして、FPGAをコンフィグしたら、問題なく文字が表示された。
SMM_23_101127.jpg

これで、動作周波数を25MHzに変更できたので、Spartan-3A Starter Kitによる画像演奏装置に組み込んで、表示を試してみようと思う。
  1. 2010年12月04日 05:58 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller 6(シミュレーション)

SMMの問題点はシミュレーションができないことだと思う。実機デバックはできるが、シミュレーションは出来ない。EDKを使えばできるのかもしれない?が、それではISEだけでシンプルに実装する目的と合わない。
という訳で、SMMの周辺回路をシミュレーションする簡単なSMMのバスモデルを作ってみた。言語はサンプルがVHDLだったので、VHDLで作った。ISE12.3を使用している。
SMM_noUART_sim_pack.vhdがSMMのWriteサイクルとReadサイクルを行う。と言っても、コードを見てもらえば、すぐわかるようにとても簡単だ。WriteはWR_ADDRにアドレス、WR_DATAにデータ、WR_BEにバイト・イネーブルをセットして、procedureをコールすれば、SMMのWriteサイクルが起動する。Readサイクルは、RD_ADDRにアドレス、RD_BEにバイト・イネーブルをセットすれば、RD_DATAにReadしたデータが出力される。下に、SMM_noUART_sim_pack.vhdを示す。ほとんど”procedureを使うときの注意点”のコードと同じ。

-- SMM_noUART用パッケージ

library ieee;
use ieee.std_logic_1164.all;

package SMM_noUART_sim_pack is
    procedure SMM_WR_CYCLE(
        WR_ADDR : in std_logic_vector; -- 書き込みアドレスをセットする
        WR_DATA : in std_logic_vector; -- 書きこむデータをセットする
        WR_BE : in std_logic_vector; -- 書きこむBEをセットする
        
        signal clk : in std_logic;
        signal rnw : out std_logic;
        signal cs : out std_logic;
        signal addr : out std_logic_vector;
        signal dout : out std_logic_vector;
        signal be : out std_logic_vector
    );
    
    procedure SMM_RD_CYCLE(
        RD_ADDR : in std_logic_vector; -- 読み出しアドレスをセットする
        RD_BE : in std_logic_vector; -- 読み出し時のBEをセットする
        signal RD_DATA : out std_logic_vector; -- 読み出しデータ
        
        signal clk : in std_logic;
        signal rnw : out std_logic;
        signal cs : out std_logic;
        signal addr : out std_logic_vector;
        din : in std_logic_vector;
        signal be : out std_logic_vector
    );
end SMM_noUART_sim_pack;

package body SMM_noUART_sim_pack is
    procedure SMM_WR_CYCLE(
        WR_ADDR : in std_logic_vector; -- 書き込みアドレスをセットする
        WR_DATA : in std_logic_vector; -- 書きこむデータをセットする
        WR_BE : in std_logic_vector; -- 書きこむBEをセットする
        
        signal clk : in std_logic;
        signal rnw : out std_logic;
        signal cs : out std_logic;
        signal addr : out std_logic_vector;
        signal dout : out std_logic_vector;
        signal be : out std_logic_vector
    ) is
    begin
        wait until clk'event and clk='1'; -- clkの立ち上がりまでwait
        wait for 1 ns; -- 遅延を挟んで
        rnw <= '0'; -- Write
        cs <= '1'; -- enable
        addr <= WR_ADDR;
        dout <= WR_DATA;
        be <= WR_BE;
        
        wait until clk'event and clk='1'; -- clkの立ち上がりまでwait
        wait for 1 ns; -- 遅延を挟んで
        cs <= '0';
    end SMM_WR_CYCLE;
    
    procedure SMM_RD_CYCLE(
        RD_ADDR : in std_logic_vector; -- 読み出しアドレスをセットする
        RD_BE : in std_logic_vector; -- 読み出し時のBEをセットする
        signal RD_DATA : out std_logic_vector; -- 読み出しデータ
        
        signal clk : in std_logic;
        signal rnw : out std_logic;
        signal cs : out std_logic;
        signal addr : out std_logic_vector;
        din : in std_logic_vector;
        signal be : out std_logic_vector
    ) is
    begin
        wait until clk'event and clk='1'; -- clkの立ち上がりまでwait
        wait for 1 ns; -- 遅延を挟んで
        rnw <= '1'; -- Read
        cs <= '1'; -- enable
        addr <= RD_ADDR;
        be <= RD_BE;
        
        wait until clk'event and clk='1'; -- clkの立ち上がりまでwait
        RD_DATA <= din;
        wait for 1 ns; -- 遅延を挟んで
        cs <= '0';
    end SMM_RD_CYCLE;
end SMM_noUART_sim_pack;


次にSMMのシミュレーション・モデルを下に示す。process beginの下のwait for 100 ns;の下に試してみたいスティミュラスを記述する。今回は、タイマーに16をセットして、割り込みがかかるのを待ってから、LCDの命令レジスタにX"34"を書きこむ。次に、South Pushbuttonスイッチの状態をReadする。

-- SMMのシミュレーションモデル
-- IO、Interruptのモデル、シリアル無し

library IEEE;
use IEEE.STD_LOGIC_1164.ALL;
use IEEE.STD_LOGIC_ARITH.ALL;
use IEEE.STD_LOGIC_UNSIGNED.ALL;

library work;
use work.SMM_noUART_sim_pack.all;

entity smm is
    port (
      CLK : in std_logic;
      RESET : in std_logic;
      DIN : in std_logic_vector(0 to 31);
      DOUT : out std_logic_vector(0 to 31);
      BE : out std_logic_vector(0 to 3);
      RNW : out std_logic;
      ADDR : out std_logic_vector(0 to 15);
      CS : out std_logic;
      INTERRUPT : in std_logic;
      INTERRUPT_ACK : out std_logic
    );
end smm;

architecture sim_model of smm is
constant LCD_ADDR : std_logic_vector :=     X"0000";
constant TIMER_ADDR : std_logic_vector :=     X"0010";
constant BUTTON_ADDR : std_logic_vector :=    X"0020";
signal rd_data : std_logic_vector(0 to 31);
type INTERRUPT_STATE is (IDLE_INTR, WAIT_INTR1, WAIT_INTR2, INTR_ACK, WAIT_INTR_LOW);
signal intr_cs : INTERRUPT_STATE;
signal INTERRUPT_ACK_node : std_logic;
begin
    -- 割り込み用ステートマシン
    process(clk, reset) begin
        if reset='1' then
            intr_cs <= IDLE_INTR;
            INTERRUPT_ACK_node <= '0';
        elsif clk'event and clk='1' then
            case intr_cs is
                when IDLE_INTR =>
                    if INTERRUPT='1' then -- 割り込み
                        intr_cs <= WAIT_INTR1;
                    end if;
                when WAIT_INTR1 =>
                    intr_cs <= WAIT_INTR2;
                when WAIT_INTR2 =>
                    intr_cs <= INTR_ACK;
                    INTERRUPT_ACK_node <= '1';
                when INTR_ACK =>
                    intr_cs <= WAIT_INTR_LOW;
                    INTERRUPT_ACK_node <= '0';
                when WAIT_INTR_LOW =>
                    if INTERRUPT='0' then
                        intr_cs <= IDLE_INTR;
                    end if;
            end case;
        end if;
    end process;
    INTERRUPT_ACK <= INTERRUPT_ACK_node after 1 ns;
    
    process begin
        DOUT <= (others => '0');
        BE <= (others => '0');
        ADDR <= (others => '0');
        CS <= '0';
        
        wait for 100 ns;
        
        -- これから下のwaitまでの間にスティミュラスを書く
        
        SMM_WR_CYCLE(TIMER_ADDR, X"00000010", "1111", clk, rnw, cs, addr, dout, be); -- Timerへ書き込み、16クロックカウント
        
        wait until INTERRUPT_ACK_node'event and INTERRUPT_ACK_node='1'; -- INTERRUPT_ACK_node の立ち上がりまでwait
        wait for 1 ns;
        
        SMM_WR_CYCLE(LCD_ADDR, X"12340000", "1111", clk, rnw, cs, addr, dout, be); -- LCDへ書き込み
        
        -- ボタンの状況をrd_dataに読み出し
        SMM_RD_CYCLE(BUTTON_ADDR, "1111", rd_data, clk, rnw, cs, addr, din, be);
        
        wait;
    end process;
end sim_model;


次にテストベンチだが、これはSouth PushbuttonスイッチのButton_Sを1にして、ひたすらwaitするだけだ。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
 
-- Uncomment the following library declaration if using
-- arithmetic functions with Signed or Unsigned values
--USE ieee.numeric_std.ALL;
 
ENTITY lcd_ref_tb IS
END lcd_ref_tb;
 
ARCHITECTURE behavior OF lcd_ref_tb IS 
 
    -- Component Declaration for the Unit Under Test (UUT)
 
    COMPONENT lcd_ref
    PORT(
         Clock : IN  std_logic;
         Reset : IN  std_logic;
         Button_S : IN  std_logic;
         LCD_DB : OUT  std_logic_vector(7 downto 0);
         LCD_RS : OUT  std_logic;
         LCD_RW : OUT  std_logic;
         LCD_E : OUT  std_logic
        );
    END COMPONENT;
    

   --Inputs
   signal Clock : std_logic := '0';
   signal Reset : std_logic := '1';
   signal Button_S : std_logic := '0';

     --Outputs
   signal LCD_DB : std_logic_vector(7 downto 0);
   signal LCD_RS : std_logic;
   signal LCD_RW : std_logic;
   signal LCD_E : std_logic;

   -- Clock period definitions
   constant Clock_period : time := 20 ns;
 
BEGIN
 
    -- Instantiate the Unit Under Test (UUT)
   uut: lcd_ref PORT MAP (
          Clock => Clock,
          Reset => Reset,
          Button_S => Button_S,
          LCD_DB => LCD_DB,
          LCD_RS => LCD_RS,
          LCD_RW => LCD_RW,
          LCD_E => LCD_E
        );

   -- Clock process definitions
   Clock_process :process
   begin
        Clock <= '0';
        wait for Clock_period/2;
        Clock <= '1';
        wait for Clock_period/2;
   end process;
 

   -- Stimulus process
   stim_proc: process
   begin        
    reset <= '0';
    Button_S <= '0';
    -- hold reset state for 100 ns.
      wait for 100 ns;    
        Button_S <= '1';
        reset <= '0';
      wait for Clock_period*100;

      -- insert stimulus here 

      wait;
   end process;

END;


これをISEにシミュレーション専用でプロジェクトに追加すると、ImplementationとSimulationでSMMが切り替わってとても具合が良い。
SMM_31_101202.png
SMM_32_101202.png

これでISimでシミュレーションをした結果を下に示す。
SMM_33_101202.png

最初にcsが1になって0に戻ったところで、タイマーに16をセットして、その間waitして、interrupt_ackが来たら、wait状態から抜けだして、次のcs=1でLCDの命令レジスタにX"34"を書きこむ。その結果として、lcd_dbが34になって、lcd_eが260nsecの間、1になる。その次のcs=1でbutton_sの内容をrd_dataの最上位ビットに読み込む。

これで、SMM周辺回路のシミュレーションでのデバックは出来る状況になったと思う。
  1. 2010年12月02日 04:47 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller 5(デバック機能)

今度はSMMのデバック機能を使ってみることにした。
The Simple MicroBlaze Microcontroller 3(リファレンスデザイン)The Simple MicroBlaze Microcontroller 4(リファレンスデザイン2)のSMMはUARTなし、Debugなしだったが、今回は、SMM_S3\SMM_DBG_noUARTの下のhwフォルダのsmm.bmm, smm.ngcをコピーしてISEで再度インプリメントを行った。
次に、MM_S3\SMM_DBG_noUARTの下のswフォルダのsmm.xmlファイルをコピーして、同様にEmpty Application を作成した。
SMM_23_101128.png

今度は、SMM_DEG_noUART_hw_platform と表示されていた。

次にDebugを行う。最初に、Xilinx ToolsメニューからProgram FPGAを選択して、Spartan-3A Starter Kitをコンフィグして置かないとだめみみたいだ。LCDに文字が表示されている。
SMM_23_101127.jpg

RunメニューのDebug Configurationを選択する。Debug Configurations ダイアログが起動する。Xilinx C/C++ ELFを展開して、empty_application_0 Debugを選択する。Debugボタンをクリックする。
SMM_24_101128.png

Error opening JTAG UARTと表示されて、心配になったが、Confirm Perspective Switchダイアログが出てきたので、Yesボタンをクリックした。
SMM_25_101128.png

Debug用のウインドウになった。main関数の最初のmicroblaze_register_handlerがポイントされている。button_push関数は値が入っていないので、Xになっている。
SMM_26_101128.png

lcd_init();の左をクリックして、ブレークポイントを設定し、RunメニューからResumeを選んだら、ブレークポイントまで実行された。
SMM_27_101128.png

その後、Step IntoやStep Overも試したが、意図どおり実行された。
main関数の中のbutton_push変数が初期化された後にブレークポイントを設定して、実行したら、button_push変数に値が表示された。
SMM_28_101128.png

South Pushbuttonをおしながら、Step Intoすると、button_push変数が-128になった。
SMM_29_101128.png

Step Overしていく。lcd_clear();を実行すると、LCDがクリアされた。
lcd_print(1, "Thank You!");を実行すると、Thank You!がLCDに表示された。
SMM_24_101127.jpg

デバック機能はうまく行ったようだが、元の表示に戻すのはどうやれば良いだろうか?
いろいろ試してみよう。

(追加)
Windows メニューからOpen Perspective -> C/C++を選択すると、元のプロジェクトの表示に戻りました。
SMM_30_101128.png

(2010/12/20追加)
Debug を終了する方法。Debug モードからC/C++モードに戻るのに、Debug を終了する必要がある。それは、Debug
ウインドウのTerminateアイコンをクリックする。
SMM_59_101220.png
  1. 2010年11月28日 05:47 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller 4(リファレンスデザイン2)

The Simple MicroBlaze Microcontroller 3(リファレンスデザイン)”の続き。

FileメニューからNew -> Xilinx C Project を選択する。
SMM_16_101126.png

New Project ダイアログでEmpty Application を選択して、Next>ボタンをクリックする。
SMM_17_101126.png

Target an existing Board Support Package のラジオボタンをチェックして、standalone_bsp_0 を選択する。Finishボタンをクリックする。
SMM_18_101126.png

sdk\lcd_ref\srcフォルダのled_ref.c をProject Explorer のempty_application_0のsrc フォルダにドラック & ドロップする。
SMM_19_101126.png

そうすると、自動でビルドしてしまったようだ。
SMM_20_101126.png

Xilinx ToolsメニューからProgram FPGAを選択する。
SMM_21_101126.png

Program FPGAダイアログが開く。Hardware Configuration内のBitstreamにiseフォルダのled_ref.bitを指定する。BMM Fileに同じiseフォルダのbmm_bd.bmm を指定する。Software Configuration内のELF File to Initialize in Block RAMにsdk\empty_application_0\Debug\empty_application_0.elf を下向き三角をクリックして指定する。
SMM_22_101127.png

ここで、Spartan-3A Starter Kitの電源を入れて、コンフィギュレーション用のUSBケーブルを接続し、上のダイアログのProgramボタンをクリックする。(ここでは、DATA2MEMが起動して、.elfと.bmmを参照して、.elfのソフトウェアを.bitのBRAMの初期化データにロードする。そうしてできた.bitファイルをSpartan-3A Starter Kitにダウンロードする訳だ)
そうすると、LCDに”MicroBlaze on S3 Reference Design”と表示された。
SMM_23_101127.jpg

次に、South Pushbuttonをクリックすると、その表示が消えて、”Thank You!”と表示された。
SMM_24_101127.jpg

これでリファレンスデザインはできた。これからは、内容を解析して、LCDの制御を勉強したい。その後は、もう一度ロータリーエンコーダを制御してみたい。
  1. 2010年11月27日 05:05 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller 3(リファレンスデザイン)

今回はXAPP1141 Ver.3.0の25ページのリファレンスデザインをやってみる。ISE,SDKとも12.3を使用した。このリファレンスデザインは、Spartan-3A Starter Kitを使用して、そのLCDに”MicroBlaze on S3 Reference Design”と表示して、South Pushbuttonを押すと、その表示が消えて、”Thank You!”と表示する。今のやりたい事に近い、魅力的なリファレンスデザインだ。
さて、それでは、SMM FPGA Design Flowからやってみたいと思う。ISE12.3を立ち上げて、FileメニューからOpen Project...を選んで出てきたOpen Projectダイアログからiseフォルダの下のlcd_ref.xiseを選択する。
SMM_4_101126.png

すると、プロジェクトがロードされて、もうすでにプロジェクトが出来上がっているので、ProcessesウインドウのGenerate Programming Fileをダブルクリックして、.bitファイルを生成する。
SMM_5_101126.png

インプリメントできあました。
SMM_6_101126.png

iseフォルダを見ると、smm_db.bmm とlcd_ref.bit が出来ています。
SMM_7_101126.png

これでISEでのフローはお終い。

次に、SDKでのフロー。SDKを起動する。
SMM_3_101125.png

sdkフォルダをWorkspaceに指定して、Okボタンをクリックする。
SMM_8_101126.png

SDKが立ち上がる。
SMM_9_101126.png

FileメニューのNew -> Xilinx Board Support Package を選択する。
SMM_10_101126.png

No Hardware Platform in the Workspaceダイアログがでるので、Specifyボタンをクリックする。
SMM_11_101126.png

New Hardware Projectダイアログが開く。Target Hardware SpecificationのBrowse...ボタンをクリックすると、ダイアログが出る。sdkフォルダのsmm.xmlファイルを選択して”開く”ボタンをクリックする。
SMM_12_101126.png

Finishボタンをクリックする。
すると、New Board Support Package Projectダイアログが出る。Board Support Package OSでstandalone が選択されているので、そのままFinishボタンをクリックする。
SMM_13_101126.png

Board Support Package Settingsダイアログが出る。OKボタンをクリックする。(ここでは、TCP/IPスタック、フラッシュ、メモリのファイルシステムのライブラリとかも選べるみたいだ)
SMM_14_101126.png

これで、ハードウェアの仕様をロードすることができた。いろいろ選ぶところがあって面倒だが、それだけ機能があるということなんだろう?
SMM_15_101126.png

さて、XAPP1141 Ver.3.0は次にプロジェクトをインポートするようになっているが、それでは、インクルードファイルがリンクできずにエラーになってしまった。
ここからは独自の方法(というか、適当にやってみた方法)でプロジェクトを構築する。

このへんでお時間となってしまったので、続きます。

The Simple MicroBlaze Microcontroller 4(リファレンスデザイン2)”に続く。
  1. 2010年11月26日 05:47 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller 2 (概要)

前回の”The Simple MicroBlaze Microcontroller”の時はアプリケーションノートのバージョンが1.0だったが、今度見たときにはVer3.0になっていて、ISE12に対応していた。XAPP1141のデザインファイルはここ(登録とライセンスの承認が必要)。
The Simple MicroBlaze Microcontroller(以下SMM)は、Xilinx Platform Studio (XPS) を使わないで使えるMicroBlazeだ。もともと、IPの形になっているので、ISEからインスタンスして手軽に使うことができる。EDKでやると、MicroBlazeが主で、もっと大きい他の回路が従となってしまって、どうも納得がいかないのだが(ISEからEDKをIPとして使う方法があったので削除します。でもいちいちジェネレートする面倒くさいさはありますね)、これならばハードウェアはISEで全部行うことができる。ただし、ソフトウェアをつくるのに、SDKが必要なので、EDKのライセンスは必要だ。(WebPACKで使えたら良かったのだが、残念。。。)XPSはカスタマイズするのに必要となる。
SMM Ver3.0は、Spartan-6、Spartan-3A 、Virtex-6、Virtex-5で使用することができる。
主な特徴を下に示す。

・32ビットMicroBlaze
・8KB内部ROM/RAM
・ソフトウェアはコンフィギュレーション時にBRAMにロード
・32ビット幅のIO
・64KBのユーザースペース
・割り込み入力
・オプションでUART
・フルC, C++サポート
・オプションでデバック・サポート


SMMには、4つのネットリストがある。

・SMM + UART + Debug Support
・SMM + UART
・SMM + Debug Support
・SMM


SMMのフローは、SMM FPGA Design FlowとThe SMM Softwar Flowに分かれている。SMM FPGA Design FlowはISEで、The SMM Softwar FlowはSDKで行う。
SMM FPGA Design Flowの説明用に、XAPP1141 Ver.3.0の7ページのFigure 6: ISE Design Flowを引用させていただく。
SMM_1_101124.png

SMMはVerilogやVHDLでインスタンスを作って使用する。XSTで論理合成後に、Traslateで、SMMのIPのsmm.ngcと8KB内部ROM/RAMに対するBRAMの割り当てファイルのsmm.bmm と連結される。MAP,P&Rを経て、BitGenで.bitファイルとsmm_bd.bmm が生成される。smm_bd.bmm には、DATA2MEMが必要とする実際の配置が書き加えられている。

The SMM Softwar Flowの説明用に、XAPP1141 Ver.3.0の12ページのFigure 12: SDK Design Flowを引用させていただく。
SMM_2_101124.png

smm.xmlを読み込んで、プロジェクトに必要な情報を設定して、CやC++ソースをコンパイル、リンクして、.elfファイルを生成する。先ほどの.bitファイルとsmm_bd.bmmを使って、.bitファイルに.elfファイルのソフトウェアをロードして、新しい.bitファイルを作る。その.bitファイルをFPGA基板にロードして、動作させる。

こんなフローでSMMは動作する。次回は、リファレンスデザインをやってみることにする。XAPP1141 Ver.3.0の通りにやってもできなかったが、工夫してうまく行ったのだ。。。

SMMは、CMOSカメラの設定レジスタを設定するために、LCDとロータリーエンコーダ、スイッチを制御するのに使用する予定です。
  1. 2010年11月24日 17:05 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:0

The Simple MicroBlaze Microcontroller

Xilinx社から送られてきた、最新号のXellジャーナル日本語版を読んでいたが、色々面白い記事があった。今手元にないんだが、確か69,70合併号だと思う。Virtex-6のリオーダーできるDDR? SDRAMコントローラとか(リオーダー方式のコントローラによるDDR SDRAMの効率化、18ページ~21ページ)。。中でもEDKを使わないMicroBlazeの記事(シンプルMicroBlazeマイロ コントローラ (SMM) のコンセプト、26ページ~29ページ)に興味を持った。これって、出来合いのMicroBlazeで、色々コンフィグしなくても使えるMicroBlaze?もしかしてWebPACKでもMicroBlazeが使えるのだろうか?
詳しい情報はXAPP1141にあるとのこと。XAPP1141のデザインファイルはここ(登録とライセンスの承認が必要)。簡単に説明すると、決まった機能のMicroBlazeを予め論理合成して、IPとして配布されていて、そのIP (smm.ngc) をISEで使えるということ。bmmファイルも同時に配布されているので、Data2MEMでソフトウェアもロードできるという寸法。ソフトウェアはSDKで作り、SDKからFPGAにコンフィギュレーションするようにアプリケーションノートでは書かれている。

早速、色々やってみたのだが、結局WebPACK11.5では、EDKがインストールされないで、SDKもインストールされなくて使えなかった。WebPACK12.1ではSDKはインストールされていたが、ライセンスがなくて使えなかった。残念だ。
でもISE11.5のEDK付きの購入バージョンだったら、サンプルを実行することができた。
8KB of internal RAM/ROMで、外部アドレスは16ビットだが、ちょっとしたコントローラには使うことができると思う。EDKを動かして、主従が逆転することなしに、メインはISEでちょっと手軽なコントローラを使いたいという用途には良いと思う。
下に、XAPP1141の21ページの Figure 17: XPS Project Diagram を引用させていただきます。
Simple_MicroBlaze_1_100616.png

LMBバスに8KBのBRAMがつながっていて、DPLBにUARTやUser Interfaceがつながっている。

XAPP1141の12ページからのStep by Step SMM Design Example をやってみた。下がbitファイルを生成できたあとのProject Navigatorの様子。
Simple_MicroBlaze_1_100617.png

下が、ビルドが終了したSDKの様子だ。
Simple_MicroBlaze_2_100617.png

SDKからTools > Program FPGA... を選んで、コンフィギュレーションをすると、押しボタンスイッチを押すと、LD0~LD3のどれかが点灯する。
はじめから入っているサンプルのSMM_Refは動作させることができなかった。

The Simple MicroBlaze Microcontrollerが、WebPACKで使えれば画期的と思ったんだけど、残念。でも通常版ISEで使えるだけでも便利だ。LCDの制御などは、このSimple MicroBlazeに任せてしまえば良い。遅くても良いインターフェースの部分なども、これが使えそう。なんといっても、アセンブラではなくC言語が使える。

# 寝ながら思いついたのだが、プログラム用のBRAMは0番地から8KB(0x0000_1FFFまで)だろうし、UARTもデバッカも付けなければ、アドレスをリバースエンジニアリングすること無しに、MicroBlaze用のGCCを使えば、MicroBlazeを使えるような気がする。MicroBlaze用のGCCは、EDKフォルダの下にインストールされていて、使うことができるようだ。”カスタム設計の MicroBlaze”に詳しく書いてある。これを使えば、もしかするとWebPACKでもMicroBlazeを使うことができるのではないか?と思う。
  1. 2010年06月16日 21:12 |
  2. SMM
  3. | トラックバック:0
  4. | コメント:4