FC2カウンター FPGAの部屋 私流のVHDLの書き方1
FC2ブログ

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

FPGAの部屋

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

私流のVHDLの書き方1

このごろは回路図フィックスに忙しいのでこれといったねたは無い。いろいろ考えていることはあるのだがそのうちに。
今日は定数をconstant文を使った文字列で置き換える書き方を紹介しようと思う。
例えば内部のモジュール間のやり取りに使われる内部コマンドのビット幅が足りなくなったので拡張するとしよう。
各モジュールで定義されているビット幅を全部書き換えるのは大変だ。直し忘れも出るかもしれない。そういうことがあるので私は定数を文字列で置き換えている。ちょうどC言語でdefineで置き換えるようなものである。
constant GLOBAL_CMD_WIDTH : integer := 29;
このコンスタント文はentityのport宣言文のところでも使用したいので、packageにまとめておいて、VHDLファイルのentityの前でUSEしている。
私はpackageとpackage bodyは1つのVHDLファイルにしている。それは以下のようなものである。

library ieee;
use ieee.std_logic_1164.all;

package cmd_global_def_pack is
 constant GLOBAL_CMD_WIDTH : integer := 29;
 constant MAX_LOCAL_CMD_WIDTH : integer := 32; -- ローカルコマンドの最大幅
 constant NETWORK_BUFFER : std_logic_vector := "001";
.......
 function ExtractDevId( global_cmd : std_logic_vector
  ) return std_logic_vector;
.......
end package cmd_global_def_pack;
package body cmd_global_def_pack is
 -- global commandの各パートを抽出する
 function ExtractDevId( global_cmd : std_logic_vector
  ) return std_logic_vector is
   variable dev_id : std_logic_vector(DEVICE_ID_WIDTH-1 downto 0);
 begin
  dev_id := global_cmd(DEVICE_ID_HIGH downto DEVICE_ID_LOW);
  return dev_id;
 end ExtractDevId;
.....
end cmd_global_def_pack;

これを別のVHDLファイルでUSEする。

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

library work;
use work.cmd_global_def_pack.all;
use work.cmd_lcon_def_pack.all;

entity lcon_write is
 port(
  clk, reset : in std_logic;

  global_cmd : in std_logic_vector(GLOBAL_CMD_WIDTH-1 downto 0); -- グローバルコマンド領域
  local_cmd : in std_logic_vector(LCNT_LOCAL_CMD_WIDTH-1 downto 0); -- ローカルコマンド領域
.....
end lcon_write;
architecture RTL of lcon_write is
.....
begin
 nb_write_hit <= '1' when cmd = '1' and (ExtractDevID(global_cmd)=NETWORK_BUFFER else '0';
.............
end RTL

上のnb_write_hitの文の意味はcmd='1'(コマンドが発行)されてExtractDevID(global_cmd)(global_cmdのDevIDフィールドを抽出したら)= NETWORK_BUFFER("001")だったらnb_write_hitを1にする。

なるべく後で変更しやすいようにVHDLを書いている。もっと過激にconstant文で回路構造を変えるように書いたこともあるが、それは次回にする。
  1. 2006年02月02日 23:09 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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