FC2カウンター FPGAの部屋 XPSプロジェクトのカスタムIP内のgenerateで生成したメモリの初期値を設定する(Verilog HDL)
fc2ブログ

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

FPGAの部屋

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

XPSプロジェクトのカスタムIP内のgenerateで生成したメモリの初期値を設定する(Verilog HDL)

現在、Vivado HLS 2013.4で生成したラプラシアンフィルタのカスタムIPをシミュレーションしようとしている。”Vivado HLS 2013.4でラプラシアン・フィルタ関数をaxi masterモジュールにする4”参照

ISEでシミュレーション用のプロジェクトを作製し、XPSプロジェクトをISEプロジェクト内に作製した。
Vivado_HLS_2013_4_16_140207.png

XPSプロジェクトがこちら。lap_filter_axim_top_0 の M_AXI_CAM_FB, M_AXI_LAP_FB がメモリモデルの mem_sim_axi_slave_0 に接続されている。
Vivado_HLS_2013_4_17_140207.png

メモリモデルの mem_sim_slave については、”AXI4 Slave インターフェースのメモリ・シミュレーション用 IP の作製2(シミュレーション)”を参照のこと。C_MEMORY_SIZE = 960000 に設定している。800x600ピクセルのSVGA画面2画面分だ。

2画面分の領域を確保したうちの1画面だけを画像の情報として初期化したいという欲求があった。画像データをファイルから読み込んで、そのまま使用してもよいのだが、面倒なので、おなじみのM系列の擬似ランダム数で初期化することにした。

いろいろと試行錯誤してしまったが、出来たのでやり方を書いておく。階層としては、次の通りになる。

1.system_top_tbがシミュレーションのテストベンチで最上位ということになる。

2.その下に、system_topを uut してインスタンスしてある。

3.systemという名前のXPSプロジェクトが、system_i という名前でインスタンスしてある。

4.XPSプロジェクトに下に、 mem_sim_axi_slave_0をインスタンスしてある。

5.mem_sim_axi_slaveでは、memory_8bit を memory_8bit_i というインスタンス名で generate 文でインスタンスしてある。


mem_sim_axi_slave.v 上で、memory_8bit をインスタンスしてある部分を下に示す。

    // instance memory_8bit
    generate
        genvar i;
        
        for (i=(C_S_AXI_DATA_WIDTH/8-1); i>=0; i=i-1) begin : MEMORY_GEN
            memory_8bit #(
                .C_S_AXI_ADDR_WIDTH(C_S_AXI_ADDR_WIDTH),
                .C_MEMORY_SIZE(C_MEMORY_SIZE)
            ) memory_8bit_i (
                .clk(ACLK),
                .waddr(waddr),
                .write_data(S_AXI_WDATA[i*8+7:i*8]),
                .write_enable(wready & S_AXI_WVALID),
                .byte_enable(S_AXI_WSTRB[i]),
                .raddr(raddr),
                .read_data(S_AXI_RDATA[i*8+7:i*8])
            );
        end
    endgenerate


この mem にM系列の擬似ランダム数を入れたい。下にテストベンチでのM系列の生成するためのfunction を示す。

    // R, G, B 毎に違った生成多項式のM系列を用意した
    function [7:0] mseqf8_R (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[3] ^ din[2] ^ din[1];
            mseqf8_R = {din[6:0], xor_result};
        end
    endfunction

    function [7:0] mseqf8_G (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[4] ^ din[2] ^ din[0];
            mseqf8_G = {din[6:0], xor_result};
        end
    endfunction

    function [7:0] mseqf8_B (input [7:0] din);
        reg xor_result;
        begin
            xor_result = din[7] ^ din[5] ^ din[2] ^ din[1];
            mseqf8_B = {din[6:0], xor_result};
        end
    endfunction


下に、初期化を行った Verilog HDL のコードを示す。これは、テストベンチ system_top_tb.v から、XPSプロジェクト以下の メモリの前半分を初期化している。

    // M系列を使用した擬似ランダム数でメモリの半分を初期化した
    initial begin : memory_init_zero
        integer i;
        for (i=0; i<480000; i=i+1) begin
            uut.system_i.mem_sim_axi_slave_0.mem_sim_axi_slave_0.MEMORY_GEN[3].memory_8bit_i.mem[i] = 8'd0;
        end
    end

    initial begin : memory_init_red
        integer i;
        for (i=0; i<480000; i=i+1) begin
            uut.system_i.mem_sim_axi_slave_0.mem_sim_axi_slave_0.MEMORY_GEN[2].memory_8bit_i.mem[i] = mseq8r;
            mseq8r = mseqf8_R(mseq8r);
        end
    end

    initial begin : memory_init_green
        integer i;
        for (i=0; i<480000; i=i+1) begin
            uut.system_i.mem_sim_axi_slave_0.mem_sim_axi_slave_0.MEMORY_GEN[1].memory_8bit_i.mem[i] = mseq8g;
            mseq8g = mseqf8_G(mseq8g);
        end
    end

    initial begin : memory_init_blue
        integer i;
        for (i=0; i<480000; i=i+1) begin
            uut.system_i.mem_sim_axi_slave_0.mem_sim_axi_slave_0.MEMORY_GEN[0].memory_8bit_i.mem[i] = mseq8b;
            mseq8b = mseqf8_B(mseq8b);
        end
    end


ISim のメモリ表示を下に示す。
Vivado_HLS_2013_4_18_140207.png

メモリがM系列の擬似ランダム数で初期化されているのがわかった。


注意が必要なのは、XPSプロジェクトでは、mem_sim_axi_slave_0 の下の mem_sim_axi_slave_0 に実体があるということだ。それに、generate 文を使った時のインスタンス名に注意して欲しい。(XilinxのXSTを使用した時のインスタンスの仕方です。Altera の Quartus II では、インスタンス名が違うかもしれません?)
  1. 2014年02月07日 04:39 |
  2. 入門Verilog
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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