FC2カウンター FPGAの部屋 AXI4スレーブ・バス・ファンクション・モデル(BFM)の作製4
FC2ブログ

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

FPGAの部屋

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

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

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

前回ブログにVHDLコードを貼ったaxi_master_BFM.vhd のRAMをbit_vector のarray にしてもstd_logic_vector のarray と僅かな差しかないとのご指摘をツイッターで受けたのでやってみました。

・bit_vector 版

宣言部分
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))));


・std_logic_vector版

宣言部分
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 std_logic_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) <= M_AXI_WDATA(i*8+7 downto i*8);
                    end if;
                end loop;
            end if;
        end if;
    end process;
    M_AXI_RDATA <= ram_array(CONV_INTEGER(rd_addr(C_OFFSET_WIDTH-1 downto ADD_INC_OFFSET)));


この2つのメモリ使用量とシミュレーション時間を比較してみました。メモリ消費量はタスクマネージャーで比べたので、余り正確ではないです。シミュレーション時間は1usec ~ 1.001msec の1msec 間のシミュレーション時間をiPhone のストップウォッチで計測しました。なお、シミュレーション時間はシミュレーション時間が長くなるほど多くかかるようです。(1usec ~ 1.001msec の1msec 間のシミュレーション時間よりも、1.001usec ~ 2.001msec の1msec 間のシミュレーション時間の方が長い)

bit_vector 版、   メモリ消費量170MB、シミュレーション時間 2.8sec
std_logic_vector版、 メモリ消費量180MB、シミュレーション時間 2.8sec

std_logic_vector版のほうが少しだけメモリ消費量が多いような気がしますが、メモリ消費量の有効数字は2ケタなので、誤差範囲内のような気がします。
よって、std_logic_vector版を使用することにします。
  1. 2012年04月17日 05:00 |
  2. AXI4 Master IPの作製
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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