FC2カウンター FPGAの部屋 2012年04月14日
FC2ブログ

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

FPGAの部屋

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

エレキジャック・フォーラム2012に行って来ました

今日はエレキジャック・フォーラム2012に行って来ました。

最初に基調講演を聞いてきました。ボーカロイドの元となる音素片音声合成のエンジンを作った方です。ご自身も音楽が趣味でバイオリンだったかな?を引いてらっしゃる方だそうです。母音ー子音、子音―母音の変化を細かくサンプルして、ピッチを合わせたり、なめらかにしながら合成しているそうです。あと、楽器の音の周波数は一定ですが、人間の音声は揺らいでいるので、その揺らぎも再現しているとのことでした。凄いですね。
ボーカロイドの操作画面も初めて見ました。簡単そうでした。欲しくなりました。iPhone版もあるとのことなので買ってみようかな?

展示はいろいろと楽しいのがありました。ちっちゃいものくらぶさんが出ていて、NanoBoard AGのキットを購入しました。楽しみです。モーター付きでした。スクラッチで簡単に動かせるそうです。
eleki-jack_1_120414.jpg
eleki-jack_2_120414.jpg

Simさんにもお会いして、hamayan さんを紹介して頂きました。ご両方とも、ありがとうございました。

そのあとでショートプレゼンを聞いてきました。
ショートプレゼンの会場の様子です。今年はショートプレゼンのスペースが大きくて聞き易かったです。
eleki-jack_3_120414.jpg

飯島 幸太 氏 B-1  おさんぽガイガーG ~ Androidでスマートな放射線測定 ~
途中から聞いたんですが、お散歩時の放射線測定でも犬の話でした。人間の話もあったのかな?

れすぽん 氏 B-3  片面感光基板で作るFPGA基板 / 基板少女の裏の裏
基板を作る話でした。裏面に女の子の絵柄が入っています。裏表にコネクタへのパターンがあるので、上下どっちの向きに基板を付けても良いそうです。

内藤 竜治 氏/特殊電子回路(株) B-4  RXマイコンとAndroid携帯でいつでもどこでも電子工作!
後でブースで説明を受けたんですが、Android とRXマイコンを接続する話でした。最近、Android の勉強をしているので、興味深く聞かせて頂きました。私の持っているAndroid は2.1 なので、ADKは使えずADBのみの対応のようです。勉強になりました。

会場の様子です。まだ午前中なので、そんなに混んでいない時です。
eleki-jack_4_120414.jpg

セミナは結局、2つ見てきました。
A-4  オープン・ソース・ハードウェア“Arduino”用の3G通信拡張キットが登場
最初の講師の方の喋り方が早口でジャパネットタカタの社長さんみたいでした、声質は違いますが。
タイトル通りのお話でしたが、途中でスイッチ・サイエンスの方に交代して、スイッチ・サイエンスでUSB接続の3Gシールドの紹介がありました。USB接続の3Gモジュールを挿してArduino の接続できるシールドです。とっても良さそうでした。
あと、センサーデータは、Pachube(パッチベイ)に上げているそうです。このサイトとっても便利そうでした。

A-5  手作りカメラで宇宙の渚の撮影に挑戦
これは凄かったです。ブラボーです。森岡さんが高層気球で宇宙の撮影に挑戦した話です。NHKでやっていたんですね。ツイッターでもレ聞いていたんですが、内容は知りませんでした。10台のカメラシステムを自作して高層圏の画像を360度取ってきたとのことです。-60度から放熱のできない宇宙での使用に耐えるシステムを作った話でした。とっても面白かったです。

ラズベリーパイも見てきました。欲しくなりましたね。ケースを自作したいです。
eleki-jack_5_120414.jpg

とっても面白かったです。来年も行きたい。
  1. 2012年04月14日 20:34 |
  2. エレキジャック・フォーラム
  3. | トラックバック:0
  4. | コメント:0

AXI4スレーブ・バス・ファンクション・モデル(BFM)の作製2

AXI4スレーブ・バス・ファンクション・モデル(BFM)の作製1”の続き。

ここでは、AXI4マスタIPを自作して、それを単体テストするために、AXI4スレーブIPの代わりのBFMモデルを作成している。(axi_master_BFM.vhd)

