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

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

FPGAの部屋

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

std_logic_arith から numeric_std へ(VHDL)

VHDLで今までは、下のようにパッケージを呼び出して CONV_INTEGER や CONV_STD_LOGIC_VECTOR を呼び出して変換を行なってきた。

LIBRARY ieee;
USE ieee.std_logic_1164.ALL;
use ieee.std_logic_unsigned.all;
use ieee.std_logic_arith.all;


遅まきながら、ISEのテンプレートもnumeric_std になったことだし、これからは numeric_std パッケージを使っていこうと思う。

library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;


CONV_INTEGER や CONV_STD_LOGIC_VECTOR に代わるものは何か?と検索すると、Xilinxのアンサー”VHDL で STD_LOGIC_VECTOR を整数に変換する方法”が引っかかった。それによると、CONV_INTEGER は TO_INTEGER に置き換わるそうだ。アンサーは UNSIGNED の時の返り値が INTEGER になっているが、Xilinx\14.4\ISE_DS\ISE\vhdl\src\ieee\numeric_std.vhd では、NATURAL だった。下に示す。

function TO_INTEGER (ARG: UNSIGNED) return NATURAL;
function TO_INTEGER (ARG: SIGNED) return INTEGER;


CONV_STD_LOGIC_VECTOR に代わるものとしては、TO_UNSIGNED と TO_SIGNED があるようだ。

function TO_UNSIGNED (ARG, SIZE: NATURAL) return UNSIGNED;
function TO_SIGNED (ARG: INTEGER; SIZE: NATURAL) return SIGNED;


STD_LOGIC_VECTOR に変換する際には、STD_LOGIC_VECTOR(ARG: UNSIGNED), STD_LOGIC_VECTOR(ARG: SIGNED) とすれば良い。(参考、”unsinedとstd_logic_vector”FPGA BBS)
numeric_std.vhd を見ていると面白い。色々な関数がある。演算子のオーバーロードを見ると、

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


がある。val + 8 とか大丈夫のようだ。但し、UNSIGNEDなので、すべてSTD_LOGIC_VECTORで定義してある場合は、STD_LOGIC_VECTOR(UNSIGNED(val) + 8) だと思う。
同様にSIGNED も演算子のオーバーロードがある。

function "+" (L: INTEGER; R: SIGNED) return SIGNED;
function "+" (L: SIGNED; R: INTEGER) return SIGNED;


numeric_std.vhd を見ているととっても興味深く面白い。
rem も演算子にあるんだな? mod とどう違うんだろう?

(追加)
ツイッターで教えてもらったのだが、remはremainder,modはmoduloだそうだ。

教えて!goo マイナスの割り算の公式”のNo.3ベストアンサー20pt と”VHDL 基礎”の”関係演算子、加法演算子、乗法演算子、シフト演算子、その他演算子”のmod, rem の項で勉強させてもらった。つまり数直線上で2つの演算子の符号が違っている時に、どちらから元の値に戻るかが違うようだ。
(A mod B) = C とすると |C|< |B|、かつ B と C は同じ符号を取る。
(A rem B) = C とすると |C| < |B|、かつ A と C は同じ符号を取る。
Re: VHDL - Unterschied REM & MOD ?”を参考に例を示す。

7 mod 3 = 1     :3x2 +1 = 7
(-7) mod 3 = 2    :3x(-3) +2 = -7
7 mod (-3) = -2   :(-3)x(-3) -2 = 7
(-7) mod (-3) = -1  :(-3)x2 -1 = -7

7 rem 3 = 1     :3x2 +1 = 7
(-7) rem 3 = -1   :3x(-2) -1 = -7
7 rem (-3) = 1    :(-3)x(-2) +1 = 7
(-7) rem (-3) = -1  :(-3)x2 -1 = -7

  1. 2012年12月25日 05:50 |
  2. VHDLの書き方
  3. | トラックバック:0
  4. | コメント:0

コメント

コメントの投稿


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

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