2007年08月06日
ModelSimでビットマップのリードライト
ModelSim+VHDLでビットマップのリードライトを行えるモジュールを作成中だが、思ったように時間がとれないので難航している。
とりあえずパッケージだけ出来たので公開。(ボディは半分くらい)これを作るのに「textio.vhd」はとても参考になる。一度目を通すことをおすすめしたい。
これが出来るとModelSimXE Starterでビットマップを直接扱うことが出来る。
私の仕事上、画像ファイルを扱うことが多いのでこれが出来るとModelSimのライセンスが空いていない時にもシミュレーションが出来るようになる。ModelSimSEだとFLIが使えるので前に作ったコレでも出来るが...
use IEEE.std_logic_1164.all;
use IEEE.std_logic_arith.all;
use IEEE.std_logic_unsigned.all;
package bmp_pkg is
----------------------------------------------------------------------------
-- データタイプ定義
----------------------------------------------------------------------------
-- ファイルヘッダ定義
type BITMAPFILEHEADER is record
bfType : bit_vector(15 downto 0);
bfSize : bit_vector(31 downto 0);
bfReserved1 : bit_vector(15 downto 0);
bfReserved2 : bit_vector(15 downto 0);
bfOffBits : bit_vector(31 downto 0);
end record;
-- インフォヘッダ定義
type BITMAPINFOHEADER is record
biSize : bit_vector(31 downto 0);
biWidth : bit_vector(31 downto 0);
biHeight : bit_vector(31 downto 0);
biPlanes : bit_vector(15 downto 0);
biBitCount : bit_vector(15 downto 0);
biCompression : bit_vector(31 downto 0);
biSizeImage : bit_vector(31 downto 0);
biXPelsPerMeter : bit_vector(31 downto 0);
biYPelsPerMeter : bit_vector(31 downto 0);
biClrUsed : bit_vector(31 downto 0);
biClrImportant : bit_vector(31 downto 0);
end record;
-- パレット定義
type RGBQUAD is record
rgbBlue : bit_vector(7 downto 0);
rgbGreen : bit_vector(7 downto 0);
rgbRed : bit_vector(7 downto 0);
rgbReserved : bit_vector(7 downto 0);
end record;
-- パレットのポインタ定義
type RGBQUADARRAY is array( natural range <> ) of RGBQUAD;
type RGBQUADACCESS is access RGBQUADARRAY;
-- バイトのポインタ定義
subtype BYTE is bit_vector(7 downto 0);
type BYTEARRAY is array( natural range <> ) of BYTE;
type BYTEACCESS is access BYTEARRAY;
-- ビットマップ全体を定義
type BMP_INFO is record
bmp_fh : BITMAPFILEHEADER;
bmp_ih : BITMAPINFOHEADER;
col_tbl : RGBQUADACCESS;
pix_data : BYTEACCESS;
end record;
-- ファイルタイプ定義
type BIN is file of character;
----------------------------------------------------------------------------
-- 公開サブプログラム定義
----------------------------------------------------------------------------
-- ビットマップオープン(ファイル指定)
procedure open_bmp (
filename : in string;
bmp_info_data : out BMP_INFO;
result : out boolean
);
-- ビットマップオープン(空データ)
procedure open_bmp (
x_size : in std_logic_vector(31 downto 0);
y_size : in std_logic_vector(31 downto 0);
bitcount : in integer;
bmp_info_data : out BMP_INFO;
result : out boolean
);
-- ビットマップ保存
procedure save_bmp (
filename : in string;
bmp_info_data : inout BMP_INFO;
result : out boolean
);
-- ビットマップクローズ
procedure close_bmp (
bmp_info_data : inout BMP_INFO;
result : out boolean
);
-- ビットマップリード
procedure read_bmp (
x_pos : in std_logic_vector(31 downto 0);
y_pos : in std_logic_vector(31 downto 0);
pix_data : out std_logic_vector(31 downto 0);
bmp_info_data : inout BMP_INFO
);
-- ビットマップライト
procedure write_bmp (
x_pos : in std_logic_vector(31 downto 0);
y_pos : in std_logic_vector(31 downto 0);
pix_data : in std_logic_vector(31 downto 0);
bmp_info_data : inout BMP_INFO
);
end bmp_pkg;