FC2カウンター FPGAの部屋 VHDLのgenericの値を下位モジュールのVerilogのparameterとして渡す
FC2ブログ

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

FPGAの部屋

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

VHDLのgenericの値を下位モジュールのVerilogのparameterとして渡す

今回、VHDLからVerilogに値を渡すのにどうしようか?迷った。具体的には、VHDLのgeneric文で書いた値を、Verilogで書かれた下位モジュールにどうやって渡すかということだ。

Verilogのみだったら、”Verilogでincludeを使用せずにパラメータをポート宣言に使う”に書いてあるが、VHDLが上位モジュールでVerilogが下位モジュールの場合は未経験だった。
XSTユーザーガイド(Virtex-4 、Virtex-5 、Spartan-3 および CPLD デバイス用)”の569ページの”混合言語サポートの概要”に、

VHDL デザインでは、VHDL タイプ、ジェネリック、およびポートの制限されたサブセットを Verilog モジュールとの境界に使用できます。


と書いてあるので、どうやらできそうだということがわかった。

実際に、Disp_Controller_Top.vhd で、VGA_Display_Controller.v をインスタンスしてみた。
Disp_Controller_Top.vhd のインスタンシエーションを下に示す。

architecture RTL of Disp_Controller_Top is
constant    DDR2_SDRAM_ADDR_START    : std_logic_vector(31 downto 0) := x"46000000"; -- 32MB目から1MBを使用する。
constant    TRANSFER_LENGTH            : integer := 128;

...

    VGA_Disp_Cont_inst : VGA_Display_Controller generic map(
        AFIFO_FULL_VAL        => TRANSFER_LENGTH*2,
        AFIFO_HALF_FULL_VAL    => TRANSFER_LENGTH
    ) port map (
        clk_disp        => clk_disp,
        clk_ddr2        => Bus2IP_Clk,
        reset_disp        => reset_disp,
        reset_ddr2        => Bus2IP_Reset,
        request            => request,
        grant            => grant,
        address            => open,
        req_we            => req_we,
        addr_fifo_full    => '0',
        data_in            => Bus2IP_MstRd_d,
        data_valid        => Bus2IP_MstRd_src_rdy,
        red_out            => red,
        green_out        => green,
        blue_out        => blue,
        hsyncx            => hsyncx_node,
        vsyncx            => vsyncx_node,
        afifo_overflow    => afifo_overflow,
        afifo_underflow    => afifo_underflow,
        addr_is_zero    => addr_is_zero,
        h_v_is_zero        => h_v_is_zero
    );


インスタンスされたVGA_Display_Controller.v の一部分を下に示す。

module VGA_Display_Controller #(
    parameter AFIFO_FULL_VAL = 256,
    parameter AFIFO_HALF_FULL_VAL = 128
)
(
    input    wire    clk_disp,    // 25MHzのディスプレイ表示用クロック
    input    wire    clk_ddr2,    // 133.33MHzのDDR2 SDRAM用クロック
    input    wire    reset_disp,    // clk_disp 用リセット
    input    wire    reset_ddr2,    // clk_ddr2 用リセット
    output    reg        request,        // データ転送のrequest
    input    wire    grant,        // データ転送のgrant
    output    wire    [18:0]    address,    // DDR2 SDRAMのアドレス
    output    reg        req_we,        // Read要求のWrite Enable
    input    wire    addr_fifo_full,    // Read要求用FIFOのFULL
    input    wire    [31:0]    data_in,    // DDR2 SDRAMの画像データ(YUV)
    input    wire    data_valid,
    output    reg        [7:0]    red_out,
    output    reg        [7:0]    green_out,
    output    reg      [7:0]    blue_out,
    output    reg     hsyncx,
    output    reg     vsyncx,
    output    wire    afifo_overflow, // 非同期FIFO のオーバーフロー・エラー
    output    wire    afifo_underflow,    // 非同期FIFO のアンダーフロー・エラー
    output    reg        addr_is_zero,    // for test
    output    reg        h_v_is_zero        // for test
);


これで、VHDLのgeneric文で書いた値を、Verilogで書かれた下位モジュールにparameter 渡しで値を渡すことができた。
下に、ISimでVGA_Display_Controller.v のAFIFO_FULL_VAL, AFIFO_HALF_FULL_VALを見た場合を示す。
VHDL2Verilog_para_1_110911.png

Disp_Controller_Top.vhd の

AFIFO_HALF_FULL_VAL => TRANSFER_LENGTH



AFIFO_HALF_FULL_VAL => TRANSFER_LENGTH+1


に変更すると、ISimのコンスタント値も変更された。
VHDL2Verilog_para_2_110911.png

  1. 2011年09月11日 05:43 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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