FC2カウンター FPGAの部屋 VHDLでのpackageの使用方法
fc2ブログ

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

FPGAの部屋

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

VHDLでのpackageの使用方法

私のVHDLのpackageの使用方法を書くことにする。

entityのポートの定義内に自分で定義した定数や2次元、3次元配列、またはステートマシンのステートを書きたい時がある。その場合はentityの前に定義をする必要があり、その定義はpackage で行う。
例えば、下のソースのような場合だ。

entity switch_unit is
    generic(
        switch_unit_id : in integer := 0
    );
    port(
        clk, reset : in std_logic;
        recv_data_ar : in recv_data_array; -- 読み出しポートアレイ
        recv_re : out std_logic_vector(7 downto 0); -- 読み出しポートFIFOのイネーブル信号
        ch0_rcapacity_ar : in rcapacity_array;
        ch1_rcapacity_ar : in rcapacity_array;
        ch0_wcapacity_ar : in wcapacity_array;
        ch1_wcapacity_ar : in wcapacity_array;
        send_data_war : out send_data_array_suout; -- 書き込みポートアレイ
        send_we : out std_logic_vector(NUMBER_OF_OUTPUT_PORT-1 downto 0);


上のソースでrecv_data_array, rcapacity_array, wcapacity_array, send_data_array_suout が2次元配列で、NUMBER_OF_OUTPUT_PORTがconstant値だ。
これらの定義は、すべてpackageにして、上のソースのentityの前でuse文を使って定義を呼んでくるようにしている。下にpackageのソースを示す。

library IEEE;
use IEEE.STD_LOGIC_1164.all;

package swcontroller_pkg is
    constant NUMBER_OF_SWITCH_UNIT : integer := 9; -- ここを変更する
    constant NUMBER_OF_OUTPUT_PORT : integer := 8/(NUMBER_OF_SWITCH_UNIT-1);
    
    type recv_data_array is array (7 downto 0) of std_logic_vector(63 downto 0);
    type send_data_array is array (8 downto 0) of std_logic_vector(63 downto 0);
    type send_data_array_suout is array (NUMBER_OF_OUTPUT_PORT-1 downto 0) of std_logic_vector(63 downto 0);
    type rcapacity_array is array (7 downto 0) of std_logic_vector(7 downto 0);
    type wcapacity_array is array (8 downto 0) of std_logic_vector(5 downto 0);
    type wcapacity_array_suout is array (NUMBER_OF_OUTPUT_PORT-1 downto 0) of std_logic_vector(5 downto 0);
end swcontroller_pkg;


この部分はconstant値でユニットの数を変更できる記述になっている。generateを使用してユニットをインスタンシエーションしているので、NUMBER_OF_SWITCH_UNITの値を変更すると、インスタンシエーションするユニット数が変更できるようになっている。
さて、entity文の前には、library work とpackage を使うためのuse文が必要になる。ieeeライブラリを使用するための文を加えるとentity の部分はこうなる。

library ieee;
use ieee.std_logic_1164.all;
use ieee.std_logic_unsigned.all;

library work;
use work.swcontroller_pkg.all;

entity switch_unit is
    generic(
        switch_unit_id : in integer := 0
    );
    port(
        clk, reset : in std_logic;
        recv_data_ar : in recv_data_array; -- 読み出しポートアレイ
        recv_re : out std_logic_vector(7 downto 0); -- 読み出しポートFIFOのイネーブル信号
        ch0_rcapacity_ar : in rcapacity_array;
        ch1_rcapacity_ar : in rcapacity_array;
        ch0_wcapacity_ar : in wcapacity_array;
        ch1_wcapacity_ar : in wcapacity_array;
        send_data_war : out send_data_array_suout; -- 書き込みポートアレイ
        send_we : out std_logic_vector(NUMBER_OF_OUTPUT_PORT-1 downto 0);


package は必ずentity、architecture の部分とは別ファイルにしている。他のentity でもpackage の定義を使用することがあるため、コンパイルの順番で定義されていないというエラーを避けるためだ。そのため、必ずpackage文はシミュレーションのスクリプトでは先にコンパイルするようにしている。
更にpackage を入れ子にするのは避けている。前にISEのどのバージョンか忘れたが、packageに依存関係を作ってしまったらエラーで解決できないことがあった。packageの前にpackage の使用を定義することがないようにしている。
  1. 2009年03月13日 06:20 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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