FC2カウンター FPGAの部屋 std_logic_arith から numeric_std へ2(実践編)
FC2ブログ

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

FPGAの部屋

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

std_logic_arith から numeric_std へ2(実践編)

std_logic_arith から numeric_std へ(VHDL)”で、std_logic_arith パッケージから numeric_std パッケージへの移行をしているが、たくさんエラーが出て大変な状況になっている。直しているのは、MT9D111のAXI4インターフェース回路のトップモジュールで、VHDLで書かれている。以前キャラクタをAXI4バス経由でDDR3 SDRAMのフレームバッファに書き込む回路モジュール、char_write_axi_master.vhd を書き換えている。

先ずは、すべての signal はstd_logic かstd_logic_vector で宣言してある。

1.std_logic_arith パッケージでは、if文でのsignalの定数との比較は、下のように書いたが

if write_count=0 and M_AXI_WREADY='1' then -- 終了


numeric_std パッケージでは、こう書いた。

if unsigned(write_count)=0 and M_AXI_WREADY='1' then -- 終了


numeric_std パッケージでは、unsigned と natural の "=" の演算が定義されている。

function "=" (L: UNSIGNED; R: NATURAL) return BOOLEAN;


std_logic_vector の write_count を unsigned に変換して、"=" の右辺の 0 は、naturalに変換して比較する。厳密に型を守って書くと、下の書き方になると思う。

if unsigned(write_count)=natural(0) and M_AXI_WREADY='1' then -- 終了



2.std_logic_arith パッケージでは、下のように書いたが

write_count <= write_count - 1;


numeric_std パッケージでは、こう書いた。

write_count <= std_logic_vector(unsigned(write_count) - 1);


これは、numeric_std パッケージの "-" の演算子が下のように定義されているからだ。

function "-" (L: UNSIGNED;R: NATURAL) return UNSIGNED;


厳密に型を守って書くと、下の書き方になると思う。

write_count <= std_logic_vector(unsigned(write_count) - natural(1));



3.ビット幅を変更する場合は、numeric_std パッケージでは、resize()を使うことができる。resize() はUNSIGNED, SINGED ともにビット幅を変更することが出来る。
使い方はXilinxのアンサーにも書いてある。”11.2 XST - 「ERROR:HDLCompiler:410 - ".vhd" Line xx: Expression has x elements; expected y」というエラー メッセージが表示される”を参照のこと。2つの数を足し算すると、2倍になる可能性があるので、1ピットだけビット幅が増える可能性がある。その時に、足し算する前の数は8ビットだが、足した結果が9ビットの場合に、足し算する前の数を8ビットから、resize() で9ビットにしてから足し算を行なっている。

FPGA BBSで知ったのだがVHDL Math Tricks of the Trade(PDF注意)を貼っておく。

numeric_std パッケージを使う時は、std_logic_vector を使うよりは、unsigned かsigned を使ったほうが良いと思う。
  1. 2012年12月31日 06:23 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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