VHDLのstd_logic_vectorマスター:信号ベクトルの作成
std_logic_vector型は、VHDLで信号バスを定義する標準的な方法です。std_logicが単一ワイヤの状態をモデル化するのに対し、std_logic_vectorはそれをワイヤの配列に拡張し、マルチビットバスの表現を可能にします。
単一ビットのstd_logicとは異なり、std_logic_vectorは複合型であり、std_logic要素のインデックス付きコレクションです。任意のビット数を保持でき、マルチビットデータをやり取りするコンポーネント接続に最適です。
このブログ記事はBasic VHDL Tutorialsシリーズの一部です。
std_logic_vectorシグナルを以下の構文で宣言します:
signal <name> : std_logic_vector(<lsb> to <msb>) := <initial_value>;
または
signal <name> : std_logic_vector(<msb> downto <lsb>) := <initial_value>;
ここで<name>はユーザー選択識別子、<initial_value>は省略可能。<lsb>と<msb>はそれぞれ最下位・最上位ビットインデックスを表します。
toまたはdowntoキーワードは範囲の方向(エンディアン)を指定。両方動作しますが、多くの設計者は明確さのためdowntoを好みます。ビットベクトル宣言時には一貫してdowntoを使用することを推奨します。
バイトサイズベクトルのVHDLコード:
signal MySlv : std_logic_vector(7 downto 0);
1ビットベクトルのVHDLコード:
signal MySlv : std_logic_vector(0 downto 0);
空範囲(0ビット)のVHDLコード:
signal MySlv : std_logic_vector(-1 downto 0);
演習
このビデオチュートリアルでは、std_logic_vectorシグナルの宣言と初期値設定、For-Loopでベクトルのビットをイテレートしてシフトレジスタを作成する方法を学びます:
このチュートリアルで作成した最終コード:
library ieee;
use ieee.std_logic_1164.all;
entity T11_StdLogicVectorTb is
end entity;
architecture sim of T11_StdLogicVectorTb is
signal Slv1 : std_logic_vector(7 downto 0);
signal Slv2 : std_logic_vector(7 downto 0) := (others => '0');
signal Slv3 : std_logic_vector(7 downto 0) := (others => '1');
signal Slv4 : std_logic_vector(7 downto 0) := x"AA";
signal Slv5 : std_logic_vector(0 to 7) := "10101010";
signal Slv6 : std_logic_vector(7 downto 0) := "00000001";
begin
-- シフトレジスタプロセス
process is
begin
wait for 10 ns;
for i in Slv6'left downto Slv6'right + 1 loop
Slv6(i) <= Slv6(i-1);
end loop;
Slv6(Slv6'right) <= Slv6(Slv6'left);
end process;
end architecture;
ModelSim波形ウィンドウ(run押下後、タイムラインにズームイン):

分析
この演習では、それぞれ8ビット(1バイト)のstd_logic_vectorバスを6つ宣言しました。
Slv1は初期値なしで宣言。波形スクリーンショットでは16進表示が未知値を表せないためXXと表示。詳しく見ると個々のビットは実際にはUです。Slv2は集約代入(others => '0')で全ビットをゼロに設定。ベクトル幅に関わらず全要素に指定値を与える簡潔な構文です。Slv3も同じ集約技法で全ビットを1に初期化。波形ではFF(8個の1の16進)で表示。Slv4は16進初期化子AAをデモ。16進数1桁が4ビットに対応するため、2桁で8ビットベクトルをカバー。Slv5は同一値をバイナリ(10101010)で表現。Slv4とSlv5はともに波形でAAと表示。Slv6は最下位ビットのみ1、他はゼロで開始。10nsごとに1をベクトル内で循環させる左シフトレジスタをプロセスで実装。
プロセスはleftとright属性を活用しコードを汎用的に保っています。ベクトルサイズ変更時もコード修正不要です。
他にも属性は存在しますが、この入門チュートリアルの範囲外です。
まとめ
- Nビットベクトルは
std_logic_vector(N-1 downto 0)で宣言すべき。 - ベクトルは全体として代入可能、個別ビットにもアクセス可能。
- 全ビットゼロクリアは集約代入
(others => '0')で簡潔に。 'leftや'rightなどの属性使用でコードを汎用的かつ保守しやすく。
Basic VHDL Quiz – part 2 »
または
次のチュートリアルへ »
VHDL
- VHDL型変換完全ガイド:Numeric_StdとStd_Logic_Arithパッケージ活用
- VHDLにおけるSignedとUnsigned型の使い分け:実践的洞察
- VHDLで文字列リストを作成する: ベスト・プラクティスと実装例
- Tcl駆動テストベンチでVHDLコード・ロック・モジュールを検証する
- VHDLテストベンチ・シミュレーションを優雅に終了させる方法
- VHDLでPWMコントローラを実装: 設計、シミュレーション、FPGAデモ
- VHDLで乱数生成: 一様分布からOSVVMまで
- ブロックRAMにおける堅牢なVHDLリングバッファFIFOの設計
- VHDLで自己検証テストベンチを構築する実践ガイド
- VHDLで保護型とアクセスポインタを用いた動的リンクリスト実装
- プロセス内プロシージャでVHDLステートマシンをクリーンに設計