一応完成したので、cdctest_axi_master.vhd と接続してテストしてみた。
シミュレーションを行ったので、その結果を下に示す。まずはWrite Transaction。Writeデータ転送時にランダムなWaitを発生できるようにしてある (WRITE_RANDOM_WAIT=1) が、現在はWaitしない設定 (WRITE_RANDOM_WAIT=0) にしてある。
cdctest_axi_master_20_120414.png

次にRead Transactionのシミュレーション波形を下に示す。Readデータ転送時にランダムなWaitを発生できるようにしてある (READ_RANDOM_WAIT=1) が、現在はWaitしない設定 (READ_RANDOM_WAIT=0) にしてある。
cdctest_axi_master_21_120414.png

axi_master_BFM.vhdは論理合成可能でもある。試しにインプリメントしてみた。
”C_OFFSET_WIDTH : integer := 8; -- 割り当てるRAMのアドレスのビット幅”の場合だ。余り大きな領域を割り当てると論理合成に時間がかかるし、FPGAに入らなくなってしまう。Project Navigator の画面を下に示す。
cdctest_axi_master_22_120414.png

MAPリポート (axi_master_bfm_map.mrp) の一部を下に示す。

Release 13.4 Map O.87xd (nt)
Xilinx Mapping Report File for Design 'axi_master_bfm'

Design Information
------------------
Command Line   : map -intstyle ise -p xc6slx45-csg324-2 -w -logic_opt off -ol
high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off
-pr off -lc off -power off -o axi_master_bfm_map.ncd axi_master_bfm.ngd
axi_master_bfm.pcf 
Target Device  : xc6slx45
Target Package : csg324
Target Speed   : -2
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date    : SAT 14 APR 4:40:4 2012

Design Summary
--------------
Number of errors:      0
Number of warnings:    0
Slice Logic Utilization:
  Number of Slice Registers:                 2,121 out of  54,576    3%
    Number used as Flip Flops:               2,121
    Number used as Latches:                      0
    Number used as Latch-thrus:                  0
    Number used as AND/OR logics:                0
  Number of Slice LUTs:                      2,848 out of  27,288   10%
    Number used as logic:                    2,845 out of  27,288   10%
      Number using O6 output only:           2,817
      Number using O5 output only:               0
      Number using O5 and O6:                   28
      Number used as ROM:                        0
    Number used as Memory:                       1 out of   6,408    1%
      Number used as Dual Port RAM:              0
      Number used as Single Port RAM:            0
      Number used as Shift Register:             1
        Number using O6 output only:             1
        Number using O5 output only:             0
        Number using O5 and O6:                  0
    Number used exclusively as route-thrus:      2
      Number with same-slice register load:      2
      Number with same-slice carry load:         0
      Number with other load:                    0

Slice Logic Distribution:
  Number of occupied Slices:                   918 out of   6,822   13%
  Nummber of MUXCYs used:                       24 out of  13,644    1%
  Number of LUT Flip Flop pairs used:        2,858
    Number with an unused Flip Flop:           743 out of   2,858   25%
    Number with an unused LUT:                  10 out of   2,858    1%
    Number of fully used LUT-FF pairs:       2,105 out of   2,858   73%
    Number of unique control sets:               9
    Number of slice register sites lost
      to control set restrictions:              30 out of  54,576    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

IO Utilization:
  Number of bonded IOBs:                       126 out of     218   57%

Specific Feature Utilization:
  Number of RAMB16BWERs:                         0 out of     116    0%
  Number of RAMB8BWERs:                          0 out of     232    0%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       1 out of      16    6%
    Number used as BUFGs:                        1
    Number used as BUFGMUX:                      0
  Number of DCM/DCM_CLKGENs:                     0 out of       8    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     376    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     376    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     376    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     256    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                            0 out of      58    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       4    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%

Average Fanout of Non-Clock Nets:                5.80

Peak Memory Usage:  305 MB
Total REAL time to MAP completion:  1 mins 7 secs 
Total CPU time to MAP completion:   1 mins 6 secs 


FPGA Editor を立ちあげてram_array の実装状況を見てみた。
cdctest_axi_master_23_120414.png

