VHDLのsigned/unsigned型マスター:実践ガイド
VHDLにおいて、signedとunsignedはデータバス上で算術演算を行える特殊なビットベクトルです。std_logic_vectorが信号配線に適しているのに対し、これらの型はコンパイラによって数値として解釈されます。
std_logic_vectorを加算しようとすると、コンパイルエラーNo feasible entries for infix operator "+"が発生します。ツールが生のビットパターンを数値としてどう扱うか判断できないためです。
Basic VHDL Tutorialsシリーズの一部。
算術を可能にするには、ベクトルをsignedまたはunsignedで宣言:
signal <name> : signed(<N-1> downto 0) := <initial_value>;
signal <name> : unsigned(<N-1> downto 0) := <initial_value>;
範囲はtoまたはdowntoどちらでも可ですが、downto 0が最も一般的。初期値は省略可能で、省略時は全ビット'U'になります。
なぜ従来のintegerよりsigned/unsignedを好むのか? デジタル設計者はビット幅を精密に制御する必要が多いためです。これらのベクトル型はオーバーフロー時にラップアラウンドしますが、integerは限界超過でランタイムエラーを発生させます。さらに、ベクトルは'U'や'X'などのメタ値を含められ、設計バグを早期発見できます。
ビデオデモンストレーション
付属ビデオでは、signedとunsigned信号がどのように類似し、どこで異なるかを探ります。
サンプルコード
library ieee;
use ieee.std_logic_1164.all;
use ieee.numeric_std.all;
entity T12_SignedUnsignedTb is
end entity;
architecture sim of T12_SignedUnsignedTb is
signal UnsCnt : unsigned(7 downto 0) := (others => '0');
signal SigCnt : signed(7 downto 0) := (others => '0');
signal Uns4 : unsigned(3 downto 0) := "1000";
signal Sig4 : signed(3 downto 0) := "1000";
signal Uns8 : unsigned(7 downto 0) := (others => '0');
signal Sig8 : signed(7 downto 0) := (others => '0');
begin
process is
begin
wait for 10 ns;
-- ラップアラウンドカウンタ
UnsCnt <= UnsCnt + 1;
SigCnt <= SigCnt + 1;
-- 信号加算
Uns8 <= Uns8 + Uns4;
Sig8 <= Sig8 + Sig4;
end process;
end architecture;
波形分析
ModelSim波形(主要イベントにズームイン)はすべての値を16進で表示:

カウンタ例では、UnsCntとSigCntともに0から始まり、FF(10進255)までインクリメント後、0にラップバック。同一のラップ動作を示します。
4ビット信号Uns4とSig4はともに二進1000を保持。これは符号なしで10進8、符号付き(2の補数)で-8です。
これら4ビット数を8ビットアキュムレータに加算すると、符号拡張が働きます。符号なし数はゼロでパディング、符号付き数は符号ビットでパディングされます。結果としてUns8は8増加、Sig8は8減少します。
符号拡張プロセスを視覚化:

重要なポイント
signedとunsignedはともに算術演算をサポートするベクトル型。- オーバーフローはサイレント。ビット幅に従い値がラップアラウンド。
- オペランド長が異なる加算では符号拡張により異なる結果を生む可能性あり。
次のチュートリアルで更なる洞察を得ます。
VHDL
- PIC18マイクロコントローラ:特徴、性能、使い方
- リファレンスデシグネータの理解:PCBアセンブリ接続をラベル付けする方法
- VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察
- プロセス内プロシージャでVHDLステートマシンをクリーンに設計
- VHDLにおける不純関数の活用:FSMの可読性と保守性向上
- VHDL関数マスター:効率的な設計のための実践ガイド
- VHDLプロシージャ活用:再利用可能なコードで設計をシンプルに
- VHDLで定数とジェネリックマップを活用し柔軟なモジュール設計を実現
- VHDLポートマップインスタンス化マスター:実践ガイド
- VHDLのCase-When文マスター:効率的なマルチプレクサ設計
- 無料VHDLシミュレータ&エディタ導入ガイド:学生向けステップバイステップ