工業製造
産業用モノのインターネット | 工業材料 | 機器のメンテナンスと修理 | 産業プログラミング |
home  MfgRobots >> 工業製造 >  >> Industrial programming >> VHDL

VHDL型変換完全ガイド:Numeric_StdとStd_Logic_Arithパッケージ活用

Numeric_StdとStd_Logic_Arithパッケージの両方を使用

以下に最も頻繁に使用されるVHDL型変換をまとめました。記事は2部構成:前半はモダンなnumeric_stdパッケージを用いた変換、後半はレガシーなstd_logic_arithパッケージを用いた同等の変換を示します。多くの設計者がまだstd_logic_arithを使用していますが、業界のベスト プラクティスは明確さと移植性の観点からnumeric_stdを推奨します。

多くの例でVHDL属性'lengthを使用しており、ベクトル幅の変更にコードが自動適応するため、再利用可能で保守しやすい設計の鍵となります。

Numeric_Stdを使用した変換例

Std_Logic_Arithを使用した変換例

Numeric_StdでIntegerからSignedへ変換

to_signed関数は2つの引数を取ります:変換する整数と希望のベクトル幅。'length属性を使うとコードが柔軟になります。

signal input_3 : integer; signal output_3 : signed(3 downto 0); output_3 <= to_signed(input_3, output_3'length);

Numeric_StdでIntegerからStd_Logic_Vectorへ変換

整数範囲が符号付きか無符号かを判断。正の値のみならto_unsigned、符号付きの可能性があるならto_signedを使用。両関数とも値と目標幅を受け取ります。

signal input_1 : integer; signal output_1a : std_logic_vector(3 downto 0); signal output_1b : std_logic_vector(3 downto 0); -- 正の整数のみ output_1a <= std_logic_vector(to_unsigned(input_1, output_1a'length)); -- 符号付き/無符号両対応 output_1b <= std_logic_vector(to_signed(input_1, output_1b'length));

Numeric_StdでIntegerからUnsignedへ変換

signal input_2 : integer; signal output_2 : unsigned(3 downto 0); output_2 <= to_unsigned(input_2, output_2'length);

Numeric_StdでStd_Logic_VectorからIntegerへ変換

まずベクトルをデータ意味論に応じてunsignedまたはsignedにキャストし、to_integerを適用。

signal input_4 : std_logic_vector(3 downto 0); signal output_4a : integer; signal output_4b : integer; -- 無符号の場合 output_4a <= to_integer(unsigned(input_4)); -- 符号付きの場合 output_4b <= to_integer(signed(input_4));

Numeric_StdでStd_Logic_VectorからSignedへ変換

signal input_6 : std_logic_vector(3 downto 0); signal output_6 : signed(3 downto 0); output_6 <= signed(input_6);

Numeric_StdでStd_Logic_VectorからUnsignedへ変換

signal input_5 : std_logic_vector(3 downto 0); signal output_5 : unsigned(3 downto 0); output_5 <= unsigned(input_5);

Numeric_StdでSignedからIntegerへ変換

signal input_10 : signed(3 downto 0); signal output_10 : integer; output_10 <= to_integer(input_10);

Numeric_StdでSignedからStd_Logic_Vectorへ変換

signal input_11 : signed(3 downto 0); signal output_11 : std_logic_vector(3 downto 0); output_11 <= std_logic_vector(input_11);

Numeric_StdでSignedからUnsignedへ変換

signal input_12 : signed(3 downto 0); signal output_12 : unsigned(3 downto 0); output_12 <= unsigned(input_12);

Numeric_StdでUnsignedからIntegerへ変換

signal input_7 : unsigned(3 downto 0); signal output_7 : integer; output_7 <= to_integer(input_7);

Numeric_StdでUnsignedからSignedへ変換

signal input_9 : unsigned(3 downto 0); signal output_9 : signed(3 downto 0); output_9 <= signed(input_9);

Numeric_StdでUnsignedからStd_Logic_Vectorへ変換

signal input_8 : unsigned(3 downto 0); signal output_8 : std_logic_vector(3 downto 0); output_8 <= std_logic_vector(input_8);

Std_Logic_ArithでIntegerからSignedへ変換

signal input_3 : integer; signal output_3 : signed(3 downto 0); output_3 <= conv_signed(input_3, output_3'length);

Std_Logic_ArithでIntegerからStd_Logic_Vectorへ変換

signal input_1 : integer; signal output_1 : std_logic_vector(3 downto 0); output_1 <= conv_std_logic_vector(input_1, output_1'length);

Std_Logic_ArithでIntegerからUnsignedへ変換

signal input_2 : integer; signal output_2 : unsigned(3 downto 0); output_2 <= conv_unsigned(input_2, output_2'length);

Std_Logic_ArithでStd_Logic_VectorからIntegerへ変換

signal input_4 : std_logic_vector(3 downto 0); signal output_4a : integer; signal output_4b : integer; -- 無符号の場合 output_4a <= conv_integer(unsigned(input_4)); -- 符号付きの場合 output_4b <= conv_integer(signed(input_4));

Std_Logic_ArithでStd_Logic_VectorからSignedへ変換

signal input_6 : std_logic_vector(3 downto 0); signal output_6 : signed(3 downto 0); output_6 <= signed(input_6);

Std_Logic_ArithでStd_Logic_VectorからUnsignedへ変換

signal input_5 : std_logic_vector(3 downto 0); signal output_5 : unsigned(3 downto 0); output_5 <= unsigned(input_5);

Std_Logic_ArithでSignedからIntegerへ変換

signal input_10 : signed(3 downto 0); signal output_10 : integer; output_10 <= conv_integer(input_10);

Std_Logic_ArithでSignedからStd_Logic_Vectorへ変換

signal input_11 : signed(3 downto 0); signal output_11 : std_logic_vector(3 downto 0); output_11 <= std_logic_vector(input_11);

Std_Logic_ArithでSignedからUnsignedへ変換

signal input_12 : signed(3 downto 0); signal output_12 : unsigned(3 downto 0); output_12 <= unsigned(input_12);

Std_Logic_ArithでUnsignedからIntegerへ変換

signal input_7 : unsigned(3 downto 0); signal output_7 : integer; output_7 <= conv_integer(input_7);

Std_Logic_ArithでUnsignedからSignedへ変換

signal input_9 : unsigned(3 downto 0); signal output_9 : signed(3 downto 0); output_9 <= signed(input_9);

Std_Logic_ArithでUnsignedからStd_Logic_Vectorへ変換

signal input_8 : unsigned(3 downto 0); signal output_8 : std_logic_vector(3 downto 0); output_8 <= std_logic_vector(input_8);


Most Popular Nandland Pages

VHDL

  1. VHDL入門:最初のANDゲートを作る
  2. VHDLプロシージャ例:std_logic_vectorのインクリメント
  3. VHDLレコードでクリーンかつ再利用可能なFIFOインターフェースを実現
  4. VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察
  5. VHDL変数の解説:実践例と信頼性設計のためのルール
  6. PSLによるVHDLモジュールの形式的検証マスター
  7. VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
  8. VHDLテストベンチ・シミュレーションを優雅に終了させる方法
  9. VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
  10. VHDLで乱数生成: 一様分布からOSVVMまで
  11. Tclベースのインタラクティブテストベンチでハードウェア検証を強化