VHDLのプロセス文のイメージ

出典: Wikimura

目次

プロセス文の表す回路のI/O

プロセス文はプログラムのようだが、実体は論理回路であることに注意する。

プロセス文の表す論理回路は、内部の信号代入文の左辺値(代入される側)を出力、右辺値(代入する側)を入力とする。

例えば以下の記述は、入力信号(A,B)、出力信号(X)という回路を表す。

process( A, B)
begin
    if( A = '1') then
        X <= B;
    else
        X <= 0;
    end if;
end process;

なお、右辺値になる信号は全てセンシティビティリストに列挙しなくてはならない。 論理合成ツールは、センシティビティリストが欠けていても大抵合成できてしまう。 ただ、余計な回路が作られるかもしれない。 シミュレーションツールは誤作動を起こすことがある。(回路が正しくてもシミュレーションは良く分からない動作をすることにつながる)


プロセス文の表す回路

プロセス文は入力信号が変化すると、あたかも命令が順番に実行されたかのように出力信号を変化させる。 これはデジタル信号の変化なので、入力の変化から出力の変化までは一瞬(回路のディレイはあるが)である。

process( A, B, S)
begin
    if( S = '1') then
        X <= A;
    else
        X <= B;
    end if;
end process;

例えばプログラム的なイメージでいうと以下のように見えるが...

  1. A: '0' -> '1' という変化が起こる
  2. プロセス文起動
  3. A = '1' が真なので X に Bを代入


実際には以下のような論理回路(セレクタ)になる。

      +-----+
A ----|     |
      |     |---- X
B ----|     |
      | SEL |
      +--+--+
         |
S -------+

同時処理とは...

プロセス文は1つの回路を表すので、並列して存在するプロセス文は、並列して存在する回路を表す。

プログラムに見立てると、全てのプロセス文が同時に、並列に動作するイメージがある。 ただ、実体は回路が存在しているだけ。並列に動作するのは当然ということ。

同時処理文と言うのは、プログラム的に見たときに「同時に並列して動作している」というイメージがあるから付いた名前だと思う。

process( A, B, S)
begin
    if( S = '1') then
        X <= A;
    else
        X <= B;
    end if;
end process;

process( X, Y, T)
begin
    if( T = '1') then
        Z <= X;
    else
        Z <= Y;
    end if;
end process;

この場合は2つのセレクタが存在する。上のプロセス文は左のセレクタを表し、下のプロセス文は右のセレクタを表す。 これらは共通の信号Xで結ばれている。

プログラム的なイメージでは以下のようになるが...(実際、シミュレータの中ではこんな処理なのだろうけど)

  • Aが変化
  • プロセス文(上)が起動
  • Xが変化
  • プロセス文(下)が起動
  • Zが変化
      +-----+           
A ----|     |           +-----+
      |     |---- X ----|     |
B ----|     |           |     |---- Z
      | SEL |     Y ----|     |
      +--+--+           | SEL |
         |              +--+--+
S -------+                 |
                  T -------+

ラッチができるとき

よくレジスタやラッチの記述のサンプルで、以下のようなif文がある。 このif以下で書かれた出力信号(プロセス文の出力信号 = 信号代入されるもの)には、全てラッチが付けられる。

if( clk'event and clk = '1') 立ち上がりエッジ
if( clk'event and clk = '0') 立下りエッジ


例えば以下の記述はトリガラッチを作る。ラッチの入力はA、出力はX、トリガはclkになる。

if( clk'event and clk = '1') then
    X <= A;
end if;

     +-----+
     |     |
A ---|D   Q|--- X
     |     |
     +--^--+
        |
clk ----+

この文は日本語に置き換えると以下のようになる。

  • 信号clkが立ち上がりエッジになったときに、信号Xを信号Aの値にする
  • それ以外(エッジ以外)では何もしない...前の値を保持する

論理合成ツールは「何もしない」を「値を保持する」と解釈するらしい。 そのため、立ち上がりエッジの時のみ 信号X に値を反映する = それ以外は保持する = レジスタになるということ。


同様の理由で、elseのないif文はトランスペアレントラッチを作る。(VHDLのif文でelseが無い場合‎に書いた)

if( L = '1') then
    X <= A;
end if;

     +-----+
     |     |
A ---|D   Q|--- X
     |     |
     +--+--+
        |
L ------+