スライスのFFとして実装されている。
RAMのVHDLコードを下に示す。

constant    SLAVE_ADDR_NUMBER    : integer := 2**(C_OFFSET_WIDTH - ADD_INC_OFFSET);
type ram_array_def is array (SLAVE_ADDR_NUMBER-1 downto 0) of bit_vector(C_M_AXI_DATA_WIDTH-1 downto 0);
signal ram_array : ram_array_def;

...............

    -- RAM
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if reset='1' then
                ram_array <= (others => (others => '0'));
            else
                if cdc_we='1' then
                    for i in 0 to C_M_AXI_DATA_WIDTH/8-1 loop
                        if M_AXI_WSTRB(i)='1' then -- Byte Enable
                            ram_array(CONV_INTEGER(wr_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET)))(i*8+7 downto i*8) <= To_bitvector(M_AXI_WDATA(i*8+7 downto i*8));
                        end if;
                    end loop;
                end if;
            end if;
        end if;
    end process;
    M_AXI_RDATA <= To_stdlogicvector(ram_array(CONV_INTEGER(rd_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET))));


process文の中でresetをかけてしまっているので分散RAMにアサインされない。
そこで分散RAMにアサインされるように、resetの記述を削除した。VHDLコードを下に示す。

constant    SLAVE_ADDR_NUMBER    : integer := 2**(C_OFFSET_WIDTH - ADD_INC_OFFSET);
type ram_array_def is array (SLAVE_ADDR_NUMBER-1 downto 0) of bit_vector(C_M_AXI_DATA_WIDTH-1 downto 0);
signal ram_array : ram_array_def := (others => (others => '0'));

...............

    -- RAM
    process (ACLK) begin
        if ACLK'event and ACLK='1' then 
            if cdc_we='1' then
                for i in 0 to C_M_AXI_DATA_WIDTH/8-1 loop
                    if M_AXI_WSTRB(i)='1' then -- Byte Enable
                        ram_array(CONV_INTEGER(wr_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET)))(i*8+7 downto i*8) <= To_bitvector(M_AXI_WDATA(i*8+7 downto i*8));
                    end if;
                end loop;
            end if;
        end if;
    end process;
    M_AXI_RDATA <= To_stdlogicvector(ram_array(CONV_INTEGER(rd_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET))));


これでインプリメントした時のMAPリポートの一部を下に示す。

Release 13.4 Map O.87xd (nt)
Xilinx Mapping Report File for Design 'axi_master_bfm'

Design Information
------------------
Command Line   : map -intstyle ise -p xc6slx45-csg324-2 -w -logic_opt off -ol
high -t 1 -xt 0 -register_duplication off -r 4 -global_opt off -mt off -ir off
-pr off -lc off -power off -o axi_master_bfm_map.ncd axi_master_bfm.ngd
axi_master_bfm.pcf 
Target Device  : xc6slx45
Target Package : csg324
Target Speed   : -2
Mapper Version : spartan6 -- $Revision: 1.55 $
Mapped Date    : SAT 14 APR 5:5:44 2012

Design Summary
--------------
Number of errors:      0
Number of warnings:    0
Slice Logic Utilization:
  Number of Slice Registers:                    68 out of  54,576    1%
    Number used as Flip Flops:                  68
    Number used as Latches:                      0
    Number used as Latch-thrus:                  0
    Number used as AND/OR logics:                0
  Number of Slice LUTs:                        174 out of  27,288    1%
    Number used as logic:                      109 out of  27,288    1%
      Number using O6 output only:              86
      Number using O5 output only:               0
      Number using O5 and O6:                   23
      Number used as ROM:                        0
    Number used as Memory:                      64 out of   6,408    1%
      Number used as Dual Port RAM:             64
        Number using O6 output only:            64
        Number using O5 output only:             0
        Number using O5 and O6:                  0
      Number used as Single Port RAM:            0
      Number used as Shift Register:             0
    Number used exclusively as route-thrus:      1
      Number with same-slice register load:      1
      Number with same-slice carry load:         0
      Number with other load:                    0

Slice Logic Distribution:
  Number of occupied Slices:                    78 out of   6,822    1%
  Nummber of MUXCYs used:                       24 out of  13,644    1%
  Number of LUT Flip Flop pairs used:          183
    Number with an unused Flip Flop:           117 out of     183   63%
    Number with an unused LUT:                   9 out of     183    4%
    Number of fully used LUT-FF pairs:          57 out of     183   31%
    Number of unique control sets:              11
    Number of slice register sites lost
      to control set restrictions:              44 out of  54,576    1%

  A LUT Flip Flop pair for this architecture represents one LUT paired with
  one Flip Flop within a slice.  A control set is a unique combination of
  clock, reset, set, and enable signals for a registered element.
  The Slice Logic Distribution report is not meaningful if the design is
  over-mapped for a non-slice resource or if Placement fails.

IO Utilization:
  Number of bonded IOBs:                       126 out of     218   57%

Specific Feature Utilization:
  Number of RAMB16BWERs:                         0 out of     116    0%
  Number of RAMB8BWERs:                          0 out of     232    0%
  Number of BUFIO2/BUFIO2_2CLKs:                 0 out of      32    0%
  Number of BUFIO2FB/BUFIO2FB_2CLKs:             0 out of      32    0%
  Number of BUFG/BUFGMUXs:                       1 out of      16    6%
    Number used as BUFGs:                        1
    Number used as BUFGMUX:                      0
  Number of DCM/DCM_CLKGENs:                     0 out of       8    0%
  Number of ILOGIC2/ISERDES2s:                   0 out of     376    0%
  Number of IODELAY2/IODRP2/IODRP2_MCBs:         0 out of     376    0%
  Number of OLOGIC2/OSERDES2s:                   0 out of     376    0%
  Number of BSCANs:                              0 out of       4    0%
  Number of BUFHs:                               0 out of     256    0%
  Number of BUFPLLs:                             0 out of       8    0%
  Number of BUFPLL_MCBs:                         0 out of       4    0%
  Number of DSP48A1s:                            0 out of      58    0%
  Number of ICAPs:                               0 out of       1    0%
  Number of MCBs:                                0 out of       2    0%
  Number of PCILOGICSEs:                         0 out of       2    0%
  Number of PLL_ADVs:                            0 out of       4    0%
  Number of PMVs:                                0 out of       1    0%
  Number of STARTUPs:                            0 out of       1    0%
  Number of SUSPEND_SYNCs:                       0 out of       1    0%

Average Fanout of Non-Clock Nets:                3.81

Peak Memory Usage:  279 MB
Total REAL time to MAP completion:  30 secs 
Total CPU time to MAP completion:   29 secs 


Number of occupied Slicesが13% から1% に劇的に減った。これは分散RAMが使用されたからだ。FPGA Editor を起動してRAMを見てみたのが下の図だ。
cdctest_axi_master_24_120414.png

SLICEMが分散RAMとしてアサインされているのがわかる。

なお、”C_OFFSET_WIDTH : integer := 15; -- 割り当てるRAMのアドレスのビット幅”の場合は、スライスが足りなくてMAPできなかった。

次に、Write Transaction。Writeデータ転送時にランダムなWaitを発生できるようにしてシミュレーションしてみた。 (WRITE_RANDOM_WAIT=1)
cdctest_axi_master_25_120414.png

3つ目以降のWrite Transaction でM_AXI_WREADY が変化してWaitしているのがわかると思う。

長くなったので、この辺で終了。axi_master_BFM.vhd のVHDLコードは次回ブログに貼る予定だ。

(追加)
なぜ、RAM をbit_vector のarray で定義したかというと、インプリメントは関係無いですが、シミュレーションでstd_logic は9値を持つので、それだけ領域を確保するのにパソコンのメモリ領域を食うと思われます。bit ならば2値なので、メモリ領域を食わないかな?と思い使いました。実際に、bit_vector で定義したほうがstd_logic で定義したよりメモリ領域を消費しないかどうか?は確認してみたことがないので、良く分かりません。知っている方がいらっしゃったら教えて下さい。
  1. 2012年04月14日 05:27 |
  2. AXI4 Master IPの作製
  3. | トラックバック:0
  4. | コメント:0