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

VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察

デジタル設計者はFPGAやASIC内部で精密な算術演算に依存します。核心概念はVHDLにおけるsigned(符号付き)とunsigned(無符号)データ型の区別です。

両型はIEEEライブラリのnumeric_stdパッケージで定義されます。多くの設計者がまだstd_logic_arithを使っていますが、このパッケージはIEEE標準ではなく、本番設計での使用は推奨されません。

VHDLでは、signed信号は2の補数として解釈され、正負両方の値を表せます。unsigned信号は非負値のみ表現します。内部的には、FPGAは宣言した型に関わらず、すべてのビットベクトルに2の補数を使用します。

ビットUnsigned値Signed値
01133
01022
00111
00000
1117-1
1106-2
1015-3
1004-4

一見直感に反するように見えますが、2の補数を理解すれば振る舞いは予測可能です。

重要なのは、算術演算のバイナリ結果は、オペランドをsignedで宣言してもunsignedで宣言しても同一だということです。変わるのはその結果の解釈だけです。

例えば、2つの5ビットベクトルを加算:

 library ieee; use ieee.std_logic_1164.all; use ieee.numeric_std.all; entity signed_unsigned is port ( i_rst_l : in std_logic; i_clk : in std_logic; i_a : in std_logic_vector(4 downto 0); i_b : in std_logic_vector(4 downto 0) ); end signed_unsigned; architecture behave of signed_unsigned is signal rs_SUM_RESULT : signed(4 downto 0) := (others => '0'); signal ru_SUM_RESULT : unsigned(4 downto 0) := (others => '0'); signal rs_SUB_RESULT : signed(4 downto 0) := (others => '0'); signal ru_SUB_RESULT : unsigned(4 downto 0) := (others => '0'); begin p_SUM : process (i_clk, i_rst_l) begin if i_rst_l = '0' then rs_SUM_RESULT <= (others => '0'); ru_SUM_RESULT <= (others => '0'); elsif rising_edge(i_clk) then ru_SUM_RESULT <= unsigned(i_a) + unsigned(i_b); rs_SUM_RESULT <= signed(i_a) + signed(i_b); end if; end process p_SUM; p_SUB : process (i_clk, i_rst_l) begin if i_rst_l = '0' then rs_SUB_RESULT <= (others => '0'); ru_SUB_RESULT <= (others => '0'); elsif rising_edge(i_clk) then ru_SUB_RESULT <= unsigned(i_a) - unsigned(i_b); rs_SUB_RESULT <= signed(i_a) - signed(i_b); end if; end process p_SUB; end behave; 

テストベンチ

 library ieee; use ieee.std_logic_1164.all; entity example_signed_unsigned_tb is end example_signed_unsigned_tb; architecture behave of example_signed_unsigned_tb is signal r_CLK : std_logic := '0'; signal r_RST_L : std_logic := '0'; signal r_A : natural := 0; signal r_B : natural := 0; signal r_A_SLV : std_logic_vector(4 downto 0) := (others => '0'); signal r_B_SLV : std_logic_vector(4 downto 0) := (others => '0'); constant c_CLK_PERIOD : time := 10 ns; component example_signed_unsigned is port ( i_rst_l : in std_logic; i_clk : in std_logic; i_a : in std_logic_vector(4 downto 0); i_b : in std_logic_vector(4 downto 0) ); end component example_signed_unsigned; begin i_DUT: example_signed_unsigned port map ( i_rst_l => r_RST_L, i_clk => r_CLK, i_a => r_A_SLV, i_b => r_B_SLV ); clk_gen : process is begin r_CLK <= '0' after c_CLK_PERIOD/2, '1' after c_CLK_PERIOD; wait for c_CLK_PERIOD; end process clk_gen; process begin r_RST_L <= '0'; wait for 20 ns; r_RST_L <= '1'; wait for 20 ns; r_A_SLV <= "01001"; r_B_SLV <= "00110"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00110"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00001"; wait for 20 ns; r_A_SLV <= "10001"; r_B_SLV <= "00010"; wait for 20 ns; r_A_SLV <= "11111"; r_B_SLV <= "00001"; wait for 20 ns; r_A_SLV <= "00000"; r_B_SLV <= "00001"; wait for 20 ns; wait; end process; end behave; 
VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察

Modelsimシミュレーション波形 – 16進数値

VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察

Modelsimシミュレーション波形 – 10進数値

2枚のスクリーンショットが示す通り、型に関わらずバイナリ結果は同一です。違いはシミュレータの表示時のみ:16進では同じビットパターン、10進ではsigned結果が負に見えることがあります。FPGAロジック設計では慎重な型扱いが不可欠です。

不明点があれば、サイドバーの連絡先リンクからメールでご質問ください。signed/unsigned算術の習得をお手伝いします。

Most Popular Nandland Pages

VHDL

  1. 信号機:工学、歴史、未来の革新
  2. 電流信号システム:4-20mAループの解説
  3. 高速PCB設計における信号インテグリティ確保
  4. LoRaローカライゼーション:ネイティブ測位が見た目より複雑な理由
  5. VHDL入門:最初のANDゲートを作る
  6. VHDL型変換完全ガイド:Numeric_StdとStd_Logic_Arithパッケージ活用
  7. VHDLプロシージャ例:std_logic_vectorのインクリメント
  8. VHDLレコードでクリーンかつ再利用可能なFIFOインターフェースを実現
  9. VHDL変数の解説:実践例と信頼性設計のためのルール
  10. PSLによるVHDLモジュールの形式的検証マスター
  11. VHDLで文字列リストを作成する: ベスト・プラクティスと実装例