FC2カウンター FPGAの部屋 レジスタ設定用AXI4 Master IPを使用してVivado HLSで作ったPWM モジュールIPをシミュレーションした

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

FPGAの部屋

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

レジスタ設定用AXI4 Master IPを使用してVivado HLSで作ったPWM モジュールIPをシミュレーションした

レジスタ設定用AXI4 Master IPをVivado HLS で作ってみた2”で作ったレジスタ設定用AXI4 Master IPを使用して、”Vivado HLS で PWM モジュールIP を作ってみた”で作ったPWM モジュールIPをシミュレーションしてみた。

まずは、Vivado 2016.2 のプロジェクトのPWMmodule_test を作成して、PWMmodule_test ブロックデザインを作成した。
reg_write_read_11_160615.png

レジスタ設定用AXI4 Master IP の reg_write_read は、Vivado HLS のIP そのものを使用すると、VHDLのIP となってしまって、ビット表現でしか書けなかった。

signal addr0_tmp : std_logic_vector(awidth-1 downto 0); 
type mem_array is array (0 to mem_size-1) of std_logic_vector (dwidth-1 downto 0); 
signal mem : mem_array := (
    0 => "00000000000000000000000000000000", 
    1 => "00000000000000000000000000010100", 
    2 => "00000000000000000000000000001010", 
    3 => "10001111111111111111111111111111", 
    4 => "01001111111111111111111111110000", 
    5 => "11111111111111111111111111111111", 
    6 to 255=> "00000000000000000000000000000000" );


これを修正するのはとってもつらいので、レジスタ設定用AXI4 Master IP のVerilog HDL コードを抜き出して、IP を作成した (reg_write_read2)。
reg_write_read_12_160615.png

PWMmodule_test ブロックデザインの拡大図を示す。
reg_write_read_13_160615.png

テストベンチの PWMmodule_test_tb.v を作成して、シミュレーションを行った。
reg_write_read_14_160615.png

reg_write_read のトランザクションは次の通り。

0    0            0x44A00010    0x32
0    0            0x44A00000    0x1
0    5            0x44A00000    0x80
0    0xFFFFFFFF    0            0


フォーマットはこれ。

// reg_addr_data フォーマット、
// 第1フィールド(reg_ad[x][0]):Write - 0, Read - 1
// 第2フィールド(reg_ad[x][1]):Delay、単位はクロック数
// 第3フィールド(reg_ad[x][2]):アドレス、16進数
// 第4フィールド(reg_ad[x][3]):データ、16進数


600 us シミュレーションを行ったところ、PWM の幅はぴったり 500 us、1 の幅も 250 us だった。
reg_write_read_15_160615.png

reg_write_read のトランザクションを1つずつ示す。最初は、0x44A00010 番地への 0x32 (50) のWrite だ。これはPWMの 1 の幅だ。
reg_write_read_16_160615.png

次に、0x44A00000 番地への0x1 のWrite で、これは ap_start を 1 にしている。
reg_write_read_17_160615.png

最後は、0x44A00000 番地への0x80 のWrite で、これは auto_restart を 1 にしている。
reg_write_read_18_160615.png

最後に、テストベンチの PWMmodule_test_tb.v を示す。

`default_nettype none
`timescale 100 ps / 1ps
//////////////////////////////////////////////////////////////////////////////////
// Company: 
// Engineer: 
// 
// Create Date: 2016/06/13 15:14:23
// Design Name: 
// Module Name: PWMmodule_test_tb
// Project Name: 
// Target Devices: 
// Tool Versions: 
// Description: 
// 
// Dependencies: 
// 
// Revision:
// Revision 0.01 - File Created
// Additional Comments:
// 
//////////////////////////////////////////////////////////////////////////////////


module PWMmodule_test_tb;

    wire [31:0]dummy_out;
    wire pwm_out_V;
    wire reset_rtl_n;
    wire sys_clock;
    
    PWMmodule_test_wrapper PWMmodule_test_wrapper_i (
        .dummy_out(dummy_out),
        .pwm_out_V(pwm_out_V),
        .reset_rtl_n(reset_rtl_n),
        .sys_clock(sys_clock)
    );

    // sys_clock
    clk_gen #(
        .CLK_PERIOD(100),    // 10.0nsec, 100MHz
        .CLK_DUTY_CYCLE(0.5),
        .CLK_OFFSET(0),
        .START_STATE(1'b0)
    ) sys_clock_i (
        .clk_out(sys_clock)
    );
    
    // reset_rtl_n
    reset_gen #(
        .RESET_STATE(1'b0),
        .RESET_TIME(1000)    // 100nsec
    ) RESET2i (
        .reset_out(reset_rtl_n)
    );
    
endmodule

module clk_gen #(
    parameter         CLK_PERIOD = 100,
    parameter real    CLK_DUTY_CYCLE = 0.5,
    parameter        CLK_OFFSET = 0,
    parameter        START_STATE    = 1'b0 )
(
    output    reg        clk_out
);
    begin
        initial begin
            #CLK_OFFSET;
            forever
            begin
                clk_out = START_STATE;
                #(CLK_PERIOD-(CLK_PERIOD*CLK_DUTY_CYCLE)) clk_out = ~START_STATE;
                #(CLK_PERIOD*CLK_DUTY_CYCLE);
            end
        end
    end
endmodule

module reset_gen #(
    parameter    RESET_STATE = 1'b1,
    parameter    RESET_TIME = 100 )
(
    output    reg        reset_out
);
    begin
        initial begin
            reset_out = RESET_STATE;
            #RESET_TIME;
            reset_out = ~RESET_STATE;
        end
    end
endmodule

`default_nettype wire


reg_write_read のトランザクションを変更するにはIP をアップデートする必要があるのが、面倒だが、それ以外は快適に使えている。
  1. 2016年06月15日 06:22 |
  2. Zybot
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

トラックバック URL
http://marsee101.blog19.fc2.com/tb.php/3494-c230d55b
この記事にトラックバックする(FC2ブログユーザー)