2007年08月16日

VHDL TIPS 「rangeでパラメータ制約」

モジュールのパラメータチェックは「assert」を使用する事が多いが、単純な範囲制約であれば「range」を使用する事も出来る。
「range」を使用すると静的パラメータであればコンパイル時にチェックし、動的パラメータであれば範囲外になった瞬間Fatalになる。(ModelSim)

以下にサンプルソースを紹介する。
このサンプルは「integer」データタイプのシフトレジスタでシフト数と最大データ値を指定する事が出来る。
ただし、範囲制約として、シフト値は1〜10(ディフォルト5)、入出力データは指定された最大データ値(ディフォルト128)を入れている。


library IEEE;
use IEEE.std_logic_1164.all;

-- integerデータタイプの遅延モジュール
entity INT_DLY is
    generic
    (
        -- 遅延クロック数
        COUNT   : in    integer range 1 to 10 := 5;
        -- データの最大値
        DMAX    : in    integer := 128
    );
    port
    (
        CLK     : in    std_logic;
        DIN     : in    integer range 0 to DMAX;
        DOUT    : out   integer range 0 to DMAX
    );
end INT_DLY;

architecture behavior of INT_DLY is

    -- integerの配列定義
    type int_vector is array ( natural range <> ) of integer;

    -- 遅延をシフトレジスタで実現するためのレジスタ配列
    signal  DELAY   : int_vector(COUNT-1 downto 0);

begin

    -- integerのシフトレジスタ
    process ( CLK ) begin
        if ( CLK'event and CLK = '1' ) then
            DELAY(0) <= DIN;
            for i in 1 to COUNT-1 loop
                DELAY(i) <= DELAY(i-1);
            end loop;
        end if;
    end process;
    DOUT <= DELAY(COUNT-1);

end behavior;


このモジュールをCOUNT=11で呼び出した場合、コンパイル時にエラーとなる。
また、DMAX=128でコンパイル、シミュレーションしDINが0〜128を超えた瞬間にFatalとなりシミュレーションがストップする。

このように「range」で範囲制約を行うと使用する側から見て制約が解りやすく、ライブラリ等の共有モジュールには入れておきたい。



投稿時刻(21:26)│コメント(0)VHDL 

この記事にコメントする

名前:
URL:
  情報を記憶: 評価: 顔   
 
 
 
最新コメント
ブログ内検索
カテゴリ別表示
月別表示
問い合わせ・連絡先
ta_bo__@livedoor.com

本サイトは以下のアクセス解析を使用しております。
基礎化粧品