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

VHDL で信号ベクトルを作成する方法:std_logic_vector

std_logic_vector タイプは、VHDL で信号バスを作成するために使用できます。 std_logic は VHDL で最も一般的に使用される型であり、std_logic_vector はその配列バージョンです。

std_logic は、1 本のワイヤで運べる値をモデル化するのに最適ですが、コンポーネントに出入りするワイヤのコレクションを実装するのはあまり実用的ではありません。 std_logic_vector 複合型です。つまり、サブ要素のコレクションです。 std_logic_vector のシグナルまたは変数 type には任意の数の std_logic を含めることができます

このブログ投稿は、基本的な VHDL チュートリアル シリーズの一部です。

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 バスの範囲の方向、基本的にそのエンディアンを指定します。どちらも同様にうまく機能しますが、VHDL 設計者が downto を使用してベクトルを宣言するのが最も一般的です。 .したがって、常に downto を使用することをお勧めします 混乱を避けるためにビットベクトルを宣言するとき。

バイトを保持できるベクトル信号を宣言するための VHDL コード:
signal MySlv : std_logic_vector(7 downto 0);

1 ビットを保持できるベクトル信号を宣言するための VHDL コード:
signal MySlv : std_logic_vector(0 downto 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

    -- Shift register
    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 の波形ウィンドウ:

分析

この演習では、6 つの std_logic_vector を宣言しました バス、それぞれ 8 ビット長 (1 バイト)。

シグナル Slv1 初期値なしで宣言されました。波形のスクリーンショットでは、値が XX のバスが表示されます。これは、バスに表示される値が 16 進数であり、XX が非 16 進数であることを示しているためです。しかし、波形のバスを拡大すると、個々のビットが実際に U であることがわかりました。

信号 Slv2 すべて 0 の初期値を使用して宣言されました。各ビットの正確な値を指定する代わりに、(other => '0') を使用しました 初期値の代わりに。これは集計と呼ばれます 割り当て。重要な部分は、ベクター内のすべてのビットを、指定した長さに関係なく設定することです。

信号 Slv3 すべてのビットに 1 の初期値を与えるために集約代入を使用して宣言されました。波形でこの信号に FF が表示されていることがわかります。これは 8 つの 1 の 16 進数です。

信号 Slv4 16 進数 AA で指定された初期値で宣言されました。各 16 進数は 4 ビット長であるため、8 ビット長のベクトルに 2 桁 (AA) を指定する必要があります。

信号 Slv5 Slv4 とまったく同じ初期値を宣言します でしたが、ここではバイナリ値 10101010 として指定しました。波形から、両方の信号が 16 進値 AA を持っていることがわかります。

シグナル Slv6 '1' だった右端のビットを除いて、すべてゼロの初期値で宣言されました . シフト レジスタを作成するプロセスを使用しました この信号から。シフト レジスタは、名前が示すように、ベクトルの内容を 10 ナノ秒ごとに 1 桁左にシフトします。

このプロセスは 10 ns ごとにウェイクアップし、For ループはベクトル内のすべてのビットを 1 桁左にシフトします。最終ビットは Slv6(Slv6'right) <= Slv6(Slv6'left); によって最初のインデックスに戻されます 声明。波形では '1' を確認できます ベクトルを波及します。

これは、'1' がどのように機能するかを視覚化したものです。 シフト レジスタを介して伝播します。

'left' を使用して と 'right 属性、コードをより一般的なものにしました。 Sig6 の幅を変更すると 、プロセスは引き続き機能します。値をハードコーディングする代わりに、可能な場合は属性を使用することをお勧めします。

使用できる属性が他にもあるのではないかと思うかもしれません。これらは高度な VHDL 機能であると考えているため、このチュートリアル シリーズでは詳しく説明しません。

テイクアウト

基本的な VHDL クイズに答える – パート 2 »
または
次のチュートリアルに進む »


VHDL

  1. VHDL 変換の例
  2. VHDL での符号付きと符号なし
  3. VHDL で文字列のリストを作成する方法
  4. VHDL コード ロック モジュール用の Tcl 駆動型テストベンチを作成する方法
  5. VHDL テストベンチでシミュレーションを停止する方法
  6. VHDL で PWM コントローラーを作成する方法
  7. VHDL で乱数を生成する方法
  8. VHDL でリング バッファー FIFO を作成する方法
  9. セルフチェック テストベンチの作成方法
  10. VHDL でリンク リストを作成する方法
  11. VHDL のプロセスでプロシージャを使用する